瀏覽代碼

seata源码改造代码上传初始化

lengfaqiang 2 年之前
父節點
當前提交
b3222b3dd3
共有 100 個文件被更改,包括 15229 次插入10 次删除
  1. 288 0
      .flattened-pom.xml
  2. 3 0
      .gitattributes
  3. 50 9
      .gitignore
  4. 86 0
      .licenserc.yaml
  5. 二進制
      .mvn/wrapper/maven-wrapper.jar
  6. 1 0
      .mvn/wrapper/maven-wrapper.properties
  7. 29 0
      .travis.yml
  8. 11 0
      CHANGELOG.md
  9. 76 0
      CODE_OF_CONDUCT.md
  10. 204 0
      CONTRIBUTING.md
  11. 204 0
      CONTRIBUTING_CN.md
  12. 218 0
      LICENSE
  13. 5 0
      NOTICE
  14. 316 1
      README.md
  15. 165 0
      SOURCE_MODIFICATION.md
  16. 751 0
      all/.flattened-pom.xml
  17. 771 0
      all/dependency-reduced-pom.xml
  18. 738 0
      all/pom.xml
  19. 218 0
      all/target/classes/LICENSE
  20. 3 0
      all/target/maven-archiver/pom.properties
  21. 二進制
      all/target/original-seata-all-1.6.1.jar
  22. 二進制
      all/target/seata-all-1.6.1-sources.jar
  23. 二進制
      all/target/seata-all-1.6.1.jar
  24. 368 0
      bom/.flattened-pom.xml
  25. 370 0
      bom/pom.xml
  26. 325 0
      build/.flattened-pom.xml
  27. 404 0
      build/pom.xml
  28. 5 0
      changeVersion.sh
  29. 177 0
      changes/en-us/1.4.2.md
  30. 326 0
      changes/en-us/1.5.0.md
  31. 91 0
      changes/en-us/1.5.2.md
  32. 151 0
      changes/en-us/1.6.0.md
  33. 49 0
      changes/en-us/1.6.1.md
  34. 46 0
      changes/en-us/2.0.0.md
  35. 22 0
      changes/en-us/develop.md
  36. 176 0
      changes/zh-cn/1.4.2.md
  37. 315 0
      changes/zh-cn/1.5.0.md
  38. 92 0
      changes/zh-cn/1.5.2.md
  39. 153 0
      changes/zh-cn/1.6.0.md
  40. 49 0
      changes/zh-cn/1.6.1.md
  41. 46 0
      changes/zh-cn/2.0.0.md
  42. 22 0
      changes/zh-cn/develop.md
  43. 25 0
      codecov.yml
  44. 55 0
      common/.flattened-pom.xml
  45. 44 0
      common/pom.xml
  46. 867 0
      common/src/main/java/io/seata/common/ConfigurationKeys.java
  47. 169 0
      common/src/main/java/io/seata/common/Constants.java
  48. 284 0
      common/src/main/java/io/seata/common/DefaultValues.java
  49. 30 0
      common/src/main/java/io/seata/common/LockStrategyMode.java
  50. 100 0
      common/src/main/java/io/seata/common/XID.java
  51. 68 0
      common/src/main/java/io/seata/common/exception/DataAccessException.java
  52. 52 0
      common/src/main/java/io/seata/common/exception/EurekaRegistryException.java
  53. 284 0
      common/src/main/java/io/seata/common/exception/FrameworkErrorCode.java
  54. 161 0
      common/src/main/java/io/seata/common/exception/FrameworkException.java
  55. 59 0
      common/src/main/java/io/seata/common/exception/NotSupportYetException.java
  56. 82 0
      common/src/main/java/io/seata/common/exception/RedisException.java
  57. 52 0
      common/src/main/java/io/seata/common/exception/ShouldNeverHappenException.java
  58. 36 0
      common/src/main/java/io/seata/common/exception/SkipCallbackWrapperException.java
  59. 82 0
      common/src/main/java/io/seata/common/exception/StoreException.java
  60. 35 0
      common/src/main/java/io/seata/common/executor/Callback.java
  61. 30 0
      common/src/main/java/io/seata/common/executor/Initialize.java
  62. 53 0
      common/src/main/java/io/seata/common/holder/ObjectHolder.java
  63. 80 0
      common/src/main/java/io/seata/common/io/FileLoader.java
  64. 657 0
      common/src/main/java/io/seata/common/loader/EnhancedServiceLoader.java
  65. 81 0
      common/src/main/java/io/seata/common/loader/EnhancedServiceNotFoundException.java
  66. 91 0
      common/src/main/java/io/seata/common/loader/ExtensionDefinition.java
  67. 51 0
      common/src/main/java/io/seata/common/loader/LoadLevel.java
  68. 34 0
      common/src/main/java/io/seata/common/loader/Scope.java
  69. 93 0
      common/src/main/java/io/seata/common/rpc/RpcStatus.java
  70. 91 0
      common/src/main/java/io/seata/common/thread/NamedThreadFactory.java
  71. 45 0
      common/src/main/java/io/seata/common/thread/PositiveAtomicCounter.java
  72. 49 0
      common/src/main/java/io/seata/common/thread/RejectedPolicies.java
  73. 111 0
      common/src/main/java/io/seata/common/util/ArrayUtils.java
  74. 153 0
      common/src/main/java/io/seata/common/util/BeanUtils.java
  75. 107 0
      common/src/main/java/io/seata/common/util/BlobUtils.java
  76. 333 0
      common/src/main/java/io/seata/common/util/CollectionUtils.java
  77. 93 0
      common/src/main/java/io/seata/common/util/CompressUtil.java
  78. 138 0
      common/src/main/java/io/seata/common/util/ConfigTools.java
  79. 107 0
      common/src/main/java/io/seata/common/util/CycleDependencyHandler.java
  80. 89 0
      common/src/main/java/io/seata/common/util/DurationUtil.java
  81. 48 0
      common/src/main/java/io/seata/common/util/IOUtil.java
  82. 187 0
      common/src/main/java/io/seata/common/util/IdWorker.java
  83. 35 0
      common/src/main/java/io/seata/common/util/LambdaUtils.java
  84. 213 0
      common/src/main/java/io/seata/common/util/LowerCaseLinkHashMap.java
  85. 105 0
      common/src/main/java/io/seata/common/util/MapUtil.java
  86. 267 0
      common/src/main/java/io/seata/common/util/NetUtil.java
  87. 63 0
      common/src/main/java/io/seata/common/util/NumberUtils.java
  88. 160 0
      common/src/main/java/io/seata/common/util/PageUtil.java
  89. 731 0
      common/src/main/java/io/seata/common/util/ReflectionUtil.java
  90. 60 0
      common/src/main/java/io/seata/common/util/SizeUtil.java
  91. 107 0
      common/src/main/java/io/seata/common/util/StringFormatUtils.java
  92. 352 0
      common/src/main/java/io/seata/common/util/StringUtils.java
  93. 62 0
      common/src/test/java/io/seata/common/BranchDO.java
  94. 79 0
      common/src/test/java/io/seata/common/XIDTest.java
  95. 58 0
      common/src/test/java/io/seata/common/exception/DataAccessExceptionTest.java
  96. 47 0
      common/src/test/java/io/seata/common/exception/EurekaRegistryExceptionTest.java
  97. 153 0
      common/src/test/java/io/seata/common/exception/FrameworkExceptionTest.java
  98. 103 0
      common/src/test/java/io/seata/common/exception/Message.java
  99. 52 0
      common/src/test/java/io/seata/common/exception/NotSupportYetExceptionTest.java
  100. 52 0
      common/src/test/java/io/seata/common/exception/ShouldNeverHappenExceptionTest.java

+ 288 - 0
.flattened-pom.xml

@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>io.seata</groupId>
+		<artifactId>seata-build</artifactId>
+		<version>1.6.1</version>
+	</parent>
+	<artifactId>seata-parent</artifactId>
+	<packaging>pom</packaging>
+	<name>Seata Parent POM 1.6.1</name>
+	<description>parent for Seata built with Maven</description>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-dependencies</artifactId>
+				<version>1.6.1</version>
+				<type>pom</type>
+				<scope>import</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+	<dependencies>
+		<dependency>
+			<groupId>org.junit.jupiter</groupId>
+			<artifactId>junit-jupiter</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.junit.platform</groupId>
+			<artifactId>junit-platform-launcher</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-core</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-junit-jupiter</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.assertj</groupId>
+			<artifactId>assertj-core</artifactId>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-simple</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+	<build>
+		<extensions>
+			<extension>
+				<groupId>kr.motd.maven</groupId>
+				<artifactId>os-maven-plugin</artifactId>
+				<version>${os-maven-plugin.version}</version>
+			</extension>
+		</extensions>
+		<plugins>
+			<plugin>
+				<artifactId>maven-source-plugin</artifactId>
+				<version>${maven-source-plugin.version}</version>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>jar-no-fork</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-pmd-plugin</artifactId>
+				<version>${maven-pmd-plugin.version}</version>
+				<executions>
+					<execution>
+						<phase>verify</phase>
+						<goals>
+							<goal>check</goal>
+						</goals>
+					</execution>
+				</executions>
+				<dependencies>
+					<dependency>
+						<groupId>com.alibaba.p3c</groupId>
+						<artifactId>p3c-pmd</artifactId>
+						<version>${p3c-pmd.version}</version>
+					</dependency>
+				</dependencies>
+				<configuration>
+					<sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
+					<minimumPriority>2</minimumPriority>
+					<printFailingErrors>true</printFailingErrors>
+					<rulesets>
+						<ruleset>rulesets/java/ali-comment.xml</ruleset>
+						<ruleset>rulesets/java/ali-concurrent.xml</ruleset>
+						<ruleset>rulesets/java/ali-constant.xml</ruleset>
+						<ruleset>rulesets/java/ali-exception.xml</ruleset>
+						<ruleset>rulesets/java/ali-flowcontrol.xml</ruleset>
+						<ruleset>rulesets/java/ali-naming.xml</ruleset>
+						<ruleset>rulesets/java/ali-oop.xml</ruleset>
+						<ruleset>rulesets/java/ali-orm.xml</ruleset>
+						<ruleset>rulesets/java/ali-other.xml</ruleset>
+						<ruleset>rulesets/java/ali-set.xml</ruleset>
+					</rulesets>
+					<excludes>
+						<exclude>**/generated/*.java</exclude>
+						<exclude>**/antlr/mysql/parser/*.*</exclude>
+						<exclude>**/antlr/mysql/antlr/*.*</exclude>
+						<exclude>**/antlr/mysql/stream/ANTLRNoCaseStringStream.java</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+				<version>${jacoco-maven-plugin.version}</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>prepare-agent</goal>
+						</goals>
+					</execution>
+					<execution>
+						<id>report</id>
+						<phase>test</phase>
+						<goals>
+							<goal>report</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>${maven-surefire-plugin.version}</version>
+				<configuration>
+					<argLine>${maven.surefire.argLine}</argLine>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<profiles>
+		<profile>
+			<id>licenseCheck</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>license-maven-plugin</artifactId>
+						<executions>
+							<execution>
+								<id>license-check</id>
+								<phase>generate-sources</phase>
+								<goals>
+									<goal>add-third-party</goal>
+								</goals>
+								<configuration>
+									<includeOptional>false</includeOptional>
+									<useMissingFile>false</useMissingFile>
+									<failOnMissing>false</failOnMissing>
+									<licenseMerges>
+										<licenseMerge>Apache License, Version 2.0|The Apache Software License, Version
+                                            2.0|ASF 2.0|Apache 2|Apache-2.0|Apache 2.0 License|Apache 2.0|Apache License v2.0|Apache License 2.0|The Apache License, Version 2.0|The Apache Software License, Version 2.0</licenseMerge>
+										<licenseMerge>The MIT License|MIT License</licenseMerge>
+										<licenseMerge>The 3-Clause BSD License|New BSD License|3-Clause BSD
+                                            License|BSD|3-Clause BSD License|The New BSD License</licenseMerge>
+									</licenseMerges>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<id>image</id>
+			<properties>
+				<dependencies.copy.skip>false</dependencies.copy.skip>
+				<image.publish.skip>false</image.publish.skip>
+				<image.tags>latest</image.tags>
+				<mysql.jdbc.version>5.1.35</mysql.jdbc.version>
+				<mysql8.jdbc.version>8.0.27</mysql8.jdbc.version>
+			</properties>
+		</profile>
+		<profile>
+			<id>release-image</id>
+			<properties>
+				<image.tags>${project.version},latest</image.tags>
+			</properties>
+		</profile>
+		<profile>
+			<id>arrch64</id>
+			<properties>
+				<os.detected.classifier>osx-x86_64</os.detected.classifier>
+			</properties>
+		</profile>
+		<profile>
+			<id>checkstyle</id>
+			<activation>
+				<jdk>[1.8,)</jdk>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>com.mycila</groupId>
+						<artifactId>license-maven-plugin</artifactId>
+						<version>3.0</version>
+						<executions>
+							<execution>
+								<phase>generate-sources</phase>
+								<goals>
+									<goal>remove</goal>
+									<goal>format</goal>
+								</goals>
+								<configuration>
+									<quiet>true</quiet>
+									<header>E:\JetReporstory\kw\seata/style/copyright</header>
+									<includes>
+										<include>**/src/main/java/**</include>
+										<include>**/src/test/java/**</include>
+									</includes>
+									<excludes>
+										<exclude>**/generated/**</exclude>
+										<exclude>**/antlr/mysql/parser/*.*</exclude>
+										<exclude>**/antlr/mysql/antlr/*.*</exclude>
+										<exclude>**/antlr/mysql/stream/ANTLRNoCaseStringStream.java</exclude>
+									</excludes>
+									<strictCheck>true</strictCheck>
+									<mapping>
+										<java>SLASHSTAR_STYLE</java>
+									</mapping>
+								</configuration>
+							</execution>
+						</executions>
+						<configuration>
+							<quiet>true</quiet>
+							<header>E:\JetReporstory\kw\seata/style/copyright</header>
+							<includes>
+								<include>**/src/main/java/**</include>
+								<include>**/src/test/java/**</include>
+							</includes>
+							<excludes>
+								<exclude>**/generated/**</exclude>
+								<exclude>**/antlr/mysql/parser/*.*</exclude>
+								<exclude>**/antlr/mysql/antlr/*.*</exclude>
+								<exclude>**/antlr/mysql/stream/ANTLRNoCaseStringStream.java</exclude>
+							</excludes>
+							<strictCheck>true</strictCheck>
+							<mapping>
+								<java>SLASHSTAR_STYLE</java>
+							</mapping>
+						</configuration>
+					</plugin>
+					<plugin>
+						<artifactId>maven-checkstyle-plugin</artifactId>
+						<version>3.1.1</version>
+						<executions>
+							<execution>
+								<id>validate</id>
+								<phase>validate</phase>
+								<goals>
+									<goal>checkstyle</goal>
+								</goals>
+								<configuration>
+									<configLocation>E:\JetReporstory\kw\seata/style/seata_checkstyle.xml</configLocation>
+									<suppressionsLocation>E:\JetReporstory\kw\seata/style/seata_suppressions.xml</suppressionsLocation>
+									<encoding>UTF-8</encoding>
+									<consoleOutput>true</consoleOutput>
+									<failsOnError>true</failsOnError>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+			<properties>
+				<os.detected.arch>x86_64</os.detected.arch>
+				<os.detected.classifier>windows-x86_64</os.detected.classifier>
+				<os.detected.name>windows</os.detected.name>
+			</properties>
+		</profile>
+	</profiles>
+</project>

+ 3 - 0
.gitattributes

@@ -0,0 +1,3 @@
+*.js linguist-language=java
+*.css linguist-language=java
+*.html linguist-language=java

+ 50 - 9
.gitignore

@@ -1,14 +1,55 @@
-# ---> Java
+# maven ignore
+target/
+*.jar
+*.war
+*.zip
+*.tar
+*.tar.gz
 *.class
+.flattened-pom.xml
+dependency-reduced-pom.xml
 
-# Mobile Tools for Java (J2ME)
-.mtj.tmp/
+# eclipse ignore
+.settings/
+.project
+.classpath
 
-# Package Files #
-*.jar
-*.war
-*.ear
+# idea ignore
+.idea/
+*.ipr
+*.iml
+*.iws
+
+# temp ignore
+*.log
+*.cache
+*.diff
+*.patch
+*.tmp
+/distribution/bin/
+/distribution/conf/
+/distribution/lib/
+/distribution/ext/
+/distribution/logs/
+/distribution/*/bin/
+/distribution/*/conf/
+/distribution/*/lib/
+/distribution/*/logs/
+/distribution/*/ext/
+/server/*root.*
+/server/.root.*
+/server/sessionStore/
+/server/db_store/
+/sessionStore/
+/test/sessionStore/
+/distribution/sessionStore/
+/distribution/*/sessionStore/
+/file_store/
 
-# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
-hs_err_pid*
+# system ignore
+.DS_Store
+Thumbs.db
+*.orig
 
+#h2
+*.db

+ 86 - 0
.licenserc.yaml

@@ -0,0 +1,86 @@
+#
+# Copyright 1999-2019 Seata.io Group.
+#
+# Licensed 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.
+#
+header:
+  license:
+    spdx-id: Apache-2.0
+    copyright-owner: Seata.io
+    content: |
+      Copyright 1999-2019 Seata.io Group.
+    
+      Licensed 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.
+
+  paths-ignore:
+    - '.gitignore'
+    - '.gitattributes'
+    - '.travis.yml'
+    - 'codecov.yml'
+    - 'CONTRIBUTING.md'
+    - 'CONTRIBUTING_CN.md'
+    - 'CODE_OF_CONDUCT.md'
+    - 'README.md'
+    - 'LICENSE'
+    - 'NOTICE'
+    - '**/*.md'
+    - '.github/**'
+    #SPI、spring.factories、spring-configuration-metadata.json、additional-spring-configuration-metadata.json
+    - '**/src/test/resources/META-INF/**'
+    - '**/src/main/resources/META-INF/**'
+    - '**/target/**'
+    - '**/*.iml'
+    - 'mvnw'
+    - 'mvnw.cmd'
+    - '*.sh'
+    - 'changes/**'
+    - 'style/**'
+    - 'script/**'
+    - 'seata-plugins/**'
+    - '.mvn/**'
+    - 'sessionStore/**'
+    - 'distribution/LICENSE-BIN'
+    - 'distribution/NOTICE-BIN'
+    - 'test/src/test/resources/**'
+    - 'serializer/seata-serializer-protobuf/src/main/resources/protobuf/io/seata/protocol/transcation/*.proto'
+    - 'saga/seata-saga-statemachine-designer/node_modules/**'
+    - 'node_modules/**'
+    - 'saga/seata-saga-statemachine-designer/**'
+    - '**/src/test/resources/statelang/**'
+    - 'console/src/main/resources/static/console-fe/**'
+    - '**/io/seata/sqlparser/antlr/**/*.g4'
+    - '**/io/seata/sqlparser/antlr/mysql/parser/*'
+    - '**/integration/**/*.proto'
+    - 'console/src/main/resources/static/**'
+    - 'ext/apm-seata-skywalking-plugin/config/agent.config'
+    - 'server/src/main/resources/lua/redislocker/redislock.lua'
+
+
+  comment: on-failure
+dependency:
+  files:
+    - pom.xml
+    - saga/seata-saga-statemachine-designer/package.json
+    - console/src/main/resources/static/console-fe/package.json
+  excludes:
+    - name: io.seata:*

二進制
.mvn/wrapper/maven-wrapper.jar


+ 1 - 0
.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1 @@
+distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip

+ 29 - 0
.travis.yml

@@ -0,0 +1,29 @@
+language: java
+sudo: false # faster builds
+
+jdk:
+  - openjdk11
+  - openjdk8
+
+cache:
+  directories:
+    - $HOME/.m2
+
+install: true
+
+before_script:
+  - if [ "$TRAVIS_JDK_VERSION" == "openjdk8" ]; then
+      export IMAGE_NAME="openjdk:8u212-jre-alpine";
+    fi
+  - if [ "$TRAVIS_JDK_VERSION" == "openjdk11" ]; then
+      export IMAGE_NAME="openjdk:11-jre-stretch";
+    fi
+
+script:
+  - if [ "$TRAVIS_BRANCH" == "develop" ] && [ "$TRAVIS_PULL_REQUEST" == false ]; then
+      travis_wait 30 ./mvnw clean test -DskipTests=false -Dcheckstyle.skip=false -Dlicense.skip=false -P image -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn;
+    else
+      travis_wait 30 ./mvnw clean test -DskipTests=false -Dcheckstyle.skip=false -Dlicense.skip=false -B -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn;
+    fi
+after_success:
+  - bash <(curl -s https://codecov.io/bash)

+ 11 - 0
CHANGELOG.md

@@ -0,0 +1,11 @@
+## 0.1.0 (Jan. 9, 2019)
+
+#### FEATURES:
+
+* support standalone seata-server.
+* support mysql automatic transaction.
+* support @GlobalTransactional spring annotation.
+* support dubbo on filter.
+* support mybatis ORM framework.
+* support api&template.
+* support dubbo,springcloud,motan ect.

+ 76 - 0
CODE_OF_CONDUCT.md

@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at dev-seata@googlegroups.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq

+ 204 - 0
CONTRIBUTING.md

@@ -0,0 +1,204 @@
+# Contributing to Seata
+
+It is warmly welcomed if you have interest to hack on Seata. First, we encourage this kind of willing very much. And here is a list of contributing guide for you.
+
+[[中文贡献文档](./CONTRIBUTING_CN.md)]
+
+## Topics
+
+* [Reporting security issues](#reporting-security-issues)
+* [Reporting general issues](#reporting-general-issues)
+* [Code and doc contribution](#code-and-doc-contribution)
+* [Test case contribution](#test-case-contribution)
+* [Engage to help anything](#engage-to-help-anything)
+* [Code Style](#code-style)
+
+## Reporting security issues
+
+Security issues are always treated seriously. As our usual principle, we discourage anyone to spread security issues. If you find a security issue of Seata, please do not discuss it in public and even do not open a public issue. Instead we encourage you to send us a private email to  [dev-seata@googlegroups.com](mailto:dev-seata@googlegroups.com) to report this.
+
+## Reporting general issues
+
+To be honest, we regard every user of Seata as a very kind contributor. After experiencing Seata, you may have some feedback for the project. Then feel free to open an issue via [NEW ISSUE](https://github.com/seata/seata/issues/new/choose).
+
+Since we collaborate project Seata in a distributed way, we appreciate **WELL-WRITTEN**, **DETAILED**, **EXPLICIT** issue reports. To make the communication more efficient, we wish everyone could search if your issue is an existing one in the searching list. If you find it existing, please add your details in comments under the existing issue instead of opening a brand new one.
+
+To make the issue details as standard as possible, we setup an [ISSUE TEMPLATE](./.github/ISSUE_TEMPLATE) for issue reporters. Please **BE SURE** to follow the instructions to fill fields in template.
+
+There are a lot of cases when you could open an issue:
+
+* bug report
+* feature request
+* performance issues
+* feature proposal
+* feature design
+* help wanted
+* doc incomplete
+* test improvement
+* any questions on project
+* and so on
+
+Also we must remind that when filling a new issue, please remember to remove the sensitive data from your post. Sensitive data could be password, secret key, network locations, private business data and so on.
+
+## Code and doc contribution
+
+Every action to make project Seata better is encouraged. On GitHub, every improvement for Seata could be via a PR (short for pull request).
+
+* If you find a typo, try to fix it!
+* If you find a bug, try to fix it!
+* If you find some redundant codes, try to remove them!
+* If you find some test cases missing, try to add them!
+* If you could enhance a feature, please **DO NOT** hesitate!
+* If you find code implicit, try to add comments to make it clear!
+* If you find code ugly, try to refactor that!
+* If you can help to improve documents, it could not be better!
+* If you find document incorrect, just do it and fix that!
+* ...
+
+Actually it is impossible to list them completely. Just remember one principle:
+
+> WE ARE LOOKING FORWARD TO ANY PR FROM YOU.
+
+Since you are ready to improve Seata with a PR, we suggest you could take a look at the PR rules here.
+
+* [Workspace Preparation](#workspace-preparation)
+* [Branch Definition](#branch-definition)
+* [Commit Rules](#commit-rules)
+* [PR Description](#pr-description)
+
+### Workspace Preparation
+
+To put forward a PR, we assume you have registered a GitHub ID. Then you could finish the preparation in the following steps:
+
+1. **FORK** Seata to your repository. To make this work, you just need to click the button Fork in right-left of [seata/seata](https://github.com/seata/seata) main page. Then you will end up with your repository in `https://github.com/<your-username>/seata`, in which `your-username` is your GitHub username.
+
+1. **CLONE** your own repository to develop locally. Use `git clone git@github.com:<your-username>/seata.git` to clone repository to your local machine. Then you can create new branches to finish the change you wish to make.
+
+1. **Set Remote** upstream to be `git@github.com:seata/seata.git` using the following two commands:
+
+```bash
+git remote add upstream git@github.com:seata/seata.git
+git remote set-url --push upstream no-pushing
+```
+
+With this remote setting, you can check your git remote configuration like this:
+
+```shell
+$ git remote -v
+origin     git@github.com:<your-username>/seata.git (fetch)
+origin     git@github.com:<your-username>/seata.git (push)
+upstream   git@github.com:seata/seata.git (fetch)
+upstream   no-pushing (push)
+```
+
+Adding this, we can easily synchronize local branches with upstream branches.
+
+### Branch Definition
+
+Right now we assume every contribution via pull request is for [branch develop](https://github.com/seata/seata/tree/develop) in Seata. Before contributing, be aware of branch definition would help a lot.
+
+As a contributor, keep in mind again that every contribution via pull request is for branch develop. While in project Seata, there are several other branches, we generally call them release branches(such as 0.6.0,0.6.1), feature branches, hotfix branches and master branch.
+
+When officially releasing a version, there will be a release branch and named with the version number. 
+
+After the release, we will merge the commit of the release branch into the master branch.
+
+When we find that there is a bug in a certain version, we will decide to fix it in a later version or fix it in a specific hotfix version. When we decide to fix the hotfix version, we will checkout the hotfix branch based on the corresponding release branch, perform code repair and verification, and merge it into the develop branch and the master branch.
+
+For larger features, we will pull out the feature branch for development and verification.
+
+
+### Commit Rules
+
+Actually in Seata, we take two rules serious when committing:
+
+* [Commit Message](#commit-message)
+* [Commit Content](#commit-content)
+
+#### Commit Message
+
+Commit message could help reviewers better understand what is the purpose of submitted PR. It could help accelerate the code review procedure as well. We encourage contributors to use **EXPLICIT** commit message rather than ambiguous message. In general, we advocate the following commit message type:
+
+* docs: xxxx. For example, "docs: add docs about Seata cluster installation".
+* feature: xxxx.For example, "feature: support oracle in AT mode".
+* bugfix: xxxx. For example, "bugfix: fix panic when input nil parameter".
+* refactor: xxxx. For example, "refactor: simplify to make codes more readable".
+* test: xxx. For example, "test: add unit test case for func InsertIntoArray".
+* other readable and explicit expression ways.
+
+On the other side, we discourage contributors from committing message like the following ways:
+
+* ~~fix bug~~
+* ~~update~~
+* ~~add doc~~
+
+If you get lost, please see [How to Write a Git Commit Message](http://chris.beams.io/posts/git-commit/) for a start.
+
+#### Commit Content
+
+Commit content represents all content changes included in one commit. We had better include things in one single commit which could support reviewer's complete review without any other commits' help. In another word, contents in one single commit can pass the CI to avoid code mess. In brief, there are three minor rules for us to keep in mind:
+
+* avoid very large change in a commit;
+* complete and reviewable for each commit.
+* check git config(`user.name`, `user.email`) when committing to ensure that it is associated with your GitHub ID.
+
+```bash
+git config --get user.name
+git config --get user.email
+```
+
+* when submitting pr, please add a brief description of the current changes to the X.X.X.md file under the 'changes/' folder
+
+
+In addition, in the code change part, we suggest that all contributors should read the [code style of Seata](#code-style).
+
+No matter commit message, or commit content, we do take more emphasis on code review.
+
+
+### PR Description
+
+PR is the only way to make change to Seata project files. To help reviewers better get your purpose, PR description could not be too detailed. We encourage contributors to follow the [PR template](./.github/PULL_REQUEST_TEMPLATE.md) to finish the pull request.
+
+## Test case contribution
+
+Any test case would be welcomed. Currently, Seata function test cases are high priority.
+
+* For unit test, you need to create a test file named `xxxTest.java` in the test directory of the same module. Recommend you to use the junit5 UT framework
+
+* For integration test, you can put the integration test in the test directory or the seata-test module. It is recommended to use the mockito test framework.
+
+## Engage to help anything
+
+We choose GitHub as the primary place for Seata to collaborate. So the latest updates of Seata are always here. Although contributions via PR is an explicit way to help, we still call for any other ways.
+
+* reply to other's issues if you could;
+* help solve other user's problems;
+* help review other's PR design;
+* help review other's codes in PR;
+* discuss about Seata to make things clearer;
+* advocate Seata technology beyond GitHub;
+* write blogs on Seata and so on.
+
+
+## Code Style
+
+Seata code style Comply with Alibaba Java Coding Guidelines.
+
+
+### Guidelines
+[Alibaba-Java-Coding-Guidelines](https://alibaba.github.io/Alibaba-Java-Coding-Guidelines/) 
+
+
+### IDE Plugin Install(not necessary)
+
+*It is not necessary to install, if you want to find a problem when you are coding.*
+
+
+#### idea IDE
+[p3c-idea-plugin-install](https://github.com/alibaba/p3c/blob/master/idea-plugin/README.md) 
+
+#### eclipse IDE
+[p3c-eclipse-plugin-install](https://github.com/alibaba/p3c/blob/master/eclipse-plugin/README.md)
+
+
+In a word, **ANY HELP IS CONTRIBUTION.**

+ 204 - 0
CONTRIBUTING_CN.md

@@ -0,0 +1,204 @@
+# 为 Seata 做贡献
+
+如果你有兴趣寻找关于Seata的漏洞,我们会热烈欢迎。首先,我们非常鼓励这种意愿。这是为您提供的贡献指南列表。
+
+[[English Contributing Document](./CONTRIBUTING.md)]
+
+## 话题
+
+* [报告安全问题](#报告安全问题)
+* [报告一般问题](#报告一般问题)
+* [代码和文档贡献](#代码和文档贡献)
+* [测试用例贡献](#测试用例贡献)
+* [参与帮助任何事情](#参与帮助任何事情)
+* [代码风格](#代码风格)
+
+## 报告安全问题
+
+安全问题总是得到认真对待。作为我们通常的原则,我们不鼓励任何人传播安全问题。如果您发现Seata的安全问题,请不要公开讨论,甚至不要公开问题。相反,我们鼓励您向 [dev-seata@googlegroups.com](mailto:dev-seata@googlegroups.com) 发送私人电子邮件 以报告此情况。
+
+## 报告一般问题
+
+老实说,我们把每一个 Seata 用户都视为非常善良的贡献者。在体验了 Seata 之后,您可能会对项目有一些反馈。然后随时通过 [NEW ISSUE](https://github.com/seata/seata/issues/new/choose)打开一个问题。
+
+因为我们在一个分布式的方式合作项目Seata,我们欣赏写得很好的,详细的,准确的问题报告。为了让沟通更高效,我们希望每个人都可以搜索您的问题是否在搜索列表中。如果您发现它存在,请在现有问题下的评论中添加您的详细信息,而不是打开一个全新的问题。
+
+为了使问题细节尽可能标准,我们为问题报告者设置了一个[问题模板](./.github/ISSUE_TEMPLATE) 请务必按照说明填写模板中的字段。
+
+有很多情况你可以打开一个问题:
+
+* 错误报告
+* 功能要求
+* 性能问题
+* 功能提案
+* 功能设计
+* 需要帮助
+* 文档不完整
+* 测试改进
+* 关于项目的任何问题
+* 等等
+
+另外我们必须提醒的是,在填写新问题时,请记住从您的帖子中删除敏感数据。敏感数据可能是密码、密钥、网络位置、私人业务数据等。
+
+## 代码和文档贡献
+
+鼓励采取一切措施使 Seata 项目变得更好。在 GitHub 上,Seata 的每项改进都可以通过 PR(Pull Request的缩写)实现。
+
+* 如果您发现错别字,请尝试修复它!
+* 如果您发现错误,请尝试修复它!
+* 如果您发现一些多余的代码,请尝试删除它们!
+* 如果您发现缺少一些测试用例,请尝试添加它们!
+* 如果您可以增强功能,请**不要**犹豫!
+* 如果您发现代码晦涩难懂,请尝试添加注释以使其更加易读!
+* 如果您发现代码丑陋,请尝试重构它!
+* 如果您能帮助改进文档,那就再好不过了!
+* 如果您发现文档不正确,只需执行并修复它!
+* ...
+
+实际上不可能完整地列出它们。记住一个原则:
+
+> 我们期待您的任何PR。
+
+由于您已准备好通过 PR 改进 Seata,我们建议您可以在此处查看 PR 规则。
+
+* [工作区准备](#工作区准备)
+* [分支定义](#分支定义)
+* [提交规则](#提交规则)
+* [PR说明](#PR说明)
+
+### 工作区准备
+
+为了提出 PR,我们假设你已经注册了一个 GitHub ID。然后您可以通过以下步骤完成准备工作:
+
+1. **FORK** Seata 到您的存储库。要完成这项工作,您只需单击 [seata/seata](https://github.com/seata/seata) 主页右侧的 Fork 按钮。然后你将在 中得到你的存储库`https://github.com/<your-username>/seata`,其中your-username是你的 GitHub 用户名。
+
+2. **克隆** 您自己的存储库以在本地开发. 用于 `git clone git@github.com:<your-username>/seata.git` 将存储库克隆到本地计算机。 然后您可以创建新分支来完成您希望进行的更改。
+
+3. **设置远程** 将上游设置为 `git@github.com:seata/seata.git` 使用以下两个命令:
+
+```bash
+git remote add upstream git@github.com:seata/seata.git
+git remote set-url --push upstream no-pushing
+```
+
+使用此远程设置,您可以像这样检查您的 git 远程配置:
+
+```shell
+$ git remote -v
+origin     git@github.com:<your-username>/seata.git (fetch)
+origin     git@github.com:<your-username>/seata.git (push)
+upstream   git@github.com:seata/seata.git (fetch)
+upstream   no-pushing (push)
+```
+
+添加这个,我们可以轻松地将本地分支与上游分支同步。
+
+### 分支定义
+
+现在我们假设通过拉取请求的每个贡献都是针对Seata 中的 [开发分支](https://github.com/seata/seata/tree/develop) 。在贡献之前,请注意分支定义会很有帮助。
+
+作为贡献者,请再次记住,通过拉取请求的每个贡献都是针对分支开发的。而在Seata项目中,还有其他几个分支,我们一般称它们为release分支(如0.6.0、0.6.1)、feature分支、hotfix分支和master分支。
+
+当正式发布一个版本时,会有一个发布分支并以版本号命名。
+
+在发布之后,我们会将发布分支的提交合并到主分支中。
+
+当我们发现某个版本有bug时,我们会决定在以后的版本中修复它,或者在特定的hotfix版本中修复它。当我们决定修复hotfix版本时,我们会根据对应的release分支checkout hotfix分支,进行代码修复和验证,合并到develop分支和master分支。
+
+对于较大的功能,我们将拉出功能分支进行开发和验证。
+
+
+### 提交规则
+
+实际上,在 Seata 中,我们在提交时会认真对待两条规则:
+
+* [提交消息](#提交消息)
+* [提交内容](#提交内容)
+
+#### 提交消息
+
+提交消息可以帮助审稿人更好地理解提交 PR 的目的是什么。它还可以帮助加快代码审查过程。我们鼓励贡献者使用显式的提交信息,而不是模糊的信息。一般来说,我们提倡以下提交消息类型:
+
+* docs: xxxx. For example, "docs: add docs about Seata cluster installation".
+* feature: xxxx.For example, "feature: support oracle in AT mode".
+* bugfix: xxxx. For example, "bugfix: fix panic when input nil parameter".
+* refactor: xxxx. For example, "refactor: simplify to make codes more readable".
+* test: xxx. For example, "test: add unit test case for func InsertIntoArray".
+* 其他可读和显式的表达方式。
+
+另一方面,我们不鼓励贡献者通过以下方式提交消息:
+
+* ~~修复错误~~
+* ~~更新~~
+* ~~添加文档~~
+
+如果你不知道该怎么做,请参阅 [如何编写 Git 提交消息](http://chris.beams.io/posts/git-commit/) 作为开始。
+
+#### 提交内容
+
+提交内容表示一次提交中包含的所有内容更改。我们最好在一次提交中包含可以支持审阅者完整审查的内容,而无需任何其他提交的帮助。换句话说,一次提交中的内容可以通过 CI 以避免代码混乱。简而言之,我们需要牢记三个小规则:
+
+* 避免在提交中进行非常大的更改;
+* 每次提交都完整且可审查。
+* 提交时检查 git config(`user.name`, `user.email`) 以确保它与您的 GitHub ID 相关联。
+
+```bash
+git config --get user.name
+git config --get user.email
+```
+
+* 提交pr时,请在'changes/'文件夹下的XXXmd文件中添加当前更改的简要说明
+
+
+另外,在代码变更部分,我们建议所有贡献者阅读Seata的 [代码风格](#代码风格)。
+
+无论是提交信息,还是提交内容,我们都更加重视代码审查。
+
+
+### PR说明
+
+PR 是更改 Seata 项目文件的唯一方法。为了帮助审查人更好地理解你的目的,PR 描述不能太详细。我们鼓励贡献者遵循 [PR 模板](./.github/PULL_REQUEST_TEMPLATE.md) 来完成拉取请求。
+
+## 测试用例贡献
+
+任何测试用例都会受到欢迎。目前,Seata 功能测试用例是高优先级的。
+
+* 对于单元测试,您需要在同一模块的 test 目录中创建一个名为 xxxTest.java 的测试文件。推荐你使用junit5 UT框架
+
+* 对于集成测试,您可以将集成测试放在 test 目录或 seata-test 模块中。推荐使用mockito测试框架。
+
+## 参与帮助任何事情
+
+我们选择 GitHub 作为 Seata 协作的主要场所。所以Seata的最新更新总是在这里。尽管通过 PR 贡献是一种明确的帮助方式,但我们仍然呼吁其他方式。
+
+* 如果可以的话,回复别人的问题;
+* 帮助解决其他用户的问题;
+* 帮助审查他人的 PR 设计;
+* 帮助审查其他人在 PR 中的代码;
+* 讨论 Seata 以使事情更清楚;
+* 在Github之外宣传Seata技术;
+* 写关于 Seata 的博客等等。
+
+
+## 代码风格
+
+Seata 代码风格 符合阿里巴巴 Java 编码指南。
+
+
+### 指南
+[阿里巴巴Java代码指南](https://alibaba.github.io/Alibaba-Java-Coding-Guidelines/)
+
+
+### IDE插件安装(非必须)
+
+*没有必要安装,如果你想在编码的时候发现问题。*
+
+
+#### idea IDE
+[p3c-idea-plugin-install](https://github.com/alibaba/p3c/blob/master/idea-plugin/README.md) 
+
+#### eclipse IDE
+[p3c-eclipse-plugin-install](https://github.com/alibaba/p3c/blob/master/eclipse-plugin/README.md)
+
+
+总之,**任何帮助都是贡献。**

+ 218 - 0
LICENSE

@@ -0,0 +1,218 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        https://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (properties) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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
+
+       https://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.
+
+=======================================================================
+Seata Subcomponents:
+
+The Seata project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+========================================================================
+Apache 2.0 licenses
+========================================================================
+
+The following components are provided under the Apache License. See project link for details.
+The text of each license is the standard Apache 2.0 license.
+
+    Apache: skywalking 8.4.0: https://github.com/apache/skywalking, Apache 2.0

+ 5 - 0
NOTICE

@@ -0,0 +1,5 @@
+Seata
+Copyright 2019-2022 Seata.io Group.
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).

+ 316 - 1
README.md

@@ -1,2 +1,317 @@
-# seata
+<img src="https://img.alicdn.com/imgextra/i1/O1CN011z0JfQ2723QgDiWuH_!!6000000007738-2-tps-1497-401.png"  height="100" width="426">
+
+# Seata: Simple Extensible Autonomous Transaction Architecture
+
+[![Build Status](https://github.com/seata/seata/workflows/build/badge.svg?branch=develop)](https://github.com/seata/seata/actions)
+[![codecov](https://codecov.io/gh/seata/seata/branch/develop/graph/badge.svg)](https://codecov.io/gh/seata/seata)
+[![license](https://img.shields.io/github/license/seata/seata.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
+[![maven](https://img.shields.io/maven-central/v/io.seata/seata-parent.svg)](https://search.maven.org/search?q=io.seata)
+[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/seata/seata.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/seata/seata/context:java)
+
+
+## What is Seata?
+
+A **distributed transaction solution** with high performance and ease of use for **microservices** architecture.
+### Distributed Transaction Problem in Microservices
+
+Let's imagine a traditional monolithic application. Its business is built up with 3 modules. They use a single local data source.
+
+Naturally, data consistency will be guaranteed by the local transaction.
+
+![Monolithic App](https://img.alicdn.com/imgextra/i3/O1CN01FTtjyG1H4vvVh1sNY_!!6000000000705-0-tps-1106-678.jpg) 
+
+Things have changed in a microservices architecture. The 3 modules mentioned above are designed to be 3 services on top of 3 different data sources ([Pattern: Database per service](http://microservices.io/patterns/data/database-per-service.html)). Data consistency within every single service is naturally guaranteed by the local transaction. 
+
+**But how about the whole business logic scope?**
+
+![Microservices Problem](https://img.alicdn.com/imgextra/i1/O1CN01DXkc3o1te9mnJcHOr_!!6000000005926-0-tps-1268-804.jpg) 
+
+### How Seata do?
+
+Seata is just a solution to the problem mentioned above. 
+
+![Seata solution](https://img.alicdn.com/imgextra/i1/O1CN01FheliH1k5VHIRob3p_!!6000000004632-0-tps-1534-908.jpg)
+
+Firstly, how to define a **Distributed Transaction**?
+
+We say, a **Distributed Transaction** is a **Global Transaction** which is made up with a batch of **Branch Transaction**, and normally **Branch Transaction** is just **Local Transaction**.
+
+![Global & Branch](https://cdn.nlark.com/lark/0/2018/png/18862/1545015454979-a18e16f6-ed41-44f1-9c7a-bd82c4d5ff99.png) 
+
+There are three roles in Seata Framework: 
+
+- **Transaction Coordinator(TC):** Maintain status of global and branch transactions, drive the global commit or rollback.
+- **Transaction Manager(TM):** Define the scope of global transaction: begin a global transaction, commit or rollback a global transaction.
+- **Resource Manager(RM):** Manage resources that branch transactions working on, talk to TC for registering branch transactions and reporting status of branch transactions, and drive the branch transaction commit or rollback.
+
+![Model](https://cdn.nlark.com/lark/0/2018/png/18862/1545013915286-4a90f0df-5fda-41e1-91e0-2aa3d331c035.png) 
+
+A typical lifecycle of Seata managed distributed transaction:
+
+1. TM asks TC to begin a new global transaction. TC generates an XID representing the global transaction.
+2. XID is propagated through microservices' invoke chain.
+3. RM registers local transaction as a branch of the corresponding global transaction of XID to TC. 
+4. TM asks TC for committing or rollbacking the corresponding global transaction of XID.
+5. TC drives all branch transactions under the corresponding global transaction of XID to finish branch committing or rollbacking.
+
+![Typical Process](https://cdn.nlark.com/lark/0/2018/png/18862/1545296917881-26fabeb9-71fa-4f3e-8a7a-fc317d3389f4.png) 
+
+For more details about principle and design, please go to [Seata wiki page](https://github.com/seata/seata/wiki). 
+
+### History
+
+##### Alibaba
+
+- **TXC**: Taobao Transaction Constructor. Alibaba middleware team started this project since 2014 to meet the distributed transaction problems caused by application architecture change from monolithic to microservices.
+- **GTS**: Global Transaction Service. TXC as an Aliyun middleware product with new name GTS was published since 2016.
+- **Fescar**: we started the open source project Fescar based on TXC/GTS since 2019 to work closely with the community in the future.
+
+
+##### Ant Financial
+
+- **XTS**: Extended Transaction Service. Ant Financial middleware team developed the distributed transaction middleware since 2007, which is widely used in Ant Financial and solves the problems of data consistency across databases and services.
+
+- **DTX**: Distributed Transaction Extended. Since 2013, XTS has been published on the Ant Financial Cloud, with the name of DTX .
+
+
+##### Seata Community
+
+- **Seata** :Simple Extensible Autonomous Transaction Architecture. Ant Financial joins Fescar, which make it to be a more neutral and open community for distributed transaction, and Fescar be renamed to Seata.
+
+
+
+## Maven dependency
+```xml
+<seata.version>1.6.1</seata.version>
+<dependency>
+    <groupId>io.seata</groupId>
+    <artifactId>seata-all</artifactId>
+    <version>${seata.version}</version>
+</dependency>
+
+<!--If your project base on `Spring Boot`, you can directly use the following dependencies-->
+<!--Notice: `seata-spring-boot-starter` has included `seata-all` dependency-->
+<dependency>
+    <groupId>io.seata</groupId>
+    <artifactId>seata-spring-boot-starter</artifactId>
+    <version>${seata.version}</version>
+</dependency>
+
+```
+## Quick Start
+
+[Quick Start](https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html)
+
+## Documentation
+
+
+You can view the full documentation from Seata Official Website: [Seata Website page](https://seata.io/zh-cn/docs/overview/what-is-seata.html).
+
+## Reporting bugs
+
+Please follow the [template](https://github.com/seata/seata/blob/develop/.github/ISSUE_TEMPLATE/BUG_REPORT.md) for reporting any issues.
+
+
+## Contributing
+
+Contributors are welcomed to join the Seata project. Please check [CONTRIBUTING](./CONTRIBUTING.md) and[CONTRIBUTING-CN](./CONTRIBUTING_CN.md)about how to contribute to this project.
+
+
+## Contact
+
+* Mailing list: 
+  * dev-seata@googlegroups.com , for dev/user discussion. [subscribe](mailto:dev-seata+subscribe@googlegroups.com), [unsubscribe](mailto:dev-seata+unsubscribe@googlegroups.com), [archive](https://groups.google.com/forum/#!forum/dev-seata)
+  
+
+<img src="https://img.alicdn.com/imgextra/i3/O1CN01FKBxyk25Ffx83dIJc_!!6000000007497-0-tps-1078-354.jpg"  height="200" width="630">
+
+
+## Seata ecosystem
+
+* [Seata Website](https://github.com/seata/seata.github.io) - Seata official website
+* [Seata Ecosystem Entry](https://github.com/seata) - A GitHub group `seata` to gather all Seata relevant projects
+* [Seata GoLang](https://github.com/opentrx/seata-golang) - Seata GoLang client and server
+* [Seata Samples](https://github.com/seata/seata-samples) - Samples for Seata
+* [Seata Docker](https://github.com/seata/seata-docker) - Seata integration with docker
+* [Seata K8s](https://github.com/seata/seata-k8s) - Seata integration with k8s
+* [Awesome Seata](https://github.com/seata/awesome-seata) - Seata's slides and video address in meetup
+
+## Contributors
+
+This project exists thanks to all the people who contribute. [[Contributors](https://github.com/seata/seata/graphs/contributors)].
+
+## License
+
+Seata is under the Apache 2.0 license. See the [LICENSE](https://github.com/seata/seata/blob/master/LICENSE) file for details.
+
+## Who is using
+
+These are only part of the companies using Seata, for reference only. If you are using Seata, please [add your company 
+here](https://github.com/seata/seata/issues/1246) to tell us your scenario to make Seata better.
+
+<div style='vertical-align: middle'>
+    <img alt='Alibaba Group' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01TleQq128FAP8POtL5_!!6000000007902-2-tps-241-42.png'  /img>
+    <img alt='蚂蚁金服' height='40'  src='https://img.alicdn.com/tfs/TB1wuuCoET1gK0jSZFhXXaAtVXa-496-202.jpg'  /img>
+    <img alt='阿里云' height='40'  src='https://img.alicdn.com/tfs/TB1Ly5oS3HqK1RjSZFPXXcwapXa-238-54.png'  /img>
+    <img alt='中航信' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01Hohqhm1JvGPE4cSD4_!!6000000001090-1-tps-436-84.gif'  /img>
+    <img alt='联通(浙江)' height='40'  src='https://img.alicdn.com/tfs/TB1hvabw9f2gK0jSZFPXXXsopXa-174-100.png'  /img>
+    <img alt='中国铁塔' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01qkkEMZ1Jr8qDmXdAa_!!6000000001081-2-tps-220-67.png'  /img>
+    <img alt='滴滴' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01RXbaWn1SDbBfpCs1B_!!6000000002213-0-tps-640-458.jpg'  /img>
+    <img alt='中国邮政' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01Rkw4z01OPGomOisU1_!!6000000001697-2-tps-220-64.png'  /img>
+    <img alt='58集团' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01y0Wwc51wxnbw9FDJi_!!6000000006375-2-tps-252-84.png'  /img>
+    <img alt='南航' height='40'  src='https://img.alicdn.com/tfs/TB1GMQpZHY1gK0jSZTEXXXDQVXa-203-63.png'  /img>
+    <img alt='TCL' height='40'  src='https://img.alicdn.com/tfs/TB1oHThw.Y1gK0jSZFCXXcwqXXa-214-200.png'  /img>
+    <img alt='韵达快递' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01McNkv624Z5AKVHR0h_!!6000000007404-2-tps-140-54.png'  /img>
+    <img alt='科大讯飞' height='40'  src='https://img.alicdn.com/tfs/TB1x0p5jxvbeK8jSZPfXXariXXa-272-83.png'  /img>
+    <img alt='奇虎360' height='40'  src='https://img.alicdn.com/imgextra/i2/O1CN01M9aSuY1nQWGxoVQu9_!!6000000005084-2-tps-239-78.png' /img>
+    <img alt='收钱吧' height='40' src='https://img.alicdn.com/imgextra/i1/O1CN01PmTFnO1gZ2K7GUpgh_!!6000000004155-2-tps-2406-747.png' /img>
+    <img alt='太极计算机' height='40'  src='https://img.alicdn.com/tfs/TB1.zqEoAL0gK0jSZFAXXcA9pXa-245-38.png'  /img>
+    <img alt='美的集团' height='40' src='https://img.alicdn.com/tfs/TB1cgvjwYj1gK0jSZFOXXc7GpXa-1040-282.png'  /img>    
+    <img alt='中国网安' height='40' src='https://img.alicdn.com/imgextra/i3/O1CN01OioqXX1dfxSxg6DYn_!!6000000003764-2-tps-574-122.png' /img>
+    <img alt='政采云' height='40'  src='https://img.alicdn.com/tfs/TB1DDiCorY1gK0jSZTEXXXDQVXa-440-114.jpg'  /img>
+    <img alt='浙江公安厅' height='40'  src='https://img.alicdn.com/tfs/TB1SXGzoxn1gK0jSZKPXXXvUXXa-426-180.jpg'  /img>
+    <img alt='特步' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01qo6gfd1l7AK1LIF8t_!!6000000004771-2-tps-132-40.png'  /img>
+    <img alt='中通快递' height='40'  src='https://img.alicdn.com/tfs/TB1rCNSFxn1gK0jSZKPXXXvUXXa-172-31.png'  /img>
+    <img alt='欧莱雅百库' height='40'  src='https://img.alicdn.com/tfs/TB1Xa3bZQL0gK0jSZFtXXXQCXXa-936-93.png'  /img> 
+    <img alt='浙江烟草' height='40'  src='https://img.alicdn.com/tfs/TB1e7Wiovb2gK0jSZK9XXaEgFXa-1028-160.jpg'  /img>
+    <img alt='波司登' height='40'  src='https://img.alicdn.com/tfs/TB12cmCouL2gK0jSZFmXXc7iXXa-310-110.jpg'  /img> 
+    <img alt='凯京科技' height='40'  src='https://img.alicdn.com/tfs/TB1j0dEop67gK0jSZPfXXahhFXa-400-208.jpg'  /img>
+    <img alt='点购集团' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01edO0ox1Nu7syhwbAy_!!6000000001629-2-tps-300-112.png'  /img>
+    <img alt='求是创新健康' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01hygG6821bQLGWN8tm_!!6000000007003-2-tps-98-52.png'  /img>
+    <img alt='科蓝' height='40'  src='https://img.alicdn.com/tfs/TB1tuSyouT2gK0jSZFvXXXnFXXa-304-94.jpg'  /img>
+    <img alt='康美药业' height='40'  src='https://img.alicdn.com/imgextra/i4/O1CN01BWFT271rXAVLUYWWG_!!6000000005640-2-tps-185-40.png'  /img>
+    <img alt='雁联' height='40'  src='https://img.alicdn.com/tfs/TB1c8iCouL2gK0jSZFmXXc7iXXa-428-102.jpg'  /img>
+    <img alt='学两手' height='40'  src='https://img.alicdn.com/imgextra/i4/O1CN01njYJ2J1ytnNhCFWcI_!!6000000006637-2-tps-340-104.png'  /img>
+    <img alt='衣二三' height='40'  src='https://img.alicdn.com/tfs/TB1OCGioCf2gK0jSZFPXXXsopXa-500-179.jpg'  /img>
+    <img alt='北京薪福社' height='40'  src='https://img.alicdn.com/tfs/TB1Atu9ovzO3e4jSZFxXXaP_FXa-310-60.png'  /img> 
+    <img alt='叩丁狼教育' height='40'  src='https://img.alicdn.com/tfs/TB1pfYTpRBh1e4jSZFhXXcC9VXa-151-72.png'  /img> 
+    <img alt='悦途出行' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01F5wna31NJwavQ0r4w_!!6000000001550-2-tps-171-48.png'  /img>
+    <img alt='国信易企签' height='40'  src='https://img.alicdn.com/tfs/TB1UTwmZFT7gK0jSZFpXXaTkpXa-201-85.png'  /img>  
+    <img alt='睿颐软件' height='40'  src='https://img.alicdn.com/tfs/TB143R4op67gK0jSZPfXXahhFXa-148-42.png'  /img>
+    <img alt='全房通' height='40'  src='https://img.alicdn.com/tfs/TB1iMSAopP7gK0jSZFjXXc5aXXa-398-182.jpg'  /img> 
+    <img alt='有利网' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01b1huj51aYDwz4RqSQ_!!6000000003341-2-tps-350-51.png'  /img>
+    <img alt='赛维' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01SekTsn25izLZW7IKo_!!6000000007561-2-tps-270-124.png'  /img>
+    <img alt='安心保险' height='40'  src='https://img.alicdn.com/imgextra/i2/O1CN01cyUkSO20BUISGUjyw_!!6000000006811-2-tps-149-114.png'  /img>
+    <img alt='科达科技' height='40'  src='https://img.alicdn.com/tfs/TB1JvOjouT2gK0jSZFvXXXnFXXa-386-146.jpg'  /img>
+    <img alt='会分期' height='40'  src='https://img.alicdn.com/tfs/TB1ChKFoBr0gK0jSZFnXXbRRXXa-402-166.jpg'  /img>
+    <img alt='会找房' height='40'  src='https://img.alicdn.com/tfs/TB1bNWFoBr0gK0jSZFnXXbRRXXa-398-336.jpg'  /img>
+    <img alt='会通教育' height='40'  src='https://img.alicdn.com/tfs/TB1_D9Boxn1gK0jSZKPXXXvUXXa-580-218.jpg'  /img>
+    <img alt='享住智慧' height='40'  src='https://img.alicdn.com/imgextra/i2/O1CN01u3zEdz1Puhc2jO2kT_!!6000000001901-2-tps-114-43.png'  /img>
+    <img alt='兰亮网络' height='40'  src='https://img.alicdn.com/tfs/TB1_miroq61gK0jSZFlXXXDKFXa-283-70.png'  /img>
+    <img alt='桔子数科' height='40'  src='https://img.alicdn.com/tfs/TB1HD.oZUY1gK0jSZFMXXaWcVXa-300-300.png'  /img> 
+    <img alt='蓝天教育' height='40'  src='https://img.alicdn.com/tfs/TB1CaSroAT2gK0jSZPcXXcKkpXa-492-176.jpg'  /img>
+    <img alt='烟台欣和' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01lp3KWN1uGd2y6CEAx_!!6000000006010-2-tps-1383-1023.png'  /img>
+    <img alt='阿康健康' height='40'  src='https://img.alicdn.com/tfs/TB1JNSqouH2gK0jSZFEXXcqMpXa-450-182.jpg'  /img>
+    <img alt='财新传媒' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01MMilH71k2IUuZsp45_!!6000000004625-2-tps-128-80.png'  /img>
+    <img alt='新脉远' height='40'  src='https://img.alicdn.com/tfs/TB1NV1uouH2gK0jSZJnXXaT1FXa-462-172.jpg'  /img>
+    <img alt='乾动新能源' height='40'  src='https://img.alicdn.com/imgextra/i2/O1CN01ZTwkxR1VubDVHuxii_!!6000000002713-2-tps-72-50.png'  /img>
+    <img alt='路客精品民宿' height='40'  src='https://img.alicdn.com/tfs/TB1CCavoBr0gK0jSZFnXXbRRXXa-240-100.png'  /img>
+    <img alt='深圳好尔美' height='40'  src='https://img.alicdn.com/tfs/TB1IIivoxD1gK0jSZFyXXciOVXa-200-130.png'  /img>
+    <img alt='浙大睿医' height='40'  src='https://img.alicdn.com/tfs/TB1kQThrFY7gK0jSZKzXXaikpXa-220-110.jpg'  /img>
+    <img alt='深圳市云羿贸易科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB15r7dZHY1gK0jSZTEXXXDQVXa-234-233.png'  /img> 
+    <img alt='居然之家' height='40'  src='https://img.alicdn.com/tfs/TB1LK6jrUT1gK0jSZFrXXcNCXXa-180-54.png'  /img>
+    <img alt='深圳来电科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1SEzM0eL2gK0jSZFmXXc7iXXa-154-45.png'  /img> 
+    <img alt='臻善科技' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN01g9LjBW1YCa03USGaO_!!6000000003023-2-tps-158-29.png'  /img>
+    <img alt='中国支付通' height='40'  src='https://img.alicdn.com/tfs/TB1VGpTFET1gK0jSZFrXXcNCXXa-193-55.png'  /img>
+    <img alt='众网小贷' height='40'  src='https://img.alicdn.com/tfs/TB19Y8XFEY1gK0jSZFMXXaWcVXa-160-60.png'  /img>
+    <img alt='谐云科技' height='40'  src='https://img.alicdn.com/tfs/TB1V1YlrRv0gK0jSZKbXXbK2FXa-514-160.png'  /img>
+    <img alt='浙江甄品' height='40'  src='https://img.alicdn.com/tfs/TB1oC2prND1gK0jSZFyXXciOVXa-246-124.jpg'  /img>
+    <img alt='深圳海豚网' height='40'  src='https://img.alicdn.com/tfs/TB1defkrLb2gK0jSZK9XXaEgFXa-434-146.jpg'  /img>
+    <img alt='汇通天下' height='40'  src='https://img.alicdn.com/tfs/TB1uIHmrHr1gK0jSZR0XXbP8XXa-1024-568.png'  /img>
+    <img alt='九机网' height='40'  src='https://img.alicdn.com/tfs/TB1ERHlrUY1gK0jSZFMXXaWcVXa-120-60.png'  /img>
+    <img alt='有好东西' height='40'  src='https://img.alicdn.com/tfs/TB1LT2lrNn1gK0jSZKPXXXvUXXa-300-300.jpg'  /img>
+    <img alt='南京智慧盾' height='40'  src='https://img.alicdn.com/tfs/TB1s2LprUY1gK0jSZFCXXcwqXXa-618-148.jpg'  /img>
+    <img alt='数跑科技' height='40'  src='https://img.alicdn.com/tfs/TB1qtGew7T2gK0jSZPcXXcKkpXa-294-104.png'  /img>
+    <img alt='拉粉粉' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN0191WwyY1d8WZaQZcjA_!!6000000003691-2-tps-200-200.png'  /img> 
+    <img alt='汇通达' height='40'  src='https://img.alicdn.com/tfs/TB1KVJ9wWL7gK0jSZFBXXXZZpXa-145-59.png'  /img>
+    <img alt='易宝支付' height='40'  src='https://img.alicdn.com/tfs/TB1vWafw7T2gK0jSZFkXXcIQFXa-301-100.png'  /img>
+    <img alt='维恩贝特' height='40'  src='https://img.alicdn.com/imgextra/i2/O1CN01Nop2ji1glrR8j0u21_!!6000000004183-2-tps-120-50.png'  /img>
+    <img alt='八库' height='40' src='https://img.alicdn.com/tfs/TB1hC5cwVY7gK0jSZKzXXaikpXa-318-134.png'  /img>
+    <img alt='大诚若谷' height='40'  src='https://img.alicdn.com/tfs/TB1VuPhw4D1gK0jSZFyXXciOVXa-294-124.png'  /img>
+    <img alt='杭州华网信息' height='40'  src='https://img.alicdn.com/tfs/TB1FFX6FqL7gK0jSZFBXXXZZpXa-288-101.png'  /img>  
+    <img alt='深圳易佰' height='40'  src='https://img.alicdn.com/tfs/TB1gkXaFrr1gK0jSZR0XXbP8XXa-187-57.png'  /img>
+    <img alt='易点生活' height='40' src='https://img.alicdn.com/imgextra/i3/O1CN01svojxj1LuvK3hgQ5Y_!!6000000001360-2-tps-133-48.png' /img>
+    <img alt='成都数智索' height='40'  src='https://img.alicdn.com/tfs/TB1oJKiw4D1gK0jSZFyXXciOVXa-2053-377.png'  /img>  
+    <img alt='北京超图' height='40'  src='https://img.alicdn.com/tfs/TB1eKFXFEz1gK0jSZLeXXb9kVXa-163-54.png'  /img>
+    <img alt='江西群享科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1Qcd0p79l0K4jSZFKXXXFjpXa-372-125.png'  /img> 
+    <img alt='宋城独木桥网络有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1UKocmPMZ7e4jSZFOXXX7epXa-234-82.png'  /img> 
+    <img alt='唯小宝(江苏)网络技术有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1eswAZFP7gK0jSZFjXXc5aXXa-800-800.png'  /img> 
+    <img alt='杭州喜团科技' height='40'  src='https://img.alicdn.com/tfs/TB1IXqgwYj1gK0jSZFuXXcrHpXa-197-58.png'  /img>
+    <img alt='海典软件' height='40'  src='https://img.alicdn.com/tfs/TB1KmosZNv1gK0jSZFFXXb0sXXa-247-61.png'  /img> 
+    <img alt='中元健康科技有限公司' height='40' src='https://img.alicdn.com/imgextra/i3/O1CN018aBoRi1ZOm8uiOJwA_!!6000000003185-0-tps-1659-569.jpg' /img>
+    <img alt='宿迁民丰农商银行' height='40'  src='https://img.alicdn.com/tfs/TB1bH5fw7L0gK0jSZFAXXcA9pXa-442-39.png'  /img>
+    <img alt='上海海智在线' height='40' src='https://img.alicdn.com/tfs/TB1xAJUFy_1gK0jSZFqXXcpaXXa-320-80.jpg'  /img>
+    <img alt='丞家(上海)公寓管理' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01bQlU6F1r8R7GYzQxf_!!6000000005586-2-tps-318-60.png'  /img>
+    <img alt='安徽国科新材科' height='40'  src='https://img.alicdn.com/tfs/TB1ICJfFuH2gK0jSZJnXXaT1FXa-654-232.png'  /img>
+    <img alt='商银信支付' height='40' src='https://img.alicdn.com/tfs/TB1rxndw4n1gK0jSZKPXXXvUXXa-150-68.png'   /img>
+    <img alt='钛师傅云' height='40'  src='https://img.alicdn.com/imgextra/i4/O1CN01jEUKEJ1WS28EnlGRb_!!6000000002786-2-tps-240-60.png'  /img>
+    <img alt='广州力生信息' height='40'  src='https://img.alicdn.com/tfs/TB1m0FcFuH2gK0jSZFEXXcqMpXa-139-48.png'  /img>
+    <img alt='杭州启舰科技有限公司' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01XJFoMP1qIDxrcCFC8_!!6000000005472-2-tps-120-46.png'  /img>
+     <img alt='微链' height='40'  src='https://img.alicdn.com/tfs/TB14LhHmMgP7K4jSZFqXXamhVXa-300-135.png'  /img> 
+    <img alt='上海美浮特' height='40'  src='https://img.alicdn.com/tfs/TB1uUtaFuT2gK0jSZFvXXXnFXXa-370-45.jpg'  /img>    
+    <img alt='江西群享科技有限公司' height='40' src='https://img.alicdn.com/imgextra/i3/O1CN018AiGbE1PZdN8Vu4Fd_!!6000000001855-2-tps-630-220.png' /img>
+    <img alt='杭州中威慧云医疗科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1iqo_FaL7gK0jSZFBXXXZZpXa-361-54.jpg'  /img> 
+    <img alt='易族智汇(北京)' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01fkwike1yZdx8ZBeP6_!!6000000006593-2-tps-460-136.png'  /img> 
+    <img alt='佛山宅无限' height='40'  src='https://img.alicdn.com/imgextra/i4/O1CN01onGhwm1j2vQTRjmx8_!!6000000004491-2-tps-100-48.png'  /img>     
+    <img alt='F5未来商店' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN014QzjZ31l7AK1LINSu_!!6000000004771-2-tps-1073-175.png'  /img>  
+    <img alt='重庆雷高科技有限公司' height='40' src='https://img.alicdn.com/imgextra/i3/O1CN01TKiMMC1VQpSIe3n7i_!!6000000002648-2-tps-931-865.png' /img>
+    <img alt='甄品信息科技' height='40'  src='https://img.alicdn.com/tfs/TB1SxJWFEY1gK0jSZFCXXcwqXXa-185-65.png'  /img>  
+    <img alt='行云全球汇跨境电商(杭州分部)' height='40'  src='https://img.alicdn.com/imgextra/i1/O1CN01tiLZ0d1dvWx2Dwl4N_!!6000000003798-2-tps-189-45.png'  /img>  
+    <img alt='世纪加华' height='40'  src='https://img.alicdn.com/imgextra/i3/O1CN012jqfoI22wmQR2jiiY_!!6000000007185-0-tps-200-93.jpg'  /img>     
+    <img alt='快陪练' height='40'  src='https://img.alicdn.com/tfs/TB1rhNRFAL0gK0jSZFtXXXQCXXa-321-96.png'  /img> 
+    <img alt='西南石油大学' height='40'  src='https://img.alicdn.com/imgextra/i4/O1CN012swbCB1HU7hgxsF8r_!!6000000000760-0-tps-121-121.jpg'  /img> 
+    <img alt='厦门服云信息科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1zuAzZKL2gK0jSZFmXXc7iXXa-691-263.png'  /img> 
+    <img alt='领课网络' height='40'  src='https://img.alicdn.com/tfs/TB18TNRFEz1gK0jSZLeXXb9kVXa-244-60.jpg'  /img> 
+    <img alt='美通社' height='40'  src='https://img.alicdn.com/tfs/TB1i1JTFCf2gK0jSZFPXXXsopXa-151-60.png'  /img> 
+    <img alt='睿维科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1ztXXFpY7gK0jSZKzXXaikpXa-179-60.png'  /img> 
+    <img alt='郑州信源信息技术' height='40'  src='https://img.alicdn.com/tfs/TB1SkJ9FuT2gK0jSZFvXXXnFXXa-266-56.png'  /img>     
+    <img alt='荣怀集团' height='40'  src='https://img.alicdn.com/tfs/TB1AzbWgZKfxu4jSZPfXXb3dXXa-1117-382.png'  /img>  
+    <img alt='浙江群集大数据科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1HtFZFq61gK0jSZFlXXXDKFXa-1375-214.png'  /img>  
+    <img alt='北京易点租有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1nax.FuH2gK0jSZFEXXcqMpXa-336-154.png'  /img>  
+    <img alt='浙江蕙康科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1nS7IZNv1gK0jSZFFXXb0sXXa-716-193.png'  /img>  
+    <img alt='致远创想' height='40'  src='https://img.alicdn.com/tfs/TB13aaKpA9l0K4jSZFKXXXFjpXa-300-300.png'  /img> 
+    <img alt='深圳智荟物联技术有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1To3amPMZ7e4jSZFOXXX7epXa-1228-500.png'  /img> 
+    <img alt='源讯中国' height='40'  src='https://img.alicdn.com/tfs/TB1CZuKpA9l0K4jSZFKXXXFjpXa-283-92.png'  /img> 
+    <img alt='武汉江寓生活服务有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1E4slZFT7gK0jSZFpXXaTkpXa-268-268.png'  /img> 
+    <img alt='大账房' height='40'  src='https://img.alicdn.com/tfs/TB1.sIyZKL2gK0jSZFmXXc7iXXa-121-121.png'  /img> 
+    <img alt='上海阳光喔教育科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1aUUcZHY1gK0jSZTEXXXDQVXa-246-72.png'  /img> 
+    <img alt='北京新学道教育科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1v3.gZLb2gK0jSZK9XXaEgFXa-240-240.png'  /img> 
+    <img alt='北京悦途出行网络科技公司' height='40'  src='https://img.alicdn.com/tfs/TB1VHkrZHr1gK0jSZFDXXb9yVXa-248-80.png'  /img> 
+    <img alt='上海意贝斯特信息技术有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1kGElZUH1gK0jSZSyXXXtlpXa-126-48.png'  /img> 
+    <img alt='御家汇' height='40'  src='https://img.alicdn.com/tfs/TB1kIIqZUY1gK0jSZFMXXaWcVXa-90-80.png'  /img> 
+    <img alt='广州社众软件' height='40'  src='https://img.alicdn.com/tfs/TB1CawkZND1gK0jSZFsXXbldVXa-112-112.png'  /img> 
+    <img alt='浩鲸科技' height='40'  src='https://img.alicdn.com/tfs/TB1fxZqZQL0gK0jSZFAXXcA9pXa-300-300.png'  /img> 
+    <img alt='华宇信息' height='40'  src='https://img.alicdn.com/tfs/TB1q3UiZKL2gK0jSZPhXXahvXXa-802-271.png'  /img> 
+    <img alt='中国云尚科技' height='40'  src='https://img.alicdn.com/tfs/TB1uf7bZQL0gK0jSZFtXXXQCXXa-303-65.png'  /img> 
+    <img alt='卫宁健康' height='40'  src='https://img.alicdn.com/tfs/TB1WMgmZUY1gK0jSZFCXXcwqXXa-189-57.png'  /img> 
+    <img alt='聚合联动' height='40'  src='https://img.alicdn.com/tfs/TB1gnllpnM11u4jSZPxXXahcXXa-150-60.png'  /img> 
+    <img alt='熙菱信息' height='40'  src='https://img.alicdn.com/tfs/TB1NJmLpA9l0K4jSZFKXXXFjpXa-195-60.png'  /img> 
+    <img alt='鲸算科技' height='40'  src='https://img.alicdn.com/tfs/TB1jfCLpA9l0K4jSZFKXXXFjpXa-514-220.png'  /img> 
+    <img alt='杭州沃朴物联科技有限公司' height='40'  src='https://img.alicdn.com/tfs/TB1vxJ.ZVT7gK0jSZFpXXaTkpXa-309-51.png'  /img> 
+    <img alt='深圳市臻络科技有限公司' height='40' src='https://img.alicdn.com/tfs/TB1v5eiZ.T1gK0jSZFrXXcNCXXa-500-41.png'  /img> 
+    <img alt='白云电气' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN01QPEPnx1zaOC9n4QXE_!!6000000006730-0-tps-781-100.jpg' /img>
+    <img alt='百果园' height='40' src='https://img.alicdn.com/imgextra/i3/O1CN018XKqWK1VPSHxBxLHR_!!6000000002645-2-tps-295-79.png' /img>
+    <img alt='海尔' height='40' src='https://img.alicdn.com/imgextra/i1/O1CN01UkbkeF1PCjajbslRf_!!6000000001805-0-tps-200-200.jpg' /img>
+    <img alt='六倍体科技' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN01TuPFhT288krOXRXQC_!!6000000007888-0-tps-200-200.jpg' /img>
+    <img alt='泉州银行' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN01tUg4Nw1mULzRSQr4B_!!6000000004957-2-tps-447-346.png' /img>
+    <img alt='小滴课堂' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN01sWwoq21VPSHmzCqh7_!!6000000002645-2-tps-200-100.png' /img>
+    <img alt='医百顺' height='40' src='https://img.alicdn.com/imgextra/i1/O1CN01obgBun1PjFiKUoWGr_!!6000000001876-2-tps-192-192.png' /img>
+    <img alt='正泰中自控制' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN01i8iiCk29QuAitxiJq_!!6000000008063-0-tps-378-123.jpg' /img>
+    <img alt='中国电子科技网络' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN01LBYXi6288krJ6Axq8_!!6000000007888-2-tps-1206-158.png' /img>
+    <img alt='卓源软件' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN01FN4K3I1Sq4SQVsDxo_!!6000000002297-2-tps-414-95.png' /img>
+    <img alt='重庆直通物流有限公司' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN0130Bp8H1STd65Fnxn0_!!6000000002248-2-tps-677-172.png' /img>
+    <img alt='海澜集团' height='40' src='https://img.alicdn.com/imgextra/i1/O1CN0186ESVW1hhZO7Otx4X_!!6000000004309-2-tps-376-108.png' /img>
+    <img alt='南宁微服信息技术有限公司' height='40' src='https://img.alicdn.com/imgextra/i2/O1CN011hLbRH1fTiAi6Lq5Z_!!6000000004008-0-tps-283-283.jpg' /img>
+    <img alt='日事清' height='40' src='https://img.alicdn.com/imgextra/i3/O1CN01cJQsV91Fz9LeJEaL1_!!6000000000557-0-tps-339-189.jpg' /img>
+    <img alt='小鹏汽车' height='40' src='https://img.alicdn.com/imgextra/i4/O1CN01KvsEOP21a3CUzDllu_!!6000000007000-2-tps-1920-750.png' /img>
+    <img alt='平安人寿' height='40' src='https://img.alicdn.com/imgextra/i1/O1CN01Erdiwd1RrcDt2bqKl_!!6000000002165-0-tps-1080-1080.jpg' /img>
+    <img alt='光大银行' height='40' src='https://img.alicdn.com/imgextra/i4/O1CN01Rc0vU61sSQ3jvR0rw_!!6000000005765-2-tps-1076-228.png' /img>
+</div>
+
+
+
+
+
+
+
 

+ 165 - 0
SOURCE_MODIFICATION.md

@@ -0,0 +1,165 @@
+## 基于JDK17+Seata改造
+    项目改造基于JDK17+Nacos2.2+Sentinel1.8.6+Seata1.6.1版本,(官方推荐配置)
+### 使用原因
+    由于项目上使用微服架构,各服务都有独立的数据库,那么如何保证事务的一致性?
+    而Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。
+    Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
+### Seata改造
+    Seata可分为两种方式配合项目使用
+    1:代码进行maven编译成jar包进行项目部署
+    2:修改seata文件下config.txt以及script下nacos-center文件进行改造,运行bin目录启动
+### Seata改造
+#### A:安装包方式改造(推荐) 改造包地址 zip目录下
+    安装包方式较为简单,容易变更以及部署
+#### 改造处理方式
+##### 1:下载安装包 1.6.1
+    1:官网 https://seata.io/zh-cn/ 下载地址:https://seata.io/zh-cn/blog/download.html
+    2:参考文档:https://seata.io/zh-cn/blog/seata-quick-start.html
+    3:部署指南:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html
+----
+##### 2:修改seata/seata/conf/application.yml内容
+    源文件seata/config默认使用file方式,需要修改为nacos,并修改seata的config、registry、store都将其改为nacos
+    nacos的配置应于项目实际使用的proup/namespace一致,否则配置不生效,group默认使用为public
+##### 3:新建数据库表seata使用的库以及表(当前使用的数据库版本为8.0)
+    根据seata/seata/script/server/db/mysql.sql建数据库表seata
+    注:多个服务要进行事务回滚,那么都应每个服务的表都加入“undo_log”
+##### 4:配置 seata server 参数  修改config.txt(非常重要)
+    config.txt位置: seata/seata/script/config-center/config.txt
+    修改数据库连接,配置不同服务默认分组(分组后,在实际项目中进行一一对应方可进行事务管理)
+----
+    部署配置 seata-server不同版本存在不同方式
+###### V1.4.2以及之前
+    修改conf.txt文件并将其推至送nacos中
+    配置文件详情见conf.txt
+    推送至nacos(使用git命令方式)
+    nacos-config.sh或者 nacos-config.py
+    sh nacos-config.sh -h 172.22.1.190 -p 8848 -g SEATA_GROUP -t d229c141-52de-4e60-bd4f-216391283c58 -u nacos -w SOPQzj312#!40Cc
+
+    -h – nacos ip
+    -p – nacos 端口
+    -g – seata-server配置文件 分组名
+    -t – seata-server配置文件 命名空间ID,当然在此之前需要现在nacos上新建命名空间并记录下命名空间ID
+    -u – nacos账号
+    -w – nacos密码
+----
+
+###### 当前版本为V1.6.2(当前使用如下操作)-seataServer.properties
+    Seata从v1.4.2版本开始,支持从一个Nacos dataId配置项中获取所有配置信息。
+    所以,在nacos配置中心中新建配置,dataId为 seataServer.properties配置项
+    group 默认是使用default_group 推荐修改为于项目nacos的pom的一致,方便管理
+----
+
+    在nacos中 添加dataID:seataServer.properties文件,具体内容还是config.txt中的配置
+![img.png](img.png)
+--
+![img_1.png](img_1.png)
+
+
+##### 启动seata
+    windows:
+        进入bin目录下,启动bat即可
+    linux: (如已经配置端口,可不指定端口)
+        sh seata-server.sh -h 172.22.1.190 -p 8091 -m db
+##### 页面展示
+    seata 页面
+![img_2.png](img_2.png)
+    nacos 页面展示
+![img_3.png](img_3.png)
+#### B:源码改造
+##### 源码改造处理方式(与安装包改造基本一致)
+###### 源码 maven clean install package 初始化启动会存在问题
+    处理方式两种:(先选择其一)
+        1:删除serializer模块中seata-serializer-protobuf即可,seata-serializer注释引用protobuf模块,该可以不被引用
+        2:很明显就是protobuf包下generated不存在,其实这是由于seata的serializer项目么有编译造成的,
+        只需要我们idea下载安装Protobuf Support插件,然后重启idea,
+        然后在idea右侧maven菜单中,双击如下protobuf-compile执行就可以生成protobuf项目的java代码了。
+----
+##### 修改conf.txt文件(着重)
+    该配置文件中主要修改内容
+        1:默认file修改为nacos配置信息(store.mode )
+        2:修改seata 数据库连接地址(应在对应数据库中新增库表)
+        3:修改service.vgroup_mapping 配置(注册服务)  启用默认分组
+            如需多个服务使用事务管理,应创建多个service.vgroup_mapping。规则为“service.vgroup_mapping.{namespace}-seata-service-group=default”
+        4:启用分布式事务指定的群组 --多个服务使用一个群组管理
+            #service.vgroupMapping.calvin_test_tx_group=default
+        5:default-grouplist配置
+            service.default.grouplist=127.0.0.1:8091 服务默认端口。7081 该配置首位指定上升一位
+            service.enableDegrade=false     是否降级处理  默认false
+            service.disableGlobalTransaction=false      事务管理-全局事务管理  false为开启 true为关闭  
+### 特别注意
+    conf.txt配置中加的service.vgroup_mapping-**应于nacos中进行分组下进行新增配置
+
+![img_5.png](img_5.png)
+
+---
+
+##### 新建数据库表seata使用的库以及表(当前使用的数据库版本为8.0)
+    根据seata/seata/script/server/db/mysql.sql建数据库表seata
+    注:多个服务要进行事务回滚,那么都应每个服务的表都加入“undo_log”
+
+##### nacos注册seataServer.properties 该配置文件应与项目中保持一致,也与该服务配置一致
+    操作方式与 安装包方式中该文件处理方式一致
+        服务group 保持与项目分组一致,便于管理 data-id 使用seataServer.properties命名,使用txt脚本,添加conf.txt的内容
+    注册启动后nacos进行页面查看
+![img_2.png](img_2.png)
+nacos 页面展示
+![img_3.png](img_3.png)
+
+### application.yml改造
+###### 该文件改造主要是适配于多环境下启动
+    该文件可进行改造也可使用默认 
+    源码文件已保存名为application-bak.yml
+    源码配置文件示例已存为application.example.yml
+----
+#### 改造application.yml
+    改为多配置文件,详情查看 server/resources/application.yml
+    新增dev.yml、test.yml、local.yml、prod.yml 灵活配置
+
+#### 项目服务启动
+    windows:
+        选择server服务下的ServerAppliction.java进行启动
+        也可 nohup sh seata-server.sh -p 11091 > /usr/local/seata/logs/seata_nohup.log 2>&1 &
+    linux:
+        进行maven 进行打包后,使用命令进行打包部署
+        mvn clean install '-Dmaven.test.skip=true'
+        mvn clean package '-Dmaven.test.skip=true'
+        java -jar seata.jar(打包jar名) & 
+        也可以使用 nohup  java -jar seata.jar(打包jar名) &  输出实时文件日志
+    如果linux未指定端口名 启动命令 还应加上端口等信息
+    docker run -d --restart always --name seata-server -p 8091:8091 -p 7091:7091 -v /usr/local/seata/seata-server:/seata-server  -e SEATA_PORT=8091  -e SEATA_IP=[自己的ip地址]  seataio/seata-server:1.6.1
+
+
+## 以下为seata整合springCloud项目操作说明
+#### springcloud项目整合引入pom坐标
+         <!-- 注意一定要引入对版本,要引入spring-cloud版本seata,而不是springboot版本的seata-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-seata</artifactId>
+            <!-- 排除掉springcloud默认的seata版本,以免版本不一致出现问题-->
+            <exclusions>
+                <exclusion>
+                    <groupId>io.seata</groupId>
+                    <artifactId>seata-spring-boot-starter</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.seata</groupId>
+                    <artifactId>seata-all</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <!-- 上面排除掉了springcloud默认seata版本,此处引入和seata-server版本对应的seata包-->
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-spring-boot-starter</artifactId>
+            <version>1.6.1</version>
+        </dependency>
+----
+#### yml中引入sata配置信息
+
+###### 详情看server/resources下springCloud-example.yml
+----
+#### 具体项目使用 A服务方加上注解@GlobalTransactional(rollbackFor = Exception.class)
+    注:多个服务要进行事务回滚,那么都应每个服务的表都加入“undo_log”
+
+###### 参考链接
+    https://blog.csdn.net/qq_33222798/article/details/128918225?spm=1001.2014.3001.5506

+ 751 - 0
all/.flattened-pom.xml

@@ -0,0 +1,751 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>io.seata</groupId>
+	<artifactId>seata-all</artifactId>
+	<version>1.6.1</version>
+	<name>Seata All-in-one 1.6.1</name>
+	<description>Seata is an easy-to-use, high-performance, java based, open source distributed transaction solution.</description>
+	<url>https://seata.io</url>
+	<organization>
+		<name>Seata</name>
+		<url>https://github.com/seata</url>
+	</organization>
+	<licenses>
+		<license>
+			<name>Apache License, Version 2.0</name>
+			<url>https://www.apache.org/licenses/LICENSE-2.0</url>
+			<distribution>repo</distribution>
+		</license>
+	</licenses>
+	<developers>
+		<developer>
+			<id>Seata</id>
+			<name>Seata</name>
+			<email>dev-seata@googlegroups.com</email>
+			<url>https://seata.io</url>
+		</developer>
+	</developers>
+	<scm>
+		<connection>scm:git@github.com:seata/seata.git</connection>
+		<developerConnection>scm:git@github.com:seata/seata.git</developerConnection>
+		<url>git@github.com:seata/seata.git</url>
+	</scm>
+	<issueManagement>
+		<system>github</system>
+		<url>https://github.com/seata/seata/issues</url>
+	</issueManagement>
+	<dependencies>
+		<dependency>
+			<groupId>io.seata</groupId>
+			<artifactId>seata-sqlparser-antlr</artifactId>
+			<version>1.6.1</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>io.seata</groupId>
+			<artifactId>seata-serializer-protobuf</artifactId>
+			<version>1.6.1</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-context</artifactId>
+			<version>5.3.19</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-core</artifactId>
+			<version>5.3.19</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-beans</artifactId>
+			<version>5.3.19</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-aop</artifactId>
+			<version>5.3.19</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>spring-webmvc</artifactId>
+			<version>5.3.19</version>
+		</dependency>
+		<dependency>
+			<groupId>io.netty</groupId>
+			<artifactId>netty-all</artifactId>
+			<version>4.1.76.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.antlr</groupId>
+			<artifactId>antlr4</artifactId>
+			<version>4.8</version>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>1.2.83</version>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>druid</artifactId>
+			<version>1.2.6</version>
+		</dependency>
+		<dependency>
+			<groupId>com.typesafe</groupId>
+			<artifactId>config</artifactId>
+			<version>1.2.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>1.7.36</version>
+		</dependency>
+		<dependency>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-classic</artifactId>
+			<version>1.2.9</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>ch.qos.logback</groupId>
+					<artifactId>logback-core</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.6</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>commons-pool2</artifactId>
+			<version>2.9.0</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-pool</groupId>
+			<artifactId>commons-pool</artifactId>
+			<version>1.6</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.dubbo.extensions</groupId>
+			<artifactId>dubbo-filter-seata</artifactId>
+			<version>1.0.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.google.protobuf</groupId>
+			<artifactId>protobuf-java</artifactId>
+			<version>3.11.4</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>dubbo</artifactId>
+			<version>2.6.5</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.jboss.netty</groupId>
+					<artifactId>netty</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba.edas</groupId>
+			<artifactId>edas-sdk</artifactId>
+			<version>1.8.3</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>junit</groupId>
+					<artifactId>junit</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alibaba.hsf</groupId>
+					<artifactId>LightApi</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>commons-io</groupId>
+					<artifactId>commons-io</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>net.bytebuddy</groupId>
+			<artifactId>byte-buddy</artifactId>
+			<version>1.12.13</version>
+		</dependency>
+		<dependency>
+			<groupId>aopalliance</groupId>
+			<artifactId>aopalliance</artifactId>
+			<version>1.0</version>
+		</dependency>
+		<dependency>
+			<groupId>com.101tec</groupId>
+			<artifactId>zkclient</artifactId>
+			<version>0.11</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.netty</groupId>
+					<artifactId>netty</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>zookeeper</groupId>
+					<artifactId>org.apache.zookeeper</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.zookeeper</groupId>
+			<artifactId>zookeeper</artifactId>
+			<version>3.5.9</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>io.netty</groupId>
+					<artifactId>netty</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.apache.zookeeper</groupId>
+					<artifactId>zookeeper-jute</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.apache.yetus</groupId>
+					<artifactId>audience-annotations</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>log4j</groupId>
+					<artifactId>log4j</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.alipay.sofa</groupId>
+			<artifactId>registry-client-all</artifactId>
+			<version>5.2.0</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>com.alipay.sofa.lookout</groupId>
+					<artifactId>lookout-api</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alipay.sofa</groupId>
+					<artifactId>bolt</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alipay.sofa</groupId>
+					<artifactId>hessian</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alipay.sofa.common</groupId>
+					<artifactId>sofa-common-tools</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba.spring</groupId>
+			<artifactId>spring-context-support</artifactId>
+			<version>1.0.2</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.alibaba.nacos</groupId>
+			<artifactId>nacos-client</artifactId>
+			<version>1.4.2</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>com.alibaba.nacos</groupId>
+					<artifactId>nacos-common</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alibaba.nacos</groupId>
+					<artifactId>nacos-api</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>commons-codec</groupId>
+					<artifactId>commons-codec</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.prometheus</groupId>
+					<artifactId>simpleclient</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.ctrip.framework.apollo</groupId>
+			<artifactId>apollo-client</artifactId>
+			<version>2.0.1</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>com.ctrip.framework.apollo</groupId>
+					<artifactId>apollo-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.google.inject</groupId>
+					<artifactId>guice</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>redis.clients</groupId>
+			<artifactId>jedis</artifactId>
+			<version>3.2.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.netflix.eureka</groupId>
+			<artifactId>eureka-client</artifactId>
+			<version>1.10.17</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>javax.servlet</groupId>
+					<artifactId>servlet-api</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.netflix.netflix-commons</groupId>
+					<artifactId>netflix-eventbus</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>javax.ws.rs</groupId>
+					<artifactId>jsr311-api</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.netflix.servo</groupId>
+					<artifactId>servo-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.sun.jersey</groupId>
+					<artifactId>jersey-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.sun.jersey</groupId>
+					<artifactId>jersey-client</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.sun.jersey.contribs</groupId>
+					<artifactId>jersey-apache-client4</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>commons-configuration</groupId>
+					<artifactId>commons-configuration</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.github.vlsi.compactmap</groupId>
+					<artifactId>compactmap</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-annotations</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.codehaus.jettison</groupId>
+					<artifactId>jettison</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.google.inject</groupId>
+					<artifactId>guice</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-core</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.netflix.archaius</groupId>
+			<artifactId>archaius-core</artifactId>
+			<version>0.7.6</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>commons-configuration</groupId>
+					<artifactId>commons-configuration</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-annotations</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-core</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.ecwid.consul</groupId>
+			<artifactId>consul-api</artifactId>
+			<version>1.4.2</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>io.etcd</groupId>
+			<artifactId>jetcd-core</artifactId>
+			<version>0.5.0</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>io.netty</groupId>
+					<artifactId>netty-codec-http</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.netty</groupId>
+					<artifactId>netty-codec-http2</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.netty</groupId>
+					<artifactId>netty-handler-proxy</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.netty</groupId>
+					<artifactId>netty-handler</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.google.guava</groupId>
+					<artifactId>guava</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.etcd</groupId>
+					<artifactId>jetcd-common</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.etcd</groupId>
+					<artifactId>jetcd-resolver</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.grpc</groupId>
+					<artifactId>grpc-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.grpc</groupId>
+					<artifactId>grpc-grpclb</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>net.jodah</groupId>
+					<artifactId>failsafe</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.google.guava</groupId>
+			<artifactId>guava</artifactId>
+			<version>27.0.1-jre</version>
+			<exclusions>
+				<exclusion>
+					<groupId>com.google.guava</groupId>
+					<artifactId>listenablefuture</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>javax.inject</groupId>
+			<artifactId>javax.inject</artifactId>
+			<version>1</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient</artifactId>
+			<version>4.5.13</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>commons-logging</groupId>
+					<artifactId>commons-logging</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>commons-codec</groupId>
+					<artifactId>commons-codec</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpcore</artifactId>
+			<version>4.4.15</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.github.ben-manes.caffeine</groupId>
+			<artifactId>caffeine</artifactId>
+			<version>2.9.3</version>
+		</dependency>
+		<dependency>
+			<groupId>com.alipay.sofa</groupId>
+			<artifactId>sofa-rpc-all</artifactId>
+			<version>5.5.3</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>com.alipay.sofa</groupId>
+					<artifactId>tracer-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.jboss.resteasy</groupId>
+					<artifactId>resteasy-netty4</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.jboss.resteasy</groupId>
+					<artifactId>resteasy-client</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.jboss.resteasy</groupId>
+					<artifactId>resteasy-jackson-provider</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alipay.sofa.lookout</groupId>
+					<artifactId>lookout-api</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alipay.sofa</groupId>
+					<artifactId>bolt</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alipay.sofa.common</groupId>
+					<artifactId>sofa-common-tools</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.alipay.sofa</groupId>
+					<artifactId>hessian</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.weibo</groupId>
+			<artifactId>motan-core</artifactId>
+			<version>1.0.0</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.codahale.metrics</groupId>
+					<artifactId>metrics-core</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.squareup</groupId>
+					<artifactId>javapoet</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.apache.commons</groupId>
+					<artifactId>commons-lang3</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>log4j</groupId>
+					<artifactId>log4j</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>commons-codec</groupId>
+					<artifactId>commons-codec</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.weibo</groupId>
+			<artifactId>motan-transport-netty</artifactId>
+			<version>1.0.0</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.slf4j</groupId>
+					<artifactId>slf4j-log4j12</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.jboss.netty</groupId>
+					<artifactId>netty</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.apache.commons</groupId>
+					<artifactId>commons-lang3</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>log4j</groupId>
+					<artifactId>log4j</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>commons-codec</groupId>
+					<artifactId>commons-codec</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.protostuff</groupId>
+			<artifactId>protostuff-core</artifactId>
+			<version>1.5.9</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>io.protostuff</groupId>
+					<artifactId>protostuff-api</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.protostuff</groupId>
+			<artifactId>protostuff-runtime</artifactId>
+			<version>1.5.9</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>io.protostuff</groupId>
+					<artifactId>protostuff-collectionschema</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.protostuff</groupId>
+					<artifactId>protostuff-api</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.grpc</groupId>
+			<artifactId>grpc-netty</artifactId>
+			<version>1.27.1</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>io.netty</groupId>
+					<artifactId>*</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.grpc</groupId>
+					<artifactId>grpc-core</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.grpc</groupId>
+			<artifactId>grpc-protobuf</artifactId>
+			<version>1.27.1</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>io.grpc</groupId>
+					<artifactId>grpc-api</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.google.api.grpc</groupId>
+					<artifactId>proto-google-common-protos</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>io.grpc</groupId>
+					<artifactId>grpc-protobuf-lite</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>io.grpc</groupId>
+			<artifactId>grpc-stub</artifactId>
+			<version>1.27.1</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>io.grpc</groupId>
+					<artifactId>grpc-api</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.35</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.postgresql</groupId>
+			<artifactId>postgresql</artifactId>
+			<version>42.1.4</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>com.fasterxml.jackson.core</groupId>
+			<artifactId>jackson-databind</artifactId>
+			<version>2.12.6.1</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-annotations</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-core</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.esotericsoftware</groupId>
+			<artifactId>kryo</artifactId>
+			<version>5.3.0</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>com.esotericsoftware</groupId>
+					<artifactId>reflectasm</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.objenesis</groupId>
+					<artifactId>objenesis</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.esotericsoftware</groupId>
+					<artifactId>minlog</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>de.ruedigermoeller</groupId>
+			<artifactId>fst</artifactId>
+			<version>2.57</version>
+			<scope>provided</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>org.objenesis</groupId>
+					<artifactId>objenesis</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>com.fasterxml.jackson.core</groupId>
+					<artifactId>jackson-core</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+		<dependency>
+			<groupId>com.caucho</groupId>
+			<artifactId>hessian</artifactId>
+			<version>4.0.63</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>de.javakaffee</groupId>
+			<artifactId>kryo-serializers</artifactId>
+			<version>0.45</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.lz4</groupId>
+			<artifactId>lz4-java</artifactId>
+			<version>1.7.1</version>
+			<scope>provided</scope>
+		</dependency>
+	</dependencies>
+</project>

+ 771 - 0
all/dependency-reduced-pom.xml

@@ -0,0 +1,771 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>io.seata</groupId>
+  <artifactId>seata-all</artifactId>
+  <name>Seata All-in-one 1.6.1</name>
+  <version>1.6.1</version>
+  <description>Seata is an easy-to-use, high-performance, java based, open source distributed transaction solution.</description>
+  <url>https://seata.io</url>
+  <issueManagement>
+    <system>github</system>
+    <url>https://github.com/seata/seata/issues</url>
+  </issueManagement>
+  <developers>
+    <developer>
+      <id>Seata</id>
+      <name>Seata</name>
+      <email>dev-seata@googlegroups.com</email>
+      <url>https://seata.io</url>
+    </developer>
+  </developers>
+  <licenses>
+    <license>
+      <name>Apache License, Version 2.0</name>
+      <url>https://www.apache.org/licenses/LICENSE-2.0</url>
+      <distribution>repo</distribution>
+    </license>
+  </licenses>
+  <scm>
+    <connection>scm:git@github.com:seata/seata.git</connection>
+    <developerConnection>scm:git@github.com:seata/seata.git</developerConnection>
+    <url>git@github.com:seata/seata.git</url>
+  </scm>
+  <organization>
+    <name>Seata</name>
+    <url>https://github.com/seata</url>
+  </organization>
+  <dependencies>
+    <dependency>
+      <groupId>io.seata</groupId>
+      <artifactId>seata-sqlparser-antlr</artifactId>
+      <version>1.6.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.seata</groupId>
+      <artifactId>seata-serializer-protobuf</artifactId>
+      <version>1.6.1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-context</artifactId>
+      <version>5.3.19</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-core</artifactId>
+      <version>5.3.19</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-beans</artifactId>
+      <version>5.3.19</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-aop</artifactId>
+      <version>5.3.19</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-webmvc</artifactId>
+      <version>5.3.19</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-all</artifactId>
+      <version>4.1.76.Final</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.antlr</groupId>
+      <artifactId>antlr4</artifactId>
+      <version>4.8</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>fastjson</artifactId>
+      <version>1.2.83</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>druid</artifactId>
+      <version>1.2.6</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.typesafe</groupId>
+      <artifactId>config</artifactId>
+      <version>1.2.1</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+      <version>1.7.36</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <version>1.2.9</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>logback-core</artifactId>
+          <groupId>ch.qos.logback</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>commons-lang</groupId>
+      <artifactId>commons-lang</artifactId>
+      <version>2.6</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-pool2</artifactId>
+      <version>2.9.0</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>commons-pool</groupId>
+      <artifactId>commons-pool</artifactId>
+      <version>1.6</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.dubbo.extensions</groupId>
+      <artifactId>dubbo-filter-seata</artifactId>
+      <version>1.0.0</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.protobuf</groupId>
+      <artifactId>protobuf-java</artifactId>
+      <version>3.11.4</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba</groupId>
+      <artifactId>dubbo</artifactId>
+      <version>2.6.5</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>netty</artifactId>
+          <groupId>org.jboss.netty</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba.edas</groupId>
+      <artifactId>edas-sdk</artifactId>
+      <version>1.8.3</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>junit</artifactId>
+          <groupId>junit</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>LightApi</artifactId>
+          <groupId>com.alibaba.hsf</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-io</artifactId>
+          <groupId>commons-io</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>net.bytebuddy</groupId>
+      <artifactId>byte-buddy</artifactId>
+      <version>1.12.13</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>aopalliance</groupId>
+      <artifactId>aopalliance</artifactId>
+      <version>1.0</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.101tec</groupId>
+      <artifactId>zkclient</artifactId>
+      <version>0.11</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>slf4j-log4j12</artifactId>
+          <groupId>org.slf4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>netty</artifactId>
+          <groupId>io.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>org.apache.zookeeper</artifactId>
+          <groupId>zookeeper</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.zookeeper</groupId>
+      <artifactId>zookeeper</artifactId>
+      <version>3.5.9</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>netty</artifactId>
+          <groupId>io.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>zookeeper-jute</artifactId>
+          <groupId>org.apache.zookeeper</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>audience-annotations</artifactId>
+          <groupId>org.apache.yetus</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>slf4j-log4j12</artifactId>
+          <groupId>org.slf4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>log4j</artifactId>
+          <groupId>log4j</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.alipay.sofa</groupId>
+      <artifactId>registry-client-all</artifactId>
+      <version>5.2.0</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>lookout-api</artifactId>
+          <groupId>com.alipay.sofa.lookout</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>bolt</artifactId>
+          <groupId>com.alipay.sofa</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>hessian</artifactId>
+          <groupId>com.alipay.sofa</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>sofa-common-tools</artifactId>
+          <groupId>com.alipay.sofa.common</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba.spring</groupId>
+      <artifactId>spring-context-support</artifactId>
+      <version>1.0.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alibaba.nacos</groupId>
+      <artifactId>nacos-client</artifactId>
+      <version>1.4.2</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>nacos-common</artifactId>
+          <groupId>com.alibaba.nacos</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>nacos-api</artifactId>
+          <groupId>com.alibaba.nacos</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-codec</artifactId>
+          <groupId>commons-codec</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-core</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>simpleclient</artifactId>
+          <groupId>io.prometheus</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.ctrip.framework.apollo</groupId>
+      <artifactId>apollo-client</artifactId>
+      <version>2.0.1</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>apollo-core</artifactId>
+          <groupId>com.ctrip.framework.apollo</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>guice</artifactId>
+          <groupId>com.google.inject</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>redis.clients</groupId>
+      <artifactId>jedis</artifactId>
+      <version>3.2.0</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.netflix.eureka</groupId>
+      <artifactId>eureka-client</artifactId>
+      <version>1.10.17</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>servlet-api</artifactId>
+          <groupId>javax.servlet</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>netflix-eventbus</artifactId>
+          <groupId>com.netflix.netflix-commons</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jsr311-api</artifactId>
+          <groupId>javax.ws.rs</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>servo-core</artifactId>
+          <groupId>com.netflix.servo</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jersey-core</artifactId>
+          <groupId>com.sun.jersey</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jersey-client</artifactId>
+          <groupId>com.sun.jersey</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jersey-apache-client4</artifactId>
+          <groupId>com.sun.jersey.contribs</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-configuration</artifactId>
+          <groupId>commons-configuration</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>compactmap</artifactId>
+          <groupId>com.github.vlsi.compactmap</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-annotations</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jettison</artifactId>
+          <groupId>org.codehaus.jettison</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>guice</artifactId>
+          <groupId>com.google.inject</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-core</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.netflix.archaius</groupId>
+      <artifactId>archaius-core</artifactId>
+      <version>0.7.6</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>commons-configuration</artifactId>
+          <groupId>commons-configuration</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-annotations</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-core</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.ecwid.consul</groupId>
+      <artifactId>consul-api</artifactId>
+      <version>1.4.2</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.etcd</groupId>
+      <artifactId>jetcd-core</artifactId>
+      <version>0.5.0</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>netty-codec-http</artifactId>
+          <groupId>io.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>netty-codec-http2</artifactId>
+          <groupId>io.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>netty-handler-proxy</artifactId>
+          <groupId>io.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>netty-handler</artifactId>
+          <groupId>io.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>guava</artifactId>
+          <groupId>com.google.guava</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jetcd-common</artifactId>
+          <groupId>io.etcd</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jetcd-resolver</artifactId>
+          <groupId>io.etcd</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>grpc-core</artifactId>
+          <groupId>io.grpc</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>grpc-grpclb</artifactId>
+          <groupId>io.grpc</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>failsafe</artifactId>
+          <groupId>net.jodah</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+      <version>27.0.1-jre</version>
+      <scope>compile</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>listenablefuture</artifactId>
+          <groupId>com.google.guava</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>javax.inject</groupId>
+      <artifactId>javax.inject</artifactId>
+      <version>1</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>4.5.13</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>commons-logging</artifactId>
+          <groupId>commons-logging</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-codec</artifactId>
+          <groupId>commons-codec</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpcore</artifactId>
+      <version>4.4.15</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.github.ben-manes.caffeine</groupId>
+      <artifactId>caffeine</artifactId>
+      <version>2.9.3</version>
+      <scope>compile</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.alipay.sofa</groupId>
+      <artifactId>sofa-rpc-all</artifactId>
+      <version>5.5.3</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>tracer-core</artifactId>
+          <groupId>com.alipay.sofa</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>resteasy-netty4</artifactId>
+          <groupId>org.jboss.resteasy</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>resteasy-client</artifactId>
+          <groupId>org.jboss.resteasy</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>resteasy-jackson-provider</artifactId>
+          <groupId>org.jboss.resteasy</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>lookout-api</artifactId>
+          <groupId>com.alipay.sofa.lookout</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>bolt</artifactId>
+          <groupId>com.alipay.sofa</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>sofa-common-tools</artifactId>
+          <groupId>com.alipay.sofa.common</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>hessian</artifactId>
+          <groupId>com.alipay.sofa</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.weibo</groupId>
+      <artifactId>motan-core</artifactId>
+      <version>1.0.0</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>slf4j-log4j12</artifactId>
+          <groupId>org.slf4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>metrics-core</artifactId>
+          <groupId>com.codahale.metrics</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>javapoet</artifactId>
+          <groupId>com.squareup</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-lang3</artifactId>
+          <groupId>org.apache.commons</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>log4j</artifactId>
+          <groupId>log4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-codec</artifactId>
+          <groupId>commons-codec</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.weibo</groupId>
+      <artifactId>motan-transport-netty</artifactId>
+      <version>1.0.0</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>slf4j-log4j12</artifactId>
+          <groupId>org.slf4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>netty</artifactId>
+          <groupId>org.jboss.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-lang3</artifactId>
+          <groupId>org.apache.commons</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>log4j</artifactId>
+          <groupId>log4j</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>commons-codec</artifactId>
+          <groupId>commons-codec</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>io.protostuff</groupId>
+      <artifactId>protostuff-core</artifactId>
+      <version>1.5.9</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>protostuff-api</artifactId>
+          <groupId>io.protostuff</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>io.protostuff</groupId>
+      <artifactId>protostuff-runtime</artifactId>
+      <version>1.5.9</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>protostuff-collectionschema</artifactId>
+          <groupId>io.protostuff</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>protostuff-api</artifactId>
+          <groupId>io.protostuff</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>io.grpc</groupId>
+      <artifactId>grpc-netty</artifactId>
+      <version>1.27.1</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>*</artifactId>
+          <groupId>io.netty</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>grpc-core</artifactId>
+          <groupId>io.grpc</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>io.grpc</groupId>
+      <artifactId>grpc-protobuf</artifactId>
+      <version>1.27.1</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>grpc-api</artifactId>
+          <groupId>io.grpc</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>proto-google-common-protos</artifactId>
+          <groupId>com.google.api.grpc</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>grpc-protobuf-lite</artifactId>
+          <groupId>io.grpc</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>io.grpc</groupId>
+      <artifactId>grpc-stub</artifactId>
+      <version>1.27.1</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>grpc-api</artifactId>
+          <groupId>io.grpc</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <version>5.1.35</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.postgresql</groupId>
+      <artifactId>postgresql</artifactId>
+      <version>42.1.4</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <version>2.12.6.1</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>jackson-annotations</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-core</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.esotericsoftware</groupId>
+      <artifactId>kryo</artifactId>
+      <version>5.3.0</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>reflectasm</artifactId>
+          <groupId>com.esotericsoftware</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>objenesis</artifactId>
+          <groupId>org.objenesis</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>minlog</artifactId>
+          <groupId>com.esotericsoftware</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>de.ruedigermoeller</groupId>
+      <artifactId>fst</artifactId>
+      <version>2.57</version>
+      <scope>provided</scope>
+      <exclusions>
+        <exclusion>
+          <artifactId>objenesis</artifactId>
+          <groupId>org.objenesis</groupId>
+        </exclusion>
+        <exclusion>
+          <artifactId>jackson-core</artifactId>
+          <groupId>com.fasterxml.jackson.core</groupId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>com.caucho</groupId>
+      <artifactId>hessian</artifactId>
+      <version>4.0.63</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>de.javakaffee</groupId>
+      <artifactId>kryo-serializers</artifactId>
+      <version>0.45</version>
+      <scope>provided</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.lz4</groupId>
+      <artifactId>lz4-java</artifactId>
+      <version>1.7.1</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+</project>
+

+ 738 - 0
all/pom.xml

@@ -0,0 +1,738 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Copyright 1999-2019 Seata.io Group.
+  ~
+  ~  Licensed 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>io.seata</groupId>
+        <artifactId>seata-build</artifactId>
+        <version>${revision}</version>
+        <relativePath>../build/pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>seata-all</artifactId>
+    <name>Seata All-in-one ${project.version}</name>
+    <description>Seata is an easy-to-use, high-performance, java based, open source distributed transaction solution.</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-dependencies</artifactId>
+                <version>${project.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <!-- seata projects -->
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-common</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-custom</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-apollo</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-nacos</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-zk</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-consul</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-etcd3</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-config-spring-cloud</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-custom</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-consul</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-eureka</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-nacos</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-redis</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-sofa</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-zk</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-discovery-etcd3</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-brpc</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-http</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-http-jakarta</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-dubbo-alibaba</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-sofa-rpc</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-motan</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-rm</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-rm-datasource</artifactId>
+            <version>${project.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>${project.groupId}</groupId>
+                    <artifactId>seata-compressor-all</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-sqlparser-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-sqlparser-antlr</artifactId>
+            <version>${project.version}</version>
+            <!-- Slimming down for 'seata-all.jar' -->
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-sqlparser-druid</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-spring</artifactId>
+            <version>${project.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>${project.groupId}</groupId>
+                    <artifactId>seata-serializer-all</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-tcc</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-tm</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-serializer-seata</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-serializer-protobuf</artifactId>
+            <version>${project.version}</version>
+            <!-- Slimming down for 'seata-all.jar' -->
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-grpc</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-hsf</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-serializer-kryo</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-serializer-fst</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-serializer-hessian</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-gzip</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-7z</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-bzip2</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-zip</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-lz4</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-deflater</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-compressor-zstd</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <!-- saga -->
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-saga-processctrl</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-saga-statelang</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-saga-engine</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-saga-rm</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-saga-tm</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.seata</groupId>
+            <artifactId>seata-saga-engine-store</artifactId>
+            <version>${project.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>${project.groupId}</groupId>
+                    <artifactId>seata-serializer-all</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <!-- spring  -->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-context</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-beans</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-aop</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-webmvc</artifactId>
+        </dependency>
+        <!-- the 3rd part -->
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.antlr</groupId>
+            <artifactId>antlr4</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.typesafe</groupId>
+            <artifactId>config</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-pool</groupId>
+            <artifactId>commons-pool</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo.extensions</groupId>
+            <artifactId>dubbo-filter-seata</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>dubbo</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.edas</groupId>
+            <artifactId>edas-sdk</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>net.bytebuddy</groupId>
+            <artifactId>byte-buddy</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>aopalliance</groupId>
+            <artifactId>aopalliance</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.101tec</groupId>
+            <artifactId>zkclient</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.sofa</groupId>
+            <artifactId>registry-client-all</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.spring</groupId>
+            <artifactId>spring-context-support</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba.nacos</groupId>
+            <artifactId>nacos-client</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.ctrip.framework.apollo</groupId>
+            <artifactId>apollo-client</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.netflix.eureka</groupId>
+            <artifactId>eureka-client</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.netflix.archaius</groupId>
+            <artifactId>archaius-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.ecwid.consul</groupId>
+            <artifactId>consul-api</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.etcd</groupId>
+            <artifactId>jetcd-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.google.guava</groupId>
+                    <artifactId>listenablefuture</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>javax.inject</groupId>
+            <artifactId>javax.inject</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpcore</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.github.ben-manes.caffeine</groupId>
+            <artifactId>caffeine</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alipay.sofa</groupId>
+            <artifactId>sofa-rpc-all</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.weibo</groupId>
+            <artifactId>motan-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.weibo</groupId>
+            <artifactId>motan-transport-netty</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.protostuff</groupId>
+            <artifactId>protostuff-core</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.protostuff</groupId>
+            <artifactId>protostuff-runtime</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty</artifactId>
+            <scope>provided</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.netty</groupId>
+                    <artifactId>*</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.esotericsoftware</groupId>
+            <artifactId>kryo</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>de.ruedigermoeller</groupId>
+            <artifactId>fst</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.caucho</groupId>
+            <artifactId>hessian</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>de.javakaffee</groupId>
+            <artifactId>kryo-serializers</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.lz4</groupId>
+            <artifactId>lz4-java</artifactId>
+            <scope>provided</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+                <version>${os-maven-plugin.version}</version>
+            </extension>
+        </extensions>
+        <resources>
+            <resource>
+                <directory>${user.dir}</directory>
+                <includes>
+                    <include>LICENSE</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <!-- Shade -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-shade-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>shade</goal>
+                        </goals>
+                        <configuration>
+                            <createSourcesJar>true</createSourcesJar>
+                            <promoteTransitiveDependencies>false</promoteTransitiveDependencies>
+                            <keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
+                            <createDependencyReducedPom>true</createDependencyReducedPom>
+                            <artifactSet>
+                                <includes>
+                                    <include>io.seata:*</include>
+                                </includes>
+                            </artifactSet>
+                            <transformers>
+                                <!-- META-INF/services -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
+                                <!-- spring相关 -->
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/spring.handlers</resource>
+                                </transformer>
+                                <transformer
+                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>META-INF/spring.schemas</resource>
+                                </transformer>
+                            </transformers>
+                            <filters>
+                                <filter>
+                                    <artifact>*:*</artifact>
+                                    <excludes>
+                                        <exclude>file.conf</exclude>
+                                        <exclude>registry.conf</exclude>
+                                    </excludes>
+                                </filter>
+                                <filter>
+                                    <artifact>*:*</artifact>
+                                    <excludes>
+                                        <exclude>META-INF/maven/**</exclude>
+                                    </excludes>
+                                </filter>
+                            </filters>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <!-- Easyj -->
+            <plugin>
+                <groupId>icu.easyj.maven.plugins</groupId>
+                <artifactId>easyj-maven-plugin</artifactId>
+                <executions>
+                    <!-- Use this goal to recreate the '.flattened-pom.xml' after shade. -->
+                    <execution>
+                        <id>create-pom-file</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>create-pom-file</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <!-- the config of the 'simplify-pom' plugin -->
+                <configuration>
+                    <keepProvidedDependencies>true</keepProvidedDependencies>
+                    <keepOptionalDependencies>true</keepOptionalDependencies>
+                    <excludeDependencies>
+                        <!-- Exclude dependencies that need to be shaded. -->
+                        <dependency>io.seata:*</dependency>
+                    </excludeDependencies>
+                </configuration>
+            </plugin>
+            <!-- Dependency -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <profile>
+            <id>release</id>
+            <build>
+                <plugins>
+                    <!-- Javadoc -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <charset>${project.build.sourceEncoding}</charset>
+                            <failOnError>false</failOnError>
+                            <encoding>${project.build.sourceEncoding}</encoding>
+                            <detectOfflineLinks>true</detectOfflineLinks>
+                            <breakiterator>true</breakiterator>
+                            <author>false</author>
+                            <keywords>true</keywords>
+                            <quiet>true</quiet>
+                            <includeDependencySources>true</includeDependencySources>
+                            <dependencySourceIncludes>
+                                <dependencySourceInclude>io.seata:seata-*</dependencySourceInclude>
+                            </dependencySourceIncludes>
+                            <additionalparam>-Xdoclint:none</additionalparam>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <id>attach-javadocs</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+</project>

+ 218 - 0
all/target/classes/LICENSE

@@ -0,0 +1,218 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        https://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (properties) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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
+
+       https://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.
+
+=======================================================================
+Seata Subcomponents:
+
+The Seata project contains subcomponents with separate copyright
+notices and license terms. Your use of the source code for the these
+subcomponents is subject to the terms and conditions of the following
+licenses.
+
+========================================================================
+Apache 2.0 licenses
+========================================================================
+
+The following components are provided under the Apache License. See project link for details.
+The text of each license is the standard Apache 2.0 license.
+
+    Apache: skywalking 8.4.0: https://github.com/apache/skywalking, Apache 2.0

+ 3 - 0
all/target/maven-archiver/pom.properties

@@ -0,0 +1,3 @@
+artifactId=seata-all
+groupId=io.seata
+version=1.6.1

二進制
all/target/original-seata-all-1.6.1.jar


二進制
all/target/seata-all-1.6.1-sources.jar


二進制
all/target/seata-all-1.6.1.jar


+ 368 - 0
bom/.flattened-pom.xml

@@ -0,0 +1,368 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>io.seata</groupId>
+	<artifactId>seata-bom</artifactId>
+	<version>1.6.1</version>
+	<packaging>pom</packaging>
+	<name>Seata bom 1.6.1</name>
+	<description>Seata bom</description>
+	<url>https://seata.io</url>
+	<organization>
+		<name>Seata</name>
+		<url>https://github.com/seata</url>
+	</organization>
+	<licenses>
+		<license>
+			<name>Apache License, Version 2.0</name>
+			<url>https://www.apache.org/licenses/LICENSE-2.0</url>
+			<distribution>repo</distribution>
+		</license>
+	</licenses>
+	<developers>
+		<developer>
+			<id>Seata</id>
+			<name>Seata</name>
+			<email>dev-seata@googlegroups.com</email>
+			<url>https://seata.io</url>
+		</developer>
+	</developers>
+	<scm>
+		<connection>scm:git@github.com:seata/seata.git</connection>
+		<developerConnection>scm:git@github.com:seata/seata.git</developerConnection>
+		<url>git@github.com:seata/seata.git</url>
+	</scm>
+	<issueManagement>
+		<system>github</system>
+		<url>https://github.com/seata/seata/issues</url>
+	</issueManagement>
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-all</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-common</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-core</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-custom</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-apollo</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-nacos</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-zk</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-all</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-etcd3</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-consul</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-config-spring-cloud</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-core</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-consul</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-core</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-custom</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-all</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-eureka</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-zk</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-redis</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-nacos</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-etcd3</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-discovery-sofa</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-brpc</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-dubbo</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-dubbo-alibaba</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-sofa-rpc</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-motan</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-grpc</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-hsf</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-http</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-rm</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-rm-datasource</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-spring</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-tcc</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-tm</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-metrics-all</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-metrics-api</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-metrics-core</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-metrics-registry-compact</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-metrics-exporter-prometheus</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-serializer-all</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-serializer-protobuf</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-serializer-seata</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-serializer-kryo</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-serializer-hessian</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-serializer-fst</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-spring-boot-starter</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-all</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-gzip</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-zip</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-7z</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-bzip2</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-lz4</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-deflater</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-compressor-zstd</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-saga-processctrl</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-saga-statelang</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-saga-engine</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-saga-rm</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-saga-tm</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-saga-engine-store</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-sqlparser-core</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-sqlparser-antlr</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>seata-sqlparser-druid</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+			<dependency>
+				<groupId>io.seata</groupId>
+				<artifactId>apm-seata-skywalking-plugin</artifactId>
+				<version>1.6.1</version>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+</project>

+ 370 - 0
bom/pom.xml

@@ -0,0 +1,370 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Copyright 1999-2019 Seata.io Group.
+  ~
+  ~  Licensed 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>io.seata</groupId>
+        <artifactId>seata-build</artifactId>
+        <version>${revision}</version>
+        <relativePath>../build/pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>seata-bom</artifactId>
+    <packaging>pom</packaging>
+
+    <name>Seata bom ${project.version}</name>
+    <description>Seata bom</description>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-all</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-common</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-custom</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-apollo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-nacos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-zk</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-all</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-etcd3</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-consul</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-config-spring-cloud</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-consul</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-custom</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-all</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-eureka</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-zk</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-redis</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-nacos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-etcd3</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-discovery-sofa</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-brpc</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-dubbo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-dubbo-alibaba</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-sofa-rpc</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-motan</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-grpc</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-hsf</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-http</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-rm</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-rm-datasource</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <!-- the 'seata-server' is an application, not a dependency
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-server</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            -->
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-spring</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-tcc</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-tm</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-metrics-all</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-metrics-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-metrics-core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-metrics-registry-compact</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-metrics-exporter-prometheus</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-serializer-all</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-serializer-protobuf</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-serializer-seata</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-serializer-kryo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-serializer-hessian</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-serializer-fst</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-spring-boot-starter</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-all</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-gzip</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-zip</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-7z</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-bzip2</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-lz4</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-deflater</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-compressor-zstd</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-saga-processctrl</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-saga-statelang</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-saga-engine</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-saga-rm</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-saga-tm</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-saga-engine-store</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-sqlparser-core</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-sqlparser-antlr</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>seata-sqlparser-druid</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.seata</groupId>
+                <artifactId>apm-seata-skywalking-plugin</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+</project>

+ 325 - 0
build/.flattened-pom.xml

@@ -0,0 +1,325 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>io.seata</groupId>
+	<artifactId>seata-build</artifactId>
+	<version>1.6.1</version>
+	<packaging>pom</packaging>
+	<name>Seata Build 1.6.1</name>
+	<description>plugin management for Seata built with Maven</description>
+	<url>https://seata.io</url>
+	<organization>
+		<name>Seata</name>
+		<url>https://github.com/seata</url>
+	</organization>
+	<licenses>
+		<license>
+			<name>Apache License, Version 2.0</name>
+			<url>https://www.apache.org/licenses/LICENSE-2.0</url>
+			<distribution>repo</distribution>
+		</license>
+	</licenses>
+	<developers>
+		<developer>
+			<id>Seata</id>
+			<name>Seata</name>
+			<email>dev-seata@googlegroups.com</email>
+			<url>https://seata.io</url>
+		</developer>
+	</developers>
+	<scm>
+		<connection>scm:git@github.com:seata/seata.git</connection>
+		<developerConnection>scm:git@github.com:seata/seata.git</developerConnection>
+		<url>git@github.com:seata/seata.git</url>
+	</scm>
+	<issueManagement>
+		<system>github</system>
+		<url>https://github.com/seata/seata/issues</url>
+	</issueManagement>
+	<properties>
+		<checkstyle.skip>true</checkstyle.skip>
+		<dependencies.copy.skip>true</dependencies.copy.skip>
+		<easyj-maven-plugin.version>1.0.5</easyj-maven-plugin.version>
+		<gpg.arg1/>
+		<gpg.arg2/>
+		<gpg.keyname>A1C4DAB9B220DBA0C277E945D6A1420D747D1EE0</gpg.keyname>
+		<image.publish.skip>true</image.publish.skip>
+		<image.tags>latest</image.tags>
+		<jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version>
+		<java.version>1.8</java.version>
+		<jib-maven-plugin.version>3.2.0</jib-maven-plugin.version>
+		<junit-jupiter.version>5.8.2</junit-jupiter.version>
+		<junit-platform.version>1.8.2</junit-platform.version>
+		<kotlin-maven-plugin.version>1.3.72</kotlin-maven-plugin.version>
+		<license-maven-plugin.version>3.0</license-maven-plugin.version>
+		<license.skip>true</license.skip>
+		<maven-antrun-plugin.version>1.8</maven-antrun-plugin.version>
+		<maven-assembly-plugin.version>3.0.0</maven-assembly-plugin.version>
+		<maven-checkstyle-plugin.version>3.1.1</maven-checkstyle-plugin.version>
+		<maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
+		<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+		<maven-dependency-plugin.version>3.0.2</maven-dependency-plugin.version>
+		<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
+		<maven-enforcer-plugin.version>3.0.0-M3</maven-enforcer-plugin.version>
+		<maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
+		<maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
+		<maven-javadoc-plugin.version>3.0.0</maven-javadoc-plugin.version>
+		<maven-pmd-plugin.version>3.8</maven-pmd-plugin.version>
+		<maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
+		<maven-shade-plugin.version>2.4.3</maven-shade-plugin.version>
+		<maven-source-plugin.version>2.2.1</maven-source-plugin.version>
+		<maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
+		<maven.compiler.source>${java.version}</maven.compiler.source>
+		<maven.compiler.target>${java.version}</maven.compiler.target>
+		<maven.surefire.argLine/>
+		<maven.test.skip>false</maven.test.skip>
+		<mojo-license-maven-plugin.version>1.20</mojo-license-maven-plugin.version>
+		<nexus-staging-maven-plugin.version>1.6.7</nexus-staging-maven-plugin.version>
+		<os-maven-plugin.version>1.5.0.Final</os-maven-plugin.version>
+		<p3c-pmd.version>1.3.6</p3c-pmd.version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
+		<spring-boot.version>2.5.13</spring-boot.version>
+		<spring-framework.version>5.3.19</spring-framework.version>
+	</properties>
+	<build>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<artifactId>maven-deploy-plugin</artifactId>
+					<version>${maven-deploy-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<artifactId>maven-shade-plugin</artifactId>
+					<version>${maven-shade-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<artifactId>maven-dependency-plugin</artifactId>
+					<version>${maven-dependency-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<artifactId>maven-checkstyle-plugin</artifactId>
+					<version>${maven-checkstyle-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<version>${maven-javadoc-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<groupId>org.xolstice.maven.plugins</groupId>
+					<artifactId>protobuf-maven-plugin</artifactId>
+					<version>${protobuf-maven-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<groupId>com.mycila</groupId>
+					<artifactId>license-maven-plugin</artifactId>
+					<version>${license-maven-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<groupId>org.codehaus.mojo</groupId>
+					<artifactId>license-maven-plugin</artifactId>
+					<version>${mojo-license-maven-plugin.version}</version>
+				</plugin>
+				<plugin>
+					<groupId>icu.easyj.maven.plugins</groupId>
+					<artifactId>easyj-maven-plugin</artifactId>
+					<version>${easyj-maven-plugin.version}</version>
+					<executions>
+						<execution>
+							<id>simplify-pom</id>
+							<goals>
+								<goal>simplify-pom</goal>
+							</goals>
+						</execution>
+					</executions>
+					<configuration>
+						<simplifiedPomFileName>.flattened-pom.xml</simplifiedPomFileName>
+						<useTabIndent>true</useTabIndent>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+		<plugins>
+			<plugin>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>${maven-compiler-plugin.version}</version>
+				<configuration>
+					<source>${maven.compiler.source}</source>
+					<target>${maven.compiler.target}</target>
+					<encoding>${project.build.sourceEncoding}</encoding>
+					<parameters>true</parameters>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-resources-plugin</artifactId>
+				<version>${maven-resources-plugin.version}</version>
+				<configuration>
+					<encoding>${project.build.sourceEncoding}</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>${maven-jar-plugin.version}</version>
+				<configuration>
+					<archive>
+						<addMavenDescriptor>true</addMavenDescriptor>
+						<index>true</index>
+						<manifest>
+							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+						</manifest>
+						<manifestEntries>
+							<Implementation-Build>${maven.build.timestamp}</Implementation-Build>
+						</manifestEntries>
+					</archive>
+					<excludes>
+						<exclude>**/META-INF/additional-spring-configuration-metadata.json</exclude>
+						<exclude>protobuf/**</exclude>
+						<exclude>**/*.proto</exclude>
+						<exclude>static/console-fe/**</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+			<plugin>
+				<artifactId>maven-clean-plugin</artifactId>
+				<version>${maven-clean-plugin.version}</version>
+				<configuration>
+					<filesets>
+						<fileset>
+							<directory>./</directory>
+							<includes>
+								<include>*-pom.xml</include>
+								<include>**/db_store/**</include>
+								<include>**/sessionStore/**</include>
+								<include>**/root.data</include>
+							</includes>
+							<followSymlinks>false</followSymlinks>
+						</fileset>
+					</filesets>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>icu.easyj.maven.plugins</groupId>
+				<artifactId>easyj-maven-plugin</artifactId>
+			</plugin>
+			<plugin>
+				<artifactId>maven-enforcer-plugin</artifactId>
+				<version>${maven-enforcer-plugin.version}</version>
+				<executions>
+					<execution>
+						<id>enforce-maven</id>
+						<goals>
+							<goal>enforce</goal>
+						</goals>
+						<configuration>
+							<rules>
+								<requireMavenVersion>
+									<version>[3.6.0,)</version>
+								</requireMavenVersion>
+							</rules>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+	<profiles>
+		<profile>
+			<id>release</id>
+			<build>
+				<plugins>
+					<plugin>
+						<artifactId>maven-javadoc-plugin</artifactId>
+						<executions>
+							<execution>
+								<phase>package</phase>
+								<goals>
+									<goal>jar</goal>
+								</goals>
+							</execution>
+						</executions>
+						<configuration>
+							<charset>${project.build.sourceEncoding}</charset>
+							<encoding>${project.build.sourceEncoding}</encoding>
+							<failOnError>false</failOnError>
+						</configuration>
+					</plugin>
+					<plugin>
+						<groupId>org.sonatype.plugins</groupId>
+						<artifactId>nexus-staging-maven-plugin</artifactId>
+						<version>${nexus-staging-maven-plugin.version}</version>
+						<extensions>true</extensions>
+						<configuration>
+							<serverId>oss_seata</serverId>
+							<nexusUrl>https://oss.sonatype.org/</nexusUrl>
+							<autoReleaseAfterClose>false</autoReleaseAfterClose>
+						</configuration>
+					</plugin>
+					<plugin>
+						<artifactId>maven-gpg-plugin</artifactId>
+						<version>${maven-gpg-plugin.version}</version>
+						<executions>
+							<execution>
+								<id>sign-artifacts</id>
+								<phase>verify</phase>
+								<goals>
+									<goal>sign</goal>
+								</goals>
+								<configuration>
+									<keyname>${gpg.keyname}</keyname>
+									<gpgArguments>
+										<arg>${gpg.arg1}</arg>
+										<arg>${gpg.arg2}</arg>
+									</gpgArguments>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+			<distributionManagement>
+				<repository>
+					<id>oss_seata</id>
+					<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+				</repository>
+				<snapshotRepository>
+					<id>oss_seata</id>
+					<url>https://oss.sonatype.org/content/repositories/snapshots</url>
+				</snapshotRepository>
+			</distributionManagement>
+			<properties>
+				<image.tags>${project.version},latest</image.tags>
+			</properties>
+		</profile>
+		<profile>
+			<id>release-by-github-actions</id>
+			<properties>
+				<gpg.arg1>--pinentry-mode</gpg.arg1>
+				<gpg.arg2>loopback</gpg.arg2>
+			</properties>
+		</profile>
+		<profile>
+			<id>args-for-test-by-jdk17</id>
+			<activation>
+				<jdk>17</jdk>
+			</activation>
+			<properties>
+				<maven.surefire.argLine>--add-opens java.base/java.lang=ALL-UNNAMED
+                    --add-opens java.base/java.net=ALL-UNNAMED
+                    --add-opens java.base/java.math=ALL-UNNAMED
+                    --add-opens java.base/java.text=ALL-UNNAMED
+                    --add-opens java.base/java.util=ALL-UNNAMED
+                    --add-opens java.base/java.util.regex=ALL-UNNAMED
+                    --add-opens java.base/java.util.concurrent=ALL-UNNAMED
+                    --add-opens java.sql/java.sql=ALL-UNNAMED
+                    --add-opens java.sql.rowset/javax.sql.rowset.serial=ALL-UNNAMED
+                    --illegal-access=permit
+                    -Dillegal-access=permit</maven.surefire.argLine>
+				<os.detected.arch>x86_64</os.detected.arch>
+				<os.detected.classifier>windows-x86_64</os.detected.classifier>
+				<os.detected.name>windows</os.detected.name>
+			</properties>
+		</profile>
+	</profiles>
+</project>

+ 404 - 0
build/pom.xml

@@ -0,0 +1,404 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Copyright 1999-2019 Seata.io Group.
+  ~
+  ~  Licensed 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
+  ~
+  ~       https://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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>io.seata</groupId>
+    <artifactId>seata-build</artifactId>
+    <packaging>pom</packaging>
+    <version>${revision}</version>
+
+    <name>Seata Build ${project.version}</name>
+    <description>plugin management for Seata built with Maven</description>
+    <licenses>
+        <license>
+            <name>Apache License, Version 2.0</name>
+            <url>https://www.apache.org/licenses/LICENSE-2.0</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <organization>
+        <name>Seata</name>
+        <url>https://github.com/seata</url>
+    </organization>
+
+    <url>https://seata.io</url>
+
+    <developers>
+        <developer>
+            <id>Seata</id>
+            <name>Seata</name>
+            <url>https://seata.io</url>
+            <email>dev-seata@googlegroups.com</email>
+        </developer>
+    </developers>
+
+    <issueManagement>
+        <system>github</system>
+        <url>https://github.com/seata/seata/issues</url>
+    </issueManagement>
+
+    <scm>
+        <url>git@github.com:seata/seata.git</url>
+        <connection>scm:git@github.com:seata/seata.git</connection>
+        <developerConnection>scm:git@github.com:seata/seata.git</developerConnection>
+    </scm>
+
+    <properties>
+        <!-- seata version -->
+        <revision>1.6.1</revision>
+
+        <!-- Compiler settings properties -->
+        <java.version>1.8</java.version>
+        <maven.compiler.source>${java.version}</maven.compiler.source>
+        <maven.compiler.target>${java.version}</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+
+        <!-- The version of spring-boot for 'spring-boot-dependencies' and 'spring-boot-maven-plugin' -->
+        <spring-boot.version>2.5.13</spring-boot.version>
+        <spring-framework.version>5.3.19</spring-framework.version>
+
+        <!-- For test -->
+        <junit-jupiter.version>5.8.2</junit-jupiter.version>
+        <junit-platform.version>1.8.2</junit-platform.version>
+
+        <!-- Maven plugin versions -->
+        <!-- Build -->
+        <easyj-maven-plugin.version>1.0.5</easyj-maven-plugin.version>
+        <maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
+        <!-- Compiler -->
+        <maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
+        <protobuf-maven-plugin.version>0.6.1</protobuf-maven-plugin.version>
+        <kotlin-maven-plugin.version>1.3.72</kotlin-maven-plugin.version>
+        <!-- Check -->
+        <maven-pmd-plugin.version>3.8</maven-pmd-plugin.version>
+        <p3c-pmd.version>1.3.6</p3c-pmd.version>
+        <maven-javadoc-plugin.version>3.0.0</maven-javadoc-plugin.version>
+        <license-maven-plugin.version>3.0</license-maven-plugin.version>
+        <mojo-license-maven-plugin.version>1.20</mojo-license-maven-plugin.version>
+        <maven-checkstyle-plugin.version>3.1.1</maven-checkstyle-plugin.version>
+        <maven-enforcer-plugin.version>3.0.0-M3</maven-enforcer-plugin.version>
+        <!-- Test -->
+        <maven-surefire-plugin.version>3.0.0-M5</maven-surefire-plugin.version>
+        <jacoco-maven-plugin.version>0.8.7</jacoco-maven-plugin.version>
+        <!-- Packaging -->
+        <maven-source-plugin.version>2.2.1</maven-source-plugin.version>
+        <maven-resources-plugin.version>3.2.0</maven-resources-plugin.version>
+        <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
+        <maven-shade-plugin.version>2.4.3</maven-shade-plugin.version>
+        <maven-dependency-plugin.version>3.0.2</maven-dependency-plugin.version>
+        <maven-assembly-plugin.version>3.0.0</maven-assembly-plugin.version>
+        <jib-maven-plugin.version>3.2.0</jib-maven-plugin.version>
+        <!-- Deploy && GPG -->
+        <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
+        <nexus-staging-maven-plugin.version>1.6.7</nexus-staging-maven-plugin.version>
+        <maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
+        <!-- Other -->
+        <maven-antrun-plugin.version>1.8</maven-antrun-plugin.version>
+        <os-maven-plugin.version>1.5.0.Final</os-maven-plugin.version>
+
+        <!-- Default values of the Maven plugins -->
+        <checkstyle.skip>true</checkstyle.skip>
+        <license.skip>true</license.skip>
+        <maven.test.skip>false</maven.test.skip>
+        <maven.surefire.argLine></maven.surefire.argLine>
+        <gpg.keyname>A1C4DAB9B220DBA0C277E945D6A1420D747D1EE0</gpg.keyname>
+        <gpg.arg1/>
+        <gpg.arg2/>
+
+        <!-- For docker image-->
+        <image.publish.skip>true</image.publish.skip>
+        <image.tags>latest</image.tags>
+
+        <dependencies.copy.skip>true</dependencies.copy.skip>
+    </properties>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>${maven-deploy-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-shade-plugin</artifactId>
+                    <version>${maven-shade-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <version>${maven-dependency-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-checkstyle-plugin</artifactId>
+                    <version>${maven-checkstyle-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>${maven-javadoc-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.xolstice.maven.plugins</groupId>
+                    <artifactId>protobuf-maven-plugin</artifactId>
+                    <version>${protobuf-maven-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>com.mycila</groupId>
+                    <artifactId>license-maven-plugin</artifactId>
+                    <version>${license-maven-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.codehaus.mojo</groupId>
+                    <artifactId>license-maven-plugin</artifactId>
+                    <version>${mojo-license-maven-plugin.version}</version>
+                </plugin>
+                <plugin>
+                    <groupId>icu.easyj.maven.plugins</groupId>
+                    <artifactId>easyj-maven-plugin</artifactId>
+                    <version>${easyj-maven-plugin.version}</version>
+                    <!-- This goal can replace flatten-maven-plugin to flatten the pom, and replace '${revision}' to the actual version. -->
+                    <executions>
+                        <execution>
+                            <id>simplify-pom</id>
+                            <goals>
+                                <goal>simplify-pom</goal>
+                            </goals>
+                        </execution>
+                    </executions>
+                    <configuration>
+                        <simplifiedPomFileName>.flattened-pom.xml</simplifiedPomFileName>
+                        <useTabIndent>true</useTabIndent>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+
+        <plugins>
+            <!-- Compiler -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>${maven-compiler-plugin.version}</version>
+                <configuration>
+                    <source>${maven.compiler.source}</source>
+                    <target>${maven.compiler.target}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                    <parameters>true</parameters>
+                </configuration>
+            </plugin>
+            <!-- Resources -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <version>${maven-resources-plugin.version}</version>
+                <configuration>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+            <!-- Jar -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <version>${maven-jar-plugin.version}</version>
+                <configuration>
+                    <archive>
+                        <addMavenDescriptor>true</addMavenDescriptor>
+                        <index>true</index>
+                        <manifest>
+                            <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+                        </manifest>
+                        <manifestEntries>
+                            <Implementation-Build>${maven.build.timestamp}</Implementation-Build>
+                        </manifestEntries>
+                    </archive>
+                    <excludes>
+                        <exclude>**/META-INF/additional-spring-configuration-metadata.json</exclude>
+                        <exclude>protobuf/**</exclude>
+                        <exclude>**/*.proto</exclude>
+                        <exclude>static/console-fe/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <!-- Clean -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-clean-plugin</artifactId>
+                <version>${maven-clean-plugin.version}</version>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>./</directory>
+                            <includes>
+                                <include>*-pom.xml</include>
+                                <include>**/db_store/**</include>
+                                <include>**/sessionStore/**</include>
+                                <include>**/root.data</include>
+                            </includes>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+            <!-- EasyJ -->
+            <plugin>
+                <groupId>icu.easyj.maven.plugins</groupId>
+                <artifactId>easyj-maven-plugin</artifactId>
+            </plugin>
+            <!-- Enforcer -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-enforcer-plugin</artifactId>
+                <version>${maven-enforcer-plugin.version}</version>
+                <executions>
+                    <execution>
+                        <id>enforce-maven</id>
+                        <goals>
+                            <goal>enforce</goal>
+                        </goals>
+                        <configuration>
+                            <rules>
+                                <requireMavenVersion>
+                                    <version>[3.6.0,)</version>
+                                </requireMavenVersion>
+                            </rules>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <profiles>
+        <!-- profile: release -->
+        <profile>
+            <id>release</id>
+            <properties>
+                <image.tags>${project.version},latest</image.tags>
+            </properties>
+            <build>
+                <plugins>
+                    <!-- Javadoc -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <configuration>
+                            <charset>${project.build.sourceEncoding}</charset>
+                            <encoding>${project.build.sourceEncoding}</encoding>
+                            <failOnError>false</failOnError>
+                        </configuration>
+                        <executions>
+                            <execution>
+                                <phase>package</phase>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <!-- Staging -->
+                    <plugin>
+                        <groupId>org.sonatype.plugins</groupId>
+                        <artifactId>nexus-staging-maven-plugin</artifactId>
+                        <version>${nexus-staging-maven-plugin.version}</version>
+                        <extensions>true</extensions>
+                        <configuration>
+                            <serverId>oss_seata</serverId>
+                            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
+                            <autoReleaseAfterClose>false</autoReleaseAfterClose>
+                        </configuration>
+                    </plugin>
+                    <!-- GPG -->
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <version>${maven-gpg-plugin.version}</version>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                                <configuration>
+                                    <keyname>${gpg.keyname}</keyname>
+                                    <gpgArguments>
+                                        <arg>${gpg.arg1}</arg>
+                                        <arg>${gpg.arg2}</arg>
+                                    </gpgArguments>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+            <!-- distribution management -->
+            <distributionManagement>
+                <repository>
+                    <id>oss_seata</id>
+                    <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+                </repository>
+                <snapshotRepository>
+                    <id>oss_seata</id>
+                    <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+                </snapshotRepository>
+            </distributionManagement>
+        </profile>
+
+        <!-- profile: release-by-github-actions -->
+        <profile>
+            <id>release-by-github-actions</id>
+            <properties>
+                <gpg.arg1>--pinentry-mode</gpg.arg1>
+                <gpg.arg2>loopback</gpg.arg2>
+            </properties>
+        </profile>
+
+        <!-- profile: args-for-test-by-jdk17 -->
+        <profile>
+            <id>args-for-test-by-jdk17</id>
+            <activation>
+                <jdk>17</jdk>
+            </activation>
+            <properties>
+                <maven.surefire.argLine>
+                    --add-opens java.base/java.lang=ALL-UNNAMED
+                    --add-opens java.base/java.net=ALL-UNNAMED
+                    --add-opens java.base/java.math=ALL-UNNAMED
+                    --add-opens java.base/java.text=ALL-UNNAMED
+                    --add-opens java.base/java.util=ALL-UNNAMED
+                    --add-opens java.base/java.util.regex=ALL-UNNAMED
+                    --add-opens java.base/java.util.concurrent=ALL-UNNAMED
+
+                    --add-opens java.sql/java.sql=ALL-UNNAMED
+                    --add-opens java.sql.rowset/javax.sql.rowset.serial=ALL-UNNAMED
+
+                    --illegal-access=permit
+                    -Dillegal-access=permit
+                </maven.surefire.argLine>
+            </properties>
+        </profile>
+    </profiles>
+</project>

+ 5 - 0
changeVersion.sh

@@ -0,0 +1,5 @@
+echo "./changeVersion.sh oldVersion newVersion"
+echo $1
+echo $2
+find ./ -name pom.xml | grep -v target | xargs perl -pi -e "s|$1|$2|g"
+#find ./ -name Version.java | grep -v target | xargs perl -pi -e "s|$1|$2|g"

+ 177 - 0
changes/en-us/1.4.2.md

@@ -0,0 +1,177 @@
+### 1.4.2  	
+
+ [source](https://github.com/seata/seata/archive/v1.4.2.zip) |	
+ [binary](https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip) 	
+
+<details>	
+  <summary><mark>Release notes</mark></summary>	
+
+
+  ### Seata 1.4.2 	
+
+  Seata 1.4.2 Released.	
+
+  Seata is an easy-to-use, high-performance, open source distributed transaction solution.	
+
+  The version is updated as follows:	
+
+  ### feature:	
+
+  - [[#3172](https://github.com/seata/seata/pull/3172)] support undo_loge compression mode in AT	
+  - [[#3372](https://github.com/seata/seata/pull/3372)] Saga support customize whether update last retry log	
+  - [[#3411](https://github.com/seata/seata/pull/3411)] support seata server thread pool parameters configuration	
+  - [[#3348](https://github.com/seata/seata/pull/3348)] support redis sentinel storage mode in TC	
+  - [[#2667](https://github.com/seata/seata/pull/2667)] support password decryption	when using db and redis storage mode
+  - [[#3427](https://github.com/seata/seata/pull/3427)] add distributed lock interface	
+  - [[#3443](https://github.com/seata/seata/pull/3443)] send the `seata-server` log to `logstash` or `kafka`
+  - [[#3486](https://github.com/seata/seata/pull/3486)] add transaction service group for metric
+  - [[#3317](https://github.com/seata/seata/pull/3317)] support to obtain multiple configurations through a single node when using zookeeper as configuration center 
+  - [[#2933](https://github.com/seata/seata/pull/2933)] add antlr for mysql sqlparser
+  - [[#3228](https://github.com/seata/seata/pull/3228)] support custom serialization plugin
+  - [[#3516](https://github.com/seata/seata/pull/3516)] support acl-token when consul is used registry and configuration center 
+  - [[#3116](https://github.com/seata/seata/pull/3116)] support configuring apolloService and apolloCluster
+  - [[#3468](https://github.com/seata/seata/pull/3468)] saga support loop execution on state
+  - [[#3447](https://github.com/seata/seata/pull/3447)] support Transaction context printing in logging framework
+
+
+  ### bugfix:	
+
+  - [[#3258](https://github.com/seata/seata/pull/3258)] fix AsyncWorker potential OOM problem 	
+  - [[#3293](https://github.com/seata/seata/pull/3293)] fix configuration cache get value type mismatch exception
+  - [[#3241](https://github.com/seata/seata/pull/3241)] forbidden use order by or limit in multi sql	
+  - [[#3406](https://github.com/seata/seata/pull/3406)] fix the value can not be push to nacos when special charset in config.txt	
+  - [[#3418](https://github.com/seata/seata/pull/3418)] fix getGeneratedKeys may get history pk	
+  - [[#3408](https://github.com/seata/seata/pull/3408)] fix the NPE problem of jar running mode when the third-dependency on separate packaging
+  - [[#3431](https://github.com/seata/seata/pull/3431)] fix property bean may not be initialized when reading configuration	
+  - [[#3413](https://github.com/seata/seata/pull/3413)] fix the logic of rollback to savepoint and release to savepoint	
+  - [[#3367](https://github.com/seata/seata/pull/3367)] when the xa branch is rollback, it cannot be executed due to idle state
+  - [[#3448](https://github.com/seata/seata/pull/3448)] reduce unnecessary competition and remove missing locks 
+  - [[#3451](https://github.com/seata/seata/pull/3451)] fix set auto-commit to true when local transactions are not being used. Failure to compete for a lock causes the global transaction to exit, invaliding the global row lock and dirty writing of the data.
+  - [[#3481](https://github.com/seata/seata/pull/3481)] fix seata node refresh failure because of consul client throws exceptions
+  - [[#3491](https://github.com/seata/seata/pull/3491)] fix typo in README.md
+  - [[#3531](https://github.com/seata/seata/pull/3531)] fix the NPE of RedisTransactionStoreManager when get branch transactions
+  - [[#3500](https://github.com/seata/seata/pull/3500)] fix oracle and postgreSQL can't query column info
+  - [[#3560](https://github.com/seata/seata/pull/3560)] fix the problem that the asynchronous task of the transactions in the committing state has no time threshold and cannot recover the transaction
+  - [[#3555](https://github.com/seata/seata/pull/3555)] do not call setBlob to invalid the jdbc exception
+  - [[#3540](https://github.com/seata/seata/pull/3540)] fix server distribution missing files
+  - [[#3597](https://github.com/seata/seata/pull/3597)] fix the possible NPE
+  - [[#3568](https://github.com/seata/seata/pull/3568)] fix automatic datasource agent caused by ConcurrentHashMap.computeIfAbsent Deadlock problem 
+  - [[#3402](https://github.com/seata/seata/pull/3402)] fix the problem that the updated column cannot be resolved because the field name in the updated SQL contains the database name
+  - [[#3464](https://github.com/seata/seata/pull/3464)] fix test case NPE and StackTraceLogger's log.
+  - [[#3522](https://github.com/seata/seata/pull/3522)] fix register branch and store undolog when AT branch does not need compete lock
+  - [[#3635](https://github.com/seata/seata/pull/3635)] fix pushing notification failed when the configuration changed in zookeeper
+  - [[#3133](https://github.com/seata/seata/pull/3133)] fix the case that could not retry acquire global lock
+  - [[#3156](https://github.com/seata/seata/pull/3156)] optimize the logic of SpringProxyUtils.findTargetClass
+
+
+  ### optimize: 	
+
+  - [[#3341](https://github.com/seata/seata/pull/3341)] optimize the format of the path to the specified configuration file
+  - [[#3385](https://github.com/seata/seata/pull/3385)] optimize github action and fix unit test failure	
+  - [[#3175](https://github.com/seata/seata/pull/3175)] improve UUIDGenerator using "history time" version of snowflake algorithm 	
+  - [[#3291](https://github.com/seata/seata/pull/3291)] mysql jdbc connect param	
+  - [[#3336](https://github.com/seata/seata/pull/3336)] support using System.getProperty to get netty config property
+  - [[#3369](https://github.com/seata/seata/pull/3369)] add github action secrets env for dockerHub	
+  - [[#3343](https://github.com/seata/seata/pull/3343)] Migrate CI provider from Travis CI to Github Actions	
+  - [[#3397](https://github.com/seata/seata/pull/3397)] add the change records folder	
+  - [[#3303](https://github.com/seata/seata/pull/3303)] supports reading all configurations from a single Nacos dataId	
+  - [[#3380](https://github.com/seata/seata/pull/3380)] globalTransactionScanner listener optimize	
+  - [[#3123](https://github.com/seata/seata/pull/3123)] optimize the packing strategy of seata-server	
+  - [[#3415](https://github.com/seata/seata/pull/3415)] optimize maven clean plugin to clear the distribution directory 	
+  - [[#3316](https://github.com/seata/seata/pull/3316)] optimize the property bean may not be initialized while reading config value	
+  - [[#3420](https://github.com/seata/seata/pull/3420)] optimize enumerated classes and add unit tests	
+  - [[#3533](https://github.com/seata/seata/pull/3533)] added interface to get current transaction role
+  - [[#3436](https://github.com/seata/seata/pull/3436)] optimize typo in SQLType class 	
+  - [[#3439](https://github.com/seata/seata/pull/3439)] adjust the order of springApplicationContextProvider so that it can be called before the XML bean
+  - [[#3248](https://github.com/seata/seata/pull/3248)] optimize the config of load-balance migration to belong the client node
+  - [[#3441](https://github.com/seata/seata/pull/3441)] optimize the auto-configuration processing of starter
+  - [[#3466](https://github.com/seata/seata/pull/3466)] String comparison uses equalsIgnoreCase()
+  - [[#3476](https://github.com/seata/seata/pull/3476)] support when the server parameter passed is hostname, it will be automatically converted to IP
+  - [[#3236](https://github.com/seata/seata/pull/3236)] optimize the conditions for executing unlocking
+  - [[#3485](https://github.com/seata/seata/pull/3485)] optimize useless codes in ConfigurationFactory
+  - [[#3505](https://github.com/seata/seata/pull/3505)] optimize useless if judgments in the GlobalTransactionScanner class
+  - [[#3544](https://github.com/seata/seata/pull/3544)] optimize the get pks by auto when auto generated keys is false
+  - [[#3549](https://github.com/seata/seata/pull/3549)] unified the length of xid in different tables when using DB storage mode
+  - [[#3551](https://github.com/seata/seata/pull/3551)] make RETRY_DEAD_THRESHOLD bigger and configurable
+  - [[#3589](https://github.com/seata/seata/pull/3589)] Changed exception check by JUnit API usage
+  - [[#3601](https://github.com/seata/seata/pull/3601)] make `LoadBalanceProperties` compatible with `spring-boot:2.x` and above
+  - [[#3513](https://github.com/seata/seata/pull/3513)] Saga SpringBeanService invoker support switch json parser
+  - [[#3318](https://github.com/seata/seata/pull/3318)] make CLIENT_TABLE_META_CHECKER_INTERVAL configurable
+  - [[#3371](https://github.com/seata/seata/pull/3371)] add applicationId for metric
+  - [[#3459](https://github.com/seata/seata/pull/3459)] remove duplicate validAddress code
+  - [[#3215](https://github.com/seata/seata/pull/3215)] opt the reload during startup in file mode
+  - [[#3631](https://github.com/seata/seata/pull/3631)] optimize  nacos-config.py  parameter
+  - [[#3638](https://github.com/seata/seata/pull/3638)] optimize the error when use update or delete with join in sql
+  - [[#3523](https://github.com/seata/seata/pull/3523)] optimize release savepoint when use oracle
+  - [[#3458](https://github.com/seata/seata/pull/3458)] reversion the deleted md
+  - [[#3574](https://github.com/seata/seata/pull/3574)] repair Spelling errors in comments in EventBus.java files
+  - [[#3573](https://github.com/seata/seata/pull/3573)] fix designer directory path in README.md
+  - [[#3662](https://github.com/seata/seata/pull/3662)] update gpg key
+  - [[#3664](https://github.com/seata/seata/pull/3664)] optimize some javadocs
+  - [[#3637](https://github.com/seata/seata/pull/3637)] register the participating companies and  pull request information
+
+  ### test	
+
+  - [[#3381](https://github.com/seata/seata/pull/3381)] test case for tmClient	
+  - [[#3607](https://github.com/seata/seata/pull/3607)] fixed bugs in EventBus unit tests
+  - [[#3579](https://github.com/seata/seata/pull/3579)] add test case for StringFormatUtils
+  - [[#3365](https://github.com/seata/seata/pull/3365)] optimize ParameterParserTest test case failed	
+  - [[#3359](https://github.com/seata/seata/pull/3359)] remove unused test case	
+  - [[#3578](https://github.com/seata/seata/pull/3578)] fix UnfinishedStubbing Exception in unit test case
+  - [[#3383](https://github.com/seata/seata/pull/3383)] optimize StatementProxyTest unit test
+
+
+
+  Thanks to these contributors for their code commits. Please report an unintended omission.  	
+
+  - [slievrly](https://github.com/slievrly) 
+  - [caohdgege](https://github.com/caohdgege) 
+  - [a364176773](https://github.com/a364176773) 
+  - [wangliang181230](https://github.com/wangliang181230)
+  - [xingfudeshi](https://github.com/xingfudeshi)
+  - [jsbxyyx](https://github.com/jsbxyyx) 
+  - [selfishlover](https://github.com/selfishlover)
+  - [l8189352](https://github.com/l81893521)
+  - [Rubbernecker](https://github.com/Rubbernecker)
+  - [lj2018110133](https://github.com/lj2018110133)
+  - [github-ganyu](https://github.com/github-ganyu)
+  - [dmego](https://github.com/dmego)
+  - [spilledyear](https://github.com/spilledyear)
+  - [hoverruan](https://github.com/hoverruan ) 
+  - [anselleeyy](https://github.com/anselleeyy)
+  - [Ifdevil](https://github.com/Ifdevil)
+  - [lvxianzheng](https://github.com/lvxianzheng)
+  - [MentosL](https://github.com/MentosL)
+  - [lian88jian](https://github.com/lian88jian)
+  - [litianyu1992](https://github.com/litianyu1992)
+  - [xyz327](https://github.com/xyz327)
+  - [13414850431](https://github.com/13414850431)
+  - [xuande](https://github.com/xuande)
+  - [tanggen](https://github.com/tanggen)
+  - [eas5](https://github.com/eas5)
+  - [nature80](https://github.com/nature80)
+  - [ls9527](https://github.com/ls9527)
+  - [drgnchan](https://github.com/drgnchan)
+  - [imyangyong](https://github.com/imyangyong)
+  - [sunlggggg](https://github.com/sunlggggg)
+  - [long187](https://github.com/long187)
+  - [h-zhi](https://github.com/h-zhi)
+  - [StellaiYang](https://github.com/StellaiYang)
+  - [slinpq](https://github.com/slinpq)
+  - [sustly](https://github.com/sustly)
+  - [cznc](https://github.com/cznc)
+  - [squallliu](https://github.com/squallliu)
+  - [81519434](https://github.com/81519434)
+  - [luoxn28](https://github.com/luoxn28)
+  
+  Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.	
+
+   #### Link	
+
+   - **Seata:** https://github.com/seata/seata  	
+   - **Seata-Samples:** https://github.com/seata/seata-samples   	
+   - **Release:** https://github.com/seata/seata/releases	
+   - **WebSite:** https://seata.io	
+
+
+</details>

+ 326 - 0
changes/en-us/1.5.0.md

@@ -0,0 +1,326 @@
+### 1.5.0 	
+
+ [source](https://github.com/seata/seata/archive/v1.5.0.zip) |	
+ [binary](https://github.com/seata/seata/releases/download/v1.5.0/seata-server-1.5.0.zip) 	
+
+<details>	
+  <summary><mark>Release notes</mark></summary>	
+
+
+  ### Seata 1.5.0	
+
+  Seata 1.5.0 Released.	
+
+  Seata is an easy-to-use, high-performance, open source distributed transaction solution.	
+
+  The version is updated as follows:	
+
+
+  ### feature:
+  - [[#4115](https://github.com/seata/seata/pull/4115)] support console management
+  - [[#3472](https://github.com/seata/seata/pull/3472)] add redisLocker's lua mode
+  - [[#3575](https://github.com/seata/seata/pull/3575)] support the mixed use of different storages of locks and sessions
+  - [[#3374](https://github.com/seata/seata/pull/3374)] add a Executor for INSERT ON DUPLICATE KEY UPDATE
+  - [[#3642](https://github.com/seata/seata/pull/3642)] provide an api to share tcc phase-1's params to phase-2 
+  - [[#3064](https://github.com/seata/seata/pull/3064)] support configuring the order of the TM and TCC interceptor
+  - [[#2852](https://github.com/seata/seata/pull/2852)] support configuring scan target for GlobalTransactionScanner
+  - [[#3683](https://github.com/seata/seata/pull/3683)] support redis distributed lock to prevent multi TC competition
+  - [[#3545](https://github.com/seata/seata/pull/3545)] TCC mode support idempotent and anti hanging
+  - [[#3009](https://github.com/seata/seata/pull/3009)] support server start with springboot and config with application.yaml
+  - [[#3652](https://github.com/seata/seata/pull/3652)] support APM with SkyWalking
+  - [[#3823](https://github.com/seata/seata/pull/3823)] TCC mode supports customized parameters list of the method in phase two
+  - [[#3642](https://github.com/seata/seata/pull/3642)] TCC mode's try method supports passing `BusinessActionContext` implicitly
+  - [[#3856](https://github.com/seata/seata/pull/3856)] support edas-hsf RPC framework
+  - [[#3880](https://github.com/seata/seata/pull/3880)] contributing md support chinese.
+  - [[#2568](https://github.com/seata/seata/pull/2568)] support GlobalTransactionInterceptor expression
+  - [[#3886](https://github.com/seata/seata/pull/3886)] support the registry center network preferences
+  - [[#3869](https://github.com/seata/seata/pull/3869)] support get configuration from environment
+  - [[#3906](https://github.com/seata/seata/pull/3906)] support SPI unload
+  - [[#3668](https://github.com/seata/seata/pull/3668)] support kotlin coroutine
+  - [[#3968](https://github.com/seata/seata/pull/3968)] support brpc-java RPC framework
+  - [[#4134](https://github.com/seata/seata/pull/4134)] init the console basic code
+  - [[#4268](https://github.com/seata/seata/pull/4268)] query global session in the file mode
+  - [[#4281](https://github.com/seata/seata/pull/4281)] query global session and global lock in the redis mode
+  - [[#4293](https://github.com/seata/seata/pull/4293)] get global lock in the file mode
+  - [[#4335](https://github.com/seata/seata/pull/4335)] Realize configuration center upload configuration interactive script (nacos,etcd3)
+  - [[#4360](https://github.com/seata/seata/pull/4360)] Realize configuration center upload configuration interactive script (apollo,consul,zk)
+  - [[#4320](https://github.com/seata/seata/pull/4320)] realize the interface of console: get global session and global lock in the db mode
+  - [[#4435](https://github.com/seata/seata/pull/4435)] console front-end page implementation
+  - [[#4480](https://github.com/seata/seata/pull/4480)] implementation of DefaultAuthSigner
+  - [[#3870](https://github.com/seata/seata/pull/3870)] make seata-bom be the real Bill-Of-Material
+  - [[#3487](https://github.com/seata/seata/pull/3487)] add db realization for distribute lock
+  - [[#3889](https://github.com/seata/seata/pull/3889)] registry add heartbeat
+  - [[#3951](https://github.com/seata/seata/pull/3951)] support zstd compressor
+  - [[#2838](https://github.com/seata/seata/pull/2838)] Saga support auto configuration in the spring boot project
+
+  ### bugfix:
+  - [[#3497](https://github.com/seata/seata/pull/3497)] fix tcc phase two response timeout exception
+  - [[#3686](https://github.com/seata/seata/pull/3686)] fix NPE and wrong cluster name of Apollo
+  - [[#3702](https://github.com/seata/seata/pull/3702)] fix some comments
+  - [[#3716](https://github.com/seata/seata/pull/3716)] fix the problem in the findTargetClass method
+  - [[#3717](https://github.com/seata/seata/pull/3717)] fix typo of interval
+  - [[#3773](https://github.com/seata/seata/pull/3773)] fix consul not found tc cluster
+  - [[#3695](https://github.com/seata/seata/pull/3695)] fix mariadb unable to create XA connection
+  - [[#3783](https://github.com/seata/seata/pull/3783)] fix the problem that store mode does not take effect
+  - [[#3740](https://github.com/seata/seata/pull/3740)] fix that `LocalThread` is not cleared when the `Saga` transaction ends
+  - [[#3792](https://github.com/seata/seata/pull/3792)] fix the Server can't find redis-host property
+  - [[#3828](https://github.com/seata/seata/pull/3828)] fix StringUtils StackOverflowError
+  - [[#3817](https://github.com/seata/seata/pull/3817)] fix TC SkyWalking topo calling node not gather
+  - [[#3803](https://github.com/seata/seata/pull/3803)] fix ReflectionUtil throw unexpected exception
+  - [[#3879](https://github.com/seata/seata/pull/3879)] fix postgresql multi schema throw not found channel exception
+  - [[#3881](https://github.com/seata/seata/pull/3881)] fix getConfig with different default value return the first
+  - [[#3897](https://github.com/seata/seata/pull/3897)] fix LocalDataTime type in FastjsonUndoLogParser can't be rollback
+  - [[#3901](https://github.com/seata/seata/pull/3901)] fix seataio/seata-server servlet-api conflict
+  - [[#3931](https://github.com/seata/seata/pull/3931)] fix the wrong path and filename when dump the jvm memory for analysis
+  - [[#3978](https://github.com/seata/seata/pull/3978)] fix NPE cause by future timeout
+  - [[#4266](https://github.com/seata/seata/pull/4266)] fix register branch and release lock failed when the size of rows that modified is greater than 1000 in oracle 
+  - [[#3949](https://github.com/seata/seata/pull/3949)] fix the problem that `nacos-config.py` will not skip blank options. fix bug that split options may cause content loss
+  - [[#3988](https://github.com/seata/seata/pull/3988)] fix the problem that nacos not found user when password has special characters
+  - [[#3998](https://github.com/seata/seata/pull/3998)] fix the NPE of jedis multi.exec
+  - [[#4011](https://github.com/seata/seata/pull/4011)] fix can not get properties of distributed-lock-table in springboot
+  - [[#4025](https://github.com/seata/seata/pull/4025)] fix potential database resource leak
+  - [[#4023](https://github.com/seata/seata/pull/4023)] fix the problem that the xid is not cleared in some scenes of dubbo
+  - [[#4039](https://github.com/seata/seata/pull/4039)] fix RM did not clear XID after the local transaction threw an exception
+  - [[#4032](https://github.com/seata/seata/pull/4032)] fix ApplicationContext already closed problem when Seata server using ShutdownHook to destroy
+  - [[#4074](https://github.com/seata/seata/pull/4074)] fix prevents XA mode resource suspension
+  - [[#4107](https://github.com/seata/seata/pull/4107)] fix deadlock problems during project construction
+  - [[#4158](https://github.com/seata/seata/pull/4158)] fix the logback can't load the `RPC_PORT`
+  - [[#4162](https://github.com/seata/seata/pull/4162)] fix correct built-in properties for redis registry
+  - [[#4165](https://github.com/seata/seata/pull/4165)] fix `StringUtils.toString(obj)` throw `ClassCastException` when the obj is primitive data array
+  - [[#4169](https://github.com/seata/seata/pull/4169)] fix xa mode originalConnection has been closed, cause PhaseTwo fail to execute
+  - [[#4177](https://github.com/seata/seata/pull/4177)] fix the problem of accidentally releasing the global lock
+  - [[#4174](https://github.com/seata/seata/pull/4174)] fix delete undo log connection already closed
+  - [[#4189](https://github.com/seata/seata/pull/4189)] fix the `kafka-appender.xml` and `logstash-appender.xml`
+  - [[#4213](https://github.com/seata/seata/pull/4213)] fix code for "sessionMode" not execute problem
+  - [[#4220](https://github.com/seata/seata/pull/4220)] fix some problems with `zstd` compressor and add the version of the `kotlin-maven-plugin`
+  - [[#4222](https://github.com/seata/seata/pull/4222)] fix could not rollback when insert field list is empty
+  - [[#4253](https://github.com/seata/seata/pull/4253)] update executor store the actually modified columns but not only the columns in set condition
+  - [[#4276](https://github.com/seata/seata/pull/4276)] fix seata-test module UT not work
+  - [[#4278](https://github.com/seata/seata/pull/4278)] fix the problem that mysql's Blob/Clob/NClob data type cannot be deserialized
+  - [[#4302](https://github.com/seata/seata/pull/4302)] fix the problem that other ORMs may not be able to obtain the auto-incrementing primary key value
+  - [[#4233](https://github.com/seata/seata/pull/4233)] fix data remanence problems in lock and branch under specific circumstances.
+  - [[#4308](https://github.com/seata/seata/pull/4308)] fix the TableMetaCache parsing problem with the same table under multiple Postgresql schemas
+  - [[#4326](https://github.com/seata/seata/pull/4326)] fix inability to build Executor when using mariadb driver
+  - [[#4355](https://github.com/seata/seata/pull/4355)] fix mysql-loadbalance resource id error
+  - [[#4310](https://github.com/seata/seata/pull/4310)] fix the problem that failed to obtain the self increment ID of MySQL database through "select last_insert_id"
+  - [[#4331](https://github.com/seata/seata/pull/4331)] fix dirty write check exception that may occur when using ONLY_CARE_UPDATE_COLUMNS configuration
+  - [[#4228](https://github.com/seata/seata/pull/4228)] fix resource suspension in xa mode caused by choose other ip as channel alternative
+  - [[#4408](https://github.com/seata/seata/pull/4408)] fix the invalid environment variable in container env
+  - [[#4441](https://github.com/seata/seata/pull/4441)] fix the problem that pipelined resources are not closed in redis mode and add branchSession judge branchSessions is not null
+  - [[#4438](https://github.com/seata/seata/pull/4438)] fix the problem that GlobalSession could not be deleted normally in the case of delayed deletion in the file mode of the develop branch
+  - [[#4432](https://github.com/seata/seata/pull/4432)] fix the inability to get some remote configurations
+  - [[#4452](https://github.com/seata/seata/pull/4452)] fix the change log of 'service.disableGlobalTransaction' config
+  - [[#4449](https://github.com/seata/seata/pull/4449)] fix redis mode page npe and optimize get globalSession on average
+  - [[#4459](https://github.com/seata/seata/pull/4459)] fix the failure to obtain before image and after image on oracle and pgsql of the develop branch
+  - [[#4471](https://github.com/seata/seata/pull/4471)] in branch 'develop', fix the error when service.vgroupMapping change
+  - [[#4474](https://github.com/seata/seata/pull/4474)] fix Mysql multi-bit Bit type field rollback error
+  - [[#4492](https://github.com/seata/seata/pull/4492)] fix the failure to update cluster list dynamically when use eureka of the develop branch
+  - [[#4535](https://github.com/seata/seata/pull/4535)] fix FileSessionManagerTest fail
+  - [[#4561](https://github.com/seata/seata/pull/4561)] fix allSessions/findGlobalSessions may return null and cause npe
+  - [[#4505](https://github.com/seata/seata/pull/4505)] fix fastjson serialization of time data types
+  - [[#4579](https://github.com/seata/seata/pull/4579)] fix prepareUndoLogAll of MySQLInsertOrUpdateExecutor
+  - [[#4005](https://github.com/seata/seata/pull/4005)] fix PK constraint name isn't the same as the unique index name which is belong to PK
+  - [[#4062](https://github.com/seata/seata/pull/4062)] fix saga complex parameter deserialization problem
+  - [[#4199](https://github.com/seata/seata/pull/4199)] fix rpc tm request timeout
+  - [[#4352](https://github.com/seata/seata/pull/4352)] fix some problem of the sql parser
+  - [[#4487](https://github.com/seata/seata/pull/4487)] fix remove Pagination hideOnlyOnePage attribute
+  - [[#4449](https://github.com/seata/seata/pull/4449)] fix optimize redis limit and fix redis page bug
+  - [[#4608](https://github.com/seata/seata/pull/4608)] fix test case
+  - [[#3110](https://github.com/seata/seata/pull/3110)] fix the problem of unit test
+
+
+   ### optimize:
+  - [[#4163](https://github.com/seata/seata/pull/4163)] improve CONTRIBUTING docs
+  - [[#3678](https://github.com/seata/seata/pull/3678)] supplement missing configuration and new version documents
+  - [[#3654](https://github.com/seata/seata/pull/3654)] fix typo,applicationContex -> applicationContext
+  - [[#3615](https://github.com/seata/seata/pull/3615)] asynchronous deletion after the transaction is committed
+  - [[#3687](https://github.com/seata/seata/pull/3687)] fix the case that could not retry acquire global lock
+  - [[#3689](https://github.com/seata/seata/pull/3689)] modify the attribute prefix in the file file.properties
+  - [[#3528](https://github.com/seata/seata/pull/3528)] optimize the memory footprint of redis mode
+  - [[#3700](https://github.com/seata/seata/pull/3700)] optimize the speed of buildLockKey
+  - [[#3588](https://github.com/seata/seata/pull/3588)] optimize the logic of datasource auto proxy
+  - [[#3626](https://github.com/seata/seata/pull/3626)] remove repeat change status
+  - [[#3722](https://github.com/seata/seata/pull/3722)] add the basic code of distributed lock  
+  - [[#3713](https://github.com/seata/seata/pull/3713)] unified the default value of enableClientBatchSendRequest
+  - [[#3120](https://github.com/seata/seata/pull/3120)] optimize `Configuration` and add unit tests
+  - [[#3735](https://github.com/seata/seata/pull/3735)] do not load `LoadBalance` if not necessary
+  - [[#3770](https://github.com/seata/seata/pull/3770)] close the `Closeable` and optimize some code
+  - [[#3627](https://github.com/seata/seata/pull/3627)] use TreeMap instead of the LinkedHashMap in TableMeta to compatible high level MySQL
+  - [[#3760](https://github.com/seata/seata/pull/3760)] opt the logback's config of `seata-server`
+  - [[#3765](https://github.com/seata/seata/pull/3765)] Transfer the operation of adding configuration class from 'AutoConfiguration' to 'EnvironmentPostProcessor'
+  - [[#3730](https://github.com/seata/seata/pull/3730)] Refactoring the code of TCC mode
+  - [[#3820](https://github.com/seata/seata/pull/3820)] add column `action_name` to the `tcc_fence_log`
+  - [[#3738](https://github.com/seata/seata/pull/3738)] `JacksonUndoLogParser` supports to parsing `LocalDateTime`
+  - [[#3794](https://github.com/seata/seata/pull/3794)] optimize the packaging of `seata-server`
+  - [[#3795](https://github.com/seata/seata/pull/3795)] optimize zk registry lookup performance
+  - [[#3840](https://github.com/seata/seata/pull/3840)] optimiza `apm-skwalking` operation method to generate rules
+  - [[#3834](https://github.com/seata/seata/pull/3834)] optimize `seata-distribution` add `apm-seata-skywalking`
+  - [[#3847](https://github.com/seata/seata/pull/3847)] optimize ConcurrentHashMap.newKeySet replace ConcurrentSet
+  - [[#3311](https://github.com/seata/seata/pull/3311)] supports reading all configurations from a single Consul key
+  - [[#3849](https://github.com/seata/seata/pull/3849)] optimize string concat
+  - [[#3890](https://github.com/seata/seata/pull/3890)] optimize only the inserted fields are checked
+  - [[#3895](https://github.com/seata/seata/pull/3895)] optimize decode exception
+  - [[#3898](https://github.com/seata/seata/pull/3898)] add jib-maven-plugin
+  - [[#3904](https://github.com/seata/seata/pull/3904)] ehance metrics and fix seata-server UT not work
+  - [[#3212](https://github.com/seata/seata/pull/3212)] optimize recognize sql in limit and order by
+  - [[#3905](https://github.com/seata/seata/pull/3905)] optimize nacos-config.sh to support ash
+  - [[#3935](https://github.com/seata/seata/pull/3935)] optimize Send redis command at one time using pipeline
+  - [[#3916](https://github.com/seata/seata/pull/3916)] optimize determine whether the server in the register is alive
+  - [[#3918](https://github.com/seata/seata/pull/3918)] cache reflection results of the fields and methods
+  - [[#3898](https://github.com/seata/seata/pull/3898)] add jib-maven-plugin
+  - [[#3907](https://github.com/seata/seata/pull/3907)] optimize set server port
+  - [[#3912](https://github.com/seata/seata/pull/3912)] support config JVM param in env
+  - [[#3939](https://github.com/seata/seata/pull/3939)] use map instead of if else judge for more change in the future
+  - [[#3955](https://github.com/seata/seata/pull/3955)] add a start banner for seata
+  - [[#3954](https://github.com/seata/seata/pull/3954)] replace @Deprecated getOwnernName to getOwnerName in druid
+  - [[#3981](https://github.com/seata/seata/pull/3981)] optimize service port priority
+  - [[#4013](https://github.com/seata/seata/pull/4013)] optimize channel alive check
+  - [[#3982](https://github.com/seata/seata/pull/3982)] optimize readme doc and upgrade some dependencies
+  - [[#3949](https://github.com/seata/seata/pull/3949)] `nacos-config.py` support default parameters and optional input parameters
+  - [[#3991](https://github.com/seata/seata/pull/3991)] disable listening in the FileConfiguration center in Springboot 
+  - [[#3994](https://github.com/seata/seata/pull/3994)] Optimize the mechanism of periodically deleting tasks in the `tcc_fence_log` table
+  - [[#3327](https://github.com/seata/seata/pull/3327)] supports reading all configurations from a single Etcd3 key
+  - [[#4001](https://github.com/seata/seata/pull/4001)] support to read YML configuration from Nacos, Zookeeper, Consul, Etcd3
+  - [[#4017](https://github.com/seata/seata/pull/4017)] optimize file configuration
+  - [[#4018](https://github.com/seata/seata/pull/4018)] optimize Apollo configuration
+  - [[#4021](https://github.com/seata/seata/pull/4021)] optimize Nacos、Consul、Zookeeper、Etcd3 configuration
+  - [[#4034](https://github.com/seata/seata/pull/4034)] optimize Nacos, Consul, Zookeeper and Etcd3 configuration Junit test Class
+  - [[#4055](https://github.com/seata/seata/pull/4055)] optimize NetUtil#getLocalAddress0
+  - [[#4086](https://github.com/seata/seata/pull/4086)] optimize lazily load branch transactions and task scheduling
+  - [[#4056](https://github.com/seata/seata/pull/4056)] optimize the DurationUtil
+  - [[#4103](https://github.com/seata/seata/pull/4103)] optimize AbstractLockManager#collectRowLocks logic  
+  - [[#3733](https://github.com/seata/seata/pull/3733)] optimize acquire lock logic
+  - [[#4144](https://github.com/seata/seata/pull/4144)] support default configuration of tx-service-group    
+  - [[#4157](https://github.com/seata/seata/pull/4157)] optimize client batch sending.   
+  - [[#4191](https://github.com/seata/seata/pull/4191)] support rpc timeout can be customized.
+  - [[#4216](https://github.com/seata/seata/pull/4216)] no more attempt to clean undolog for none AT mode
+  - [[#4176](https://github.com/seata/seata/pull/4176)] use expire key instead hash when using redis as registry center.   
+  - [[#4196](https://github.com/seata/seata/pull/4196)] tc batch response to client.
+  - [[#4212](https://github.com/seata/seata/pull/4212)] optimize the interface of the console
+  - [[#4237](https://github.com/seata/seata/pull/4237)] skip check lock when all the before image is empty
+  - [[#4251](https://github.com/seata/seata/pull/4251)] optimize partial code handling
+  - [[#4262](https://github.com/seata/seata/pull/4262)] optimize tcc module code handling
+  - [[#4235](https://github.com/seata/seata/pull/4235)] optimize instance saved in eureka
+  - [[#4277](https://github.com/seata/seata/pull/4277)] optimize acquire lock return fail-fast code in redis-pipeline mode.
+  - [[#4284](https://github.com/seata/seata/pull/4284)] support authentication of MSE-Nacos with ak/sk
+  - [[#4299](https://github.com/seata/seata/pull/4299)] optimize exceptions to make them friendly
+  - [[#4300](https://github.com/seata/seata/pull/4300)] optimize let DefaultCoordinator invoke NettyRemotingServer's close method,no longer closed by ServerRunner
+  - [[#4270](https://github.com/seata/seata/pull/4270)] improve the performance of global commit and global rollback, asynchronous branch transaction cleanup
+  - [[#4307](https://github.com/seata/seata/pull/4307)] when in TCC mode there is no need to delete global locks
+  - [[#4303](https://github.com/seata/seata/pull/4303)] `tcc_fence_log` table hanging log records are deleted asynchronously
+  - [[#4328](https://github.com/seata/seata/pull/4328)] upload configuration script support comments
+  - [[#4305](https://github.com/seata/seata/pull/4305)] optimize acquire global lock fail error log print on tc
+  - [[#4336](https://github.com/seata/seata/pull/4336)] add SQL exception prompt not supported by AT mode
+  - [[#4359](https://github.com/seata/seata/pull/4359)] support configuration metadata read from environment variables
+  - [[#4247](https://github.com/seata/seata/pull/4247)] add tests for `java17` and `springboot` in the `github/actions`
+  - [[#4353](https://github.com/seata/seata/pull/4353)] Slimming down for the `seata-all.jar`
+  - [[#4393](https://github.com/seata/seata/pull/4393)] skip reload for redis & db mode
+  - [[#4400](https://github.com/seata/seata/pull/4400)] asynchronous tasks handle global transactions in parallel
+  - [[#4391](https://github.com/seata/seata/pull/4391)] commit/rollback retry timeout event
+  - [[#4409](https://github.com/seata/seata/pull/4409)] add copyright header to test classes
+  - [[#4282](https://github.com/seata/seata/pull/4282)] optimize build UndoItem logic
+  - [[#4407](https://github.com/seata/seata/pull/4407)] file mode does not require lazy processing of sessions
+  - [[#4436](https://github.com/seata/seata/pull/4436)] optimize global session query in file mode
+  - [[#4431](https://github.com/seata/seata/pull/4431)] limit the number of queries in Redis storage mode
+  - [[#4465](https://github.com/seata/seata/pull/4465)] optimize client version transfer in tc batch response to client mode.
+  - [[#4469](https://github.com/seata/seata/pull/4469)] optimize the way to get configuration in DB mode of console
+  - [[#4478](https://github.com/seata/seata/pull/4478)] optimize Nacos config and naming properties
+  - [[#4522](https://github.com/seata/seata/pull/4522)] optimize GC parameters in JVM
+  - [[#4517](https://github.com/seata/seata/pull/4517)] enhance fail/timeout status metric and log level
+  - [[#4451](https://github.com/seata/seata/pull/4451)] filesessionmanager changed to singleton and optimized task thread pool processing
+  - [[#4551](https://github.com/seata/seata/pull/4551)] optimize metrics rt statistics
+  - [[#4574](https://github.com/seata/seata/pull/4574)] support accessKey/secretKey auto configuration
+  - [[#4583](https://github.com/seata/seata/pull/4583)] use HmacSHA256 instead of HmacSHA1 for ram signature
+  - [[#4591](https://github.com/seata/seata/pull/4591)] optimize the default value of the switch
+  - [[#3780](https://github.com/seata/seata/pull/3780)] optimize upgrade the Druid version
+  - [[#3797](https://github.com/seata/seata/pull/3797)] optimize support instance `BusinessActionContext` outside the TCC try method
+  - [[#3909](https://github.com/seata/seata/pull/3909)] optimize `collectRowLocks` method
+  - [[#3763](https://github.com/seata/seata/pull/3763)] optimize github actions
+  - [[#4345](https://github.com/seata/seata/pull/4345)] optimize fix the path of the package
+  - [[#4346](https://github.com/seata/seata/pull/4346)] optimize the log of the server and remove lombok
+  - [[#4348](https://github.com/seata/seata/pull/4348)] optimize Unified management the versions of maven-plugin
+  - [[#4354](https://github.com/seata/seata/pull/4354)] optimize the tests of `SAGA`
+  - [[#4227](https://github.com/seata/seata/pull/4227)] optimize the versions of the dependencies
+  - [[#4403](https://github.com/seata/seata/pull/4403)] optimize disable `SAGA` tests
+  - [[#4453](https://github.com/seata/seata/pull/4453)] optimize upgrade eureka-clients and xstream dependencies
+  - [[#4481](https://github.com/seata/seata/pull/4481)] optimize nacos config and naming properties
+  - [[#4477](https://github.com/seata/seata/pull/4477)] optimize debug log and fix typo
+  - [[#4484](https://github.com/seata/seata/pull/4484)]optimize  the log of TM/RM register
+  - [[#3874](https://github.com/seata/seata/pull/4484)] optimize Add logo of registered enterprise,and Change image source to Alicdn
+  - [[#4458](https://github.com/seata/seata/pull/4458)] optimize fix the README.md of metrices module
+  - [[#4482](https://github.com/seata/seata/pull/4482)] optimize remove duplicated word
+
+
+
+
+
+
+
+### test:	
+
+
+
+  Thanks to these contributors for their code commits. Please report an unintended omission.  	
+  - [slievrly](https://github.com/slievrly) 
+  - [wangliang181230](https://github.com/wangliang181230)
+  - [a364176773](https://github.com/a364176773) 
+  - [lvekee](https://github.com/lvekee)
+  - [caohdgege](https://github.com/caohdgege)
+  - [lightClouds917](https://github.com/lightClouds917)
+  - [objcoding](https://github.com/objcoding)
+  - [siyu](https://github.com/Pinocchio2018)
+  - [GoodBoyCoder](https://github.com/GoodBoyCoder)
+  - [pengten](https://github.com/pengten)
+  - [Bughue](https://github.com/Bughue)
+  - [doubleDimple](https://github.com/doubleDimple)
+  - [zhaoyuguang](https://github.com/zhaoyuguang)
+  - [liuqiufeng](https://github.com/liuqiufeng)
+  - [jsbxyyx](https://github.com/jsbxyyx)
+  - [lcmvs](https://github.com/lcmvs)
+  - [onlinechild](https://github.com/onlinechild)
+  - [xjlgod](https://github.com/xjlgod)
+  - [h-zhi](https://github.com/h-zhi)
+  - [tanzzj](https://github.com/tanzzj)
+  - [miaoxueyu](https://github.com/miaoxueyu)
+  - [selfishlover](https://github.com/selfishlover)
+  - [tuwenlin](https://github.com/tuwenlin)
+  - [dmego](https://github.com/dmego)
+  - [xiaochangbai](https://github.com/xiaochangbai)
+  - [Rubbernecker](https://github.com/Rubbernecker)
+  - [ruanun](https://github.com/ruanun)
+  - [huan415](https://github.com/huan415)
+  - [drgnchan](https://github.com/drgnchan) 
+  - [cmonkey](https://github.com/cmonkey)
+  - [13414850431](https://github.com/13414850431)
+  - [ls9527](https://github.com/ls9527)
+  - [xingfudeshi](https://github.com/xingfudeshi)
+  - [spilledyear](https://github.com/spilledyear)
+  - [kaka2code](https://github.com/kaka2code)
+  - [iqinning](https://github.com/iqinning)
+  - [yujianfei1986](https://github.com/yujianfei1986)
+  - [elrond-g](https://github.com/elrond-g)
+  - [jameslcj](https://github.com/jameslcj)
+  - [zhouchuhang](https://github.com/zch0214)
+  - [xujj](https://github.com/XBNGit)
+  - [mengxzh](https://github.com/mengxzh)
+  - [portman](https://github.com/iportman)
+  - [anselleeyy](https://github.com/anselleeyy)
+  - [wangyuewen](https://github.com/2858917634)
+  - [imherewait](https://github.com/imherewait)
+  - [wfnuser](https://github.com/wfnuser)
+  - [zhixing](https://github.com/chenlei3641)
+
+
+
+
+  Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.	
+
+   #### Link	
+
+   - **Seata:** https://github.com/seata/seata  	
+   - **Seata-Samples:** https://github.com/seata/seata-samples   	
+   - **Release:** https://github.com/seata/seata/releases	
+   - **WebSite:** https://seata.io	
+
+
+</details>

+ 91 - 0
changes/en-us/1.5.2.md

@@ -0,0 +1,91 @@
+### 1.5.2
+
+[source](https://github.com/seata/seata/archive/v1.5.2.zip) |
+[binary](https://github.com/seata/seata/releases/download/v1.5.2/seata-server-1.5.2.zip)
+
+<details>	
+  <summary><mark>Release notes</mark></summary>	
+
+
+### Seata 1.5.2
+
+Seata 1.5.2 Released.
+
+Seata is an easy-to-use, high-performance, open source distributed transaction solution.
+
+The version is updated as follows:
+
+### feature:
+- [[#4661](https://github.com/seata/seata/pull/4713)] support xid consistency load balance
+- [[#4676](https://github.com/seata/seata/pull/4676)] support server to expose Nacos services by mounting SLB
+- [[#4642](https://github.com/seata/seata/pull/4642)] support batch message parallel processing
+- [[#4567](https://github.com/seata/seata/pull/4567)] support where method condition(find_in_set)
+
+
+### bugfix:
+- [[#4515](https://github.com/seata/seata/pull/4515)] fix the error of SeataTCCFenceAutoConfiguration when database unused
+- [[#4661](https://github.com/seata/seata/pull/4661)] fix sql exception with PostgreSQL in module console
+- [[#4667](https://github.com/seata/seata/pull/4682)] fix the exception in RedisTransactionStoreManager for update map During iteration
+- [[#4678](https://github.com/seata/seata/pull/4678)] fix the error of key transport.enableRmClientBatchSendRequest cache penetration if not configure
+- [[#4701](https://github.com/seata/seata/pull/4701)] fix missing command line args
+- [[#4607](https://github.com/seata/seata/pull/4607)] fix bug on skipping lock check
+- [[#4696](https://github.com/seata/seata/pull/4696)] fix oracle database insert value
+- [[#4726](https://github.com/seata/seata/pull/4726)] fix batch message send may return NullPointException
+- [[#4729](https://github.com/seata/seata/pull/4729)] fix set AspectTransactional.rollbackForClassName with wrong value
+- [[#4653](https://github.com/seata/seata/pull/4653)] fix the sql exception when pk is non-numeric in INSERT_ON_DUPLICATE SQL
+
+### optimize:
+- [[#4650](https://github.com/seata/seata/pull/4650)] fix some security vulnerabilities
+- [[#4670](https://github.com/seata/seata/pull/4670)] optimize the thread pool size of branchResultMessageExecutor
+- [[#4662](https://github.com/seata/seata/pull/4662)] optimize rollback transaction metrics
+- [[#4693](https://github.com/seata/seata/pull/4693)] optimize the console navigation bar
+- [[#4700](https://github.com/seata/seata/pull/4700)] fix maven-compiler-plugin and maven-resources-plugin execute failed
+- [[#4711](https://github.com/seata/seata/pull/4711)] separate lib dependencies for deployments
+- [[#4720](https://github.com/seata/seata/pull/4720)] optimize pom description
+- [[#4728](https://github.com/seata/seata/pull/4728)] upgrade logback dependency to 1.2.9
+- [[#4745](https://github.com/seata/seata/pull/4745)] support mysql8 in release package
+- [[#4626](https://github.com/seata/seata/pull/4626)] Replace `flatten-maven-plugin` with `easyj-maven-plugin` to fix the conflict between `shade` and `flatten`
+- [[#4629](https://github.com/seata/seata/pull/4629)] check relation of before status and after status when updating global session
+- [[#4662](https://github.com/seata/seata/pull/4662)] make EnhancedServiceLoader more readable
+- [[#4445](https://github.com/seata/seata/pull/4445)] optimize transaction timeout judgment
+- [[#4958](https://github.com/seata/seata/pull/4958)] do not execute triggerAfterCommit() in case of timeout
+
+### test:
+
+- [[#4544](https://github.com/seata/seata/pull/4544)] optimize jackson dependencies in TransactionContextFilterTest
+- [[#4731](https://github.com/seata/seata/pull/4731)] fix UT failed in AsyncWorkerTest and LockManagerTest
+
+Thanks to these contributors for their code commits. Please report an unintended omission.
+
+<!-- Please make sure your Github ID is in the list below -->
+- [slievrly](https://github.com/slievrly)
+- [pengten](https://github.com/pengten)
+- [YSF-A](https://github.com/YSF-A)
+- [tuwenlin](https://github.com/tuwenlin)
+- [Ifdevil](https://github.com/Ifdevil)
+- [wingchi-leung](https://github.com/wingchi-leung)
+- [liurong](https://github.com/robynron)
+- [opelok-z](https://github.com/opelok-z)
+- [a364176773](https://github.com/a364176773)
+- [2129zxl](https://github.com/2129zxl)
+- [Smery-lxm](https://github.com/Smery-lxm)
+- [doubleDimple](https://github.com/doubleDimple)
+- [wangliang181230](https://github.com/wangliang181230)
+- [Bughue](https://github.com/Bughue)
+- [AYue-94](https://github.com/AYue-94)
+- [lingxiao-wu](https://github.com/lingxiao-wu)
+- [caohdgege](https://github.com/caohdgege)
+- [miaoxueyu](https://github.com/miaoxueyu)
+
+
+Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.
+
+#### Link
+
+- **Seata:** https://github.com/seata/seata
+- **Seata-Samples:** https://github.com/seata/seata-samples
+- **Release:** https://github.com/seata/seata/releases
+- **WebSite:** https://seata.io
+
+
+</details>

+ 151 - 0
changes/en-us/1.6.0.md

@@ -0,0 +1,151 @@
+### 1.6.0
+
+[source](https://github.com/seata/seata/archive/v1.6.0.zip) |
+[binary](https://github.com/seata/seata/releases/download/v1.6.0/seata-server-1.6.0.zip)
+
+<details>	
+  <summary><mark>Release notes</mark></summary>	
+
+
+### Seata 1.6.0
+
+Seata 1.6.0 Released.
+
+Seata is an easy-to-use, high-performance, open source distributed transaction solution.
+
+The version is updated as follows:
+
+### feature:
+- [[#4863](https://github.com/seata/seata/pull/4863)] support oracle and postgresql multi primary key
+- [[#4649](https://github.com/seata/seata/pull/4649)] seata-server support multiple registry
+- [[#4779](https://github.com/seata/seata/pull/4779)] support Apache Dubbo3
+- [[#4479](https://github.com/seata/seata/pull/4479)] TCC mode supports tcc annotation marked on both interface and implementation class
+- [[#4877](https://github.com/seata/seata/pull/4877)] seata client support jdk17
+- [[#4914](https://github.com/seata/seata/pull/4914)] support mysql update join sql
+- [[#4542](https://github.com/seata/seata/pull/4542)] support oracle timestamp types
+- [[#5111](https://github.com/seata/seata/pull/5111)] support Nacos contextPath
+- [[#4802](https://github.com/seata/seata/pull/4802)] dockerfile support arm64
+
+
+### bugfix:
+- [[#4780](https://github.com/seata/seata/pull/4780)] fix can't post TimeoutRollbacked event after a successful timeout rollback
+- [[#4954](https://github.com/seata/seata/pull/4954)] fix output expression incorrectly throws npe
+- [[#4817](https://github.com/seata/seata/pull/4817)] fix in high version springboot property not Standard
+- [[#4838](https://github.com/seata/seata/pull/4838)] fix when use Statement.executeBatch() can not generate undo log
+- [[#4533](https://github.com/seata/seata/pull/4533)] fix rollback event repeated and some event status not correct
+- [[#4912](https://github.com/seata/seata/pull/4912)] fix mysql InsertOnDuplicateUpdate column case is different and cannot be matched
+- [[#4543](https://github.com/seata/seata/pull/4543)] fix support Oracle nclob types
+- [[#4915](https://github.com/seata/seata/pull/4915)] fix failed to get server recovery properties
+- [[#4919](https://github.com/seata/seata/pull/4919)] fix XID port  and  address null:0 before coordinator.init
+- [[#4928](https://github.com/seata/seata/pull/4928)] fix rpcContext.getClientRMHolderMap NPE
+- [[#4953](https://github.com/seata/seata/pull/4953)] fix InsertOnDuplicateUpdate bypass modify pk
+- [[#4978](https://github.com/seata/seata/pull/4978)] fix kryo support circular reference
+- [[#4874](https://github.com/seata/seata/pull/4874)] fix startup failure by using OpenJDK 11
+- [[#5018](https://github.com/seata/seata/pull/5018)] fix loader path in startup scripts
+- [[#5004](https://github.com/seata/seata/pull/5004)] fix duplicate image row for update join
+- [[#5032](https://github.com/seata/seata/pull/5032)] fix mysql InsertOnDuplicateUpdate sql query error caused by placeholder index calculation error
+- [[#5033](https://github.com/seata/seata/pull/5033)] fix null exception when sql columns is empty for insert on duplicate
+- [[#5038](https://github.com/seata/seata/pull/5038)] remove @EnableConfigurationProperties({SagaAsyncThreadPoolProperties.class})
+- [[#5050](https://github.com/seata/seata/pull/5050)] fix global session is not change to Committed in saga mode
+- [[#5052](https://github.com/seata/seata/pull/5052)] fix update join condition placeholder param error
+- [[#5031](https://github.com/seata/seata/pull/5031)] fix mysql InsertOnDuplicateUpdate should not use null index value as image sql query condition
+- [[#5075](https://github.com/seata/seata/pull/5075)] fix InsertOnDuplicateUpdateExecutor could not intercept the sql which has no primary and unique key
+- [[#5093](https://github.com/seata/seata/pull/5093)] fix access key loss after seata server restart
+- [[#5092](https://github.com/seata/seata/pull/5092)] fix when seata and jpa are used together, their AutoConfiguration order is incorrect
+- [[#5109](https://github.com/seata/seata/pull/5109)] fix NPE caused when there is no @GlobalTransactional annotation on the RM side
+- [[#5098](https://github.com/seata/seata/pull/5098)] Druid disable oracle implicit cache
+- [[#4860](https://github.com/seata/seata/pull/4860)] fix metrics tags coverage in the seata-server side
+- [[#5028](https://github.com/seata/seata/pull/5028)] fix insert value null parsed as string in insert on duplicate SQL
+- [[#5078](https://github.com/seata/seata/pull/5078)] fix could not intercept the sql witch has no primary and unique key
+- [[#5097](https://github.com/seata/seata/pull/5097)] fix access key loss after server restart
+- [[#5131](https://github.com/seata/seata/pull/5131)] fix rollback xa connection active state
+- [[#5134](https://github.com/seata/seata/pull/5134)] fix hikari datasource auto proxy fail
+- [[#5163](https://github.com/seata/seata/pull/5163)] fix bad service configuration file and compilation failure
+
+### optimize:
+- [[#4774](https://github.com/seata/seata/pull/4774)] optimize mysql8 dependencies for seataio/seata-server image
+- [[#4790](https://github.com/seata/seata/pull/4790)] Add a github action to publish Seata to OSSRH
+- [[#4765](https://github.com/seata/seata/pull/4765)] mysql 8.0.29 not should be hold for connection
+- [[#4750](https://github.com/seata/seata/pull/4750)] optimize unBranchLock romove xid
+- [[#4797](https://github.com/seata/seata/pull/4797)] optimize the github actions
+- [[#4800](https://github.com/seata/seata/pull/4800)] Add NOTICE as Apache License V2
+- [[#4681](https://github.com/seata/seata/pull/4681)] optimize the check lock during global transaction
+- [[#4761](https://github.com/seata/seata/pull/4761)] use hget replace hmget because only one field
+- [[#4414](https://github.com/seata/seata/pull/4414)] exclude log4j dependencies
+- [[#4836](https://github.com/seata/seata/pull/4836)] optimize BaseTransactionalExecutor#buildLockKey(TableRecords rowsIncludingPK) method more readable
+- [[#4865](https://github.com/seata/seata/pull/4865)] fix some security vulnerabilities in GGEditor
+- [[#4590](https://github.com/seata/seata/pull/4590)] auto degrade enable to dynamic configure
+- [[#4490](https://github.com/seata/seata/pull/4490)] tccfence log table delete by index
+- [[#4911](https://github.com/seata/seata/pull/4911)] add license checker workflow
+- [[#4917](https://github.com/seata/seata/pull/4917)] upgrade package-lock.json fix vulnerabilities
+- [[#4924](https://github.com/seata/seata/pull/4924)] optimize pom dependencies
+- [[#4932](https://github.com/seata/seata/pull/4932)] extract the default values for some properties
+- [[#4925](https://github.com/seata/seata/pull/4925)] optimize java doc warning
+- [[#4921](https://github.com/seata/seata/pull/4921)] fix some vulnerabilities in console and upgrade skywalking-eyes
+- [[#4936](https://github.com/seata/seata/pull/4936)] optimize read of storage configuration
+- [[#4946](https://github.com/seata/seata/pull/4946)] pass the sqlexception to client when get lock
+- [[#4962](https://github.com/seata/seata/pull/4962)] optimize build and fix the base image
+- [[#4974](https://github.com/seata/seata/pull/4974)] optimize cancel the limit on the number of globalStatus queries in Redis mode
+- [[#4981](https://github.com/seata/seata/pull/4981)] optimize tcc fence record not exists errMessage
+- [[#4985](https://github.com/seata/seata/pull/4985)] fix undo_log id repeat
+- [[#4995](https://github.com/seata/seata/pull/4995)] fix mysql InsertOnDuplicateUpdate duplicate pk condition in after image query sql
+- [[#5047](https://github.com/seata/seata/pull/5047)] remove useless code
+- [[#5051](https://github.com/seata/seata/pull/5051)] undo log dirty throw BranchRollbackFailed_Unretriable
+- [[#5075](https://github.com/seata/seata/pull/5075)] intercept the InsertOnDuplicateUpdate statement which has no primary key and unique index value
+- [[#5104](https://github.com/seata/seata/pull/5104)] remove the druid dependency in ConnectionProxy
+- [[#5124](https://github.com/seata/seata/pull/5124)] support oracle on delete tccfence logs
+- [[#4468](https://github.com/seata/seata/pull/4968)] support kryo 5.3.0
+- [[#4807](https://github.com/seata/seata/pull/4807)] optimize docker image and oss publish
+- [[#4445](https://github.com/seata/seata/pull/4445)] optimize transaction timeout judgment
+- [[#4958](https://github.com/seata/seata/pull/4958)] do not execute triggerAfterCommit() if timeout
+- [[#4582](https://github.com/seata/seata/pull/4582)] redis mode support sorted set by timeout
+- [[#4963](https://github.com/seata/seata/pull/4963)] add ARM64 CI workflow
+- [[#4434](https://github.com/seata/seata/pull/4434)] remove seata-server's CMS parameters
+
+### test:
+- [[#4411](https://github.com/seata/seata/pull/4411)] add UT for oracle in AT mode
+- [[#4794](https://github.com/seata/seata/pull/4794)] try to fix the test `DataSourceProxyTest.getResourceIdTest()`
+- [[#5101](https://github.com/seata/seata/pull/5101)] fix ClassNotFoundException during the zk unit test
+
+Thanks to these contributors for their code commits. Please report an unintended omission.
+
+<!-- Please make sure your Github ID is in the list below -->
+- [slievrly](https://github.com/slievrly)
+- [renliangyu857](https://github.com/renliangyu857)
+- [wangliang181230](https://github.com/wangliang181230)
+- [a364176773](https://github.com/a364176773)
+- [tuwenlin](https://github.com/tuwenlin)
+- [lcmvs](https://github.com/lcmvs)
+- [AlexStocks](https://github.com/AlexStocks)
+- [liujunlin5168](https://github.com/liujunlin5168)
+- [pengten](https://github.com/pengten)
+- [liuqiufeng](https://github.com/liuqiufeng)
+- [yujianfei1986](https://github.com/yujianfei1986)
+- [Bughue](https://github.com/Bughue)
+- [AlbumenJ](https://github.com/AlbumenJ)
+- [doubleDimple](https://github.com/doubleDimple)
+- [jsbxyyx](https://github.com/jsbxyyx)
+- [tuwenlin](https://github.com/tuwenlin)
+- [CrazyLionLi](https://github.com/JavaLionLi)
+- [whxxxxx](https://github.com/whxxxxx)
+- [neillee95](https://github.com/neillee95)
+- [crazy-sheep](https://github.com/crazy-sheep)
+- [zhangzq7](https://github.com/zhangzq7)
+- [l81893521](https://github.com/l81893521)
+- [zhuyoufeng](https://github.com/zhuyoufeng)
+- [xingfudeshi](https://github.com/xingfudeshi)
+- [odidev](https://github.com/odidev)
+- [miaoxueyu](https://github.com/miaoxueyu)
+
+
+Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.
+
+#### Link
+
+- **Seata:** https://github.com/seata/seata
+- **Seata-Samples:** https://github.com/seata/seata-samples
+- **Release:** https://github.com/seata/seata/releases
+- **WebSite:** https://seata.io
+
+
+</details>

+ 49 - 0
changes/en-us/1.6.1.md

@@ -0,0 +1,49 @@
+### 1.6.1
+
+[source](https://github.com/seata/seata/archive/v1.6.1.zip) |
+[binary](https://github.com/seata/seata/releases/download/v1.6.1/seata-server-1.6.1.zip)
+
+<details>	
+  <summary><mark>Release notes</mark></summary>	
+
+
+### Seata 1.6.1
+
+Seata 1.6.1 Released.
+
+Seata is an easy-to-use, high-performance, open source distributed transaction solution.
+
+The version is updated as follows:
+
+### feature:
+- [[#5115](https://github.com/seata/seata/pull/5115)] support for `spring-boot:3.x`
+
+### bugfix:
+- [[#5179](https://github.com/seata/seata/pull/5179)] fix ClassNotFoundException when server starts using Eureka
+
+### optimize:
+- [[#5120](https://github.com/seata/seata/pull/5120)] unify the format of configuration items in yml files
+- [[#5180](https://github.com/seata/seata/pull/5180)] GlobalTransactionScanner,SeataAutoDataSourceProxyCreator declare @bean methods as static
+- [[#5182](https://github.com/seata/seata/pull/5182)] fix some security vulnerabilities in GGEditor
+- [[#5183](https://github.com/seata/seata/pull/5183)] optimize the default values for some switches
+
+Thanks to these contributors for their code commits. Please report an unintended omission.
+
+<!-- Please make sure your Github ID is in the list below -->
+- [slievrly](https://github.com/slievrly)
+- [wangliang181230](https://github.com/wangliang181230)
+- [xingfudeshi](https://github.com/xingfudeshi)
+- [whxxxxx](https://github.com/whxxxxx)
+- [xssdpgy](https://github.com/xssdpgy)
+
+Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.
+
+#### Link
+
+- **Seata:** https://github.com/seata/seata
+- **Seata-Samples:** https://github.com/seata/seata-samples
+- **Release:** https://github.com/seata/seata/releases
+- **WebSite:** https://seata.io
+
+
+</details>

+ 46 - 0
changes/en-us/2.0.0.md

@@ -0,0 +1,46 @@
+### 2.0.0
+
+ [source](https://github.com/seata/seata/archive/v2.0.0.zip) |	
+ [binary](https://github.com/seata/seata/releases/download/v2.0.0/seata-server-2.0.0.zip) 	
+
+<details>
+  <summary><mark>Release notes</mark></summary>	
+
+### Seata 2.0.0
+
+Seata 2.0.0 Released.
+
+Seata is an easy-to-use, high-performance, open source distributed transaction solution.
+
+The version is updated as follows:
+
+### feature:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] Please delete the sample later
+
+### bugfix:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] Please delete the sample later
+
+### optimize:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] Please delete the sample later
+
+### test:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] Please delete the sample later
+
+
+### Contributors:
+
+Thanks to these contributors for their code commits. Please report an unintended omission.
+
+  - [slievrly](https://github.com/slievrly)
+
+Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.
+
+
+#### Link
+
+  - **Seata:** https://github.com/seata/seata
+  - **Seata-Samples:** https://github.com/seata/seata-samples
+  - **Release:** https://github.com/seata/seata/releases
+  - **WebSite:** https://seata.io
+
+</details>

+ 22 - 0
changes/en-us/develop.md

@@ -0,0 +1,22 @@
+Add changes here for all PR submitted to the develop branch.
+
+<!-- Please add the `changes` to the following location(feature/bugfix/optimize/test) based on the type of PR -->
+
+### feature:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] support xxx
+
+### bugfix:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] fix xxx
+
+### optimize:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] optimize xxx
+
+### test:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] add test for xxx
+
+Thanks to these contributors for their code commits. Please report an unintended omission.
+
+<!-- Please make sure your Github ID is in the list below -->
+- [slievrly](https://github.com/slievrly)
+
+Also, we receive many valuable issues, questions and advices from our community. Thanks for you all.

+ 176 - 0
changes/zh-cn/1.4.2.md

@@ -0,0 +1,176 @@
+### 1.4.2 
+
+ [source](https://github.com/seata/seata/archive/v1.4.2.zip) |
+ [binary](https://github.com/seata/seata/releases/download/v1.4.2/seata-server-1.4.2.zip) 
+
+<details>
+  <summary><mark>Release notes</mark></summary>
+
+
+  ### Seata 1.4.2 
+
+Seata 1.4.2  发布。
+
+Seata 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。
+
+此版本更新如下:
+
+  ### feature:
+
+  - [[#3172](https://github.com/seata/seata/pull/3172)] 支持 AT 模式 undo_log 压缩模式
+  - [[#3372](https://github.com/seata/seata/pull/3372)] 支持saga模式下用户自定义是否更新最后一次重试日志
+  - [[#3411](https://github.com/seata/seata/pull/3411)] 支持seata-server 线程池参数可配置
+  - [[#3348](https://github.com/seata/seata/pull/3348)] 支持 TC 存储模式使用 redis-sentinel
+  - [[#2667](https://github.com/seata/seata/pull/2667)] 支持使用db和redis存储模式时密码的加解密
+  - [[#3427](https://github.com/seata/seata/pull/3427)] 支持分布式锁接口
+  - [[#3443](https://github.com/seata/seata/pull/3443)] 支持将seata-server的日志发送到logstash或kafka中
+  - [[#3486](https://github.com/seata/seata/pull/3486)] 支持Metrics增加事务分组属性
+  - [[#3317](https://github.com/seata/seata/pull/3317)] 支持当zookeeper作为配置中心时从单node获取全部配置
+  - [[#2933](https://github.com/seata/seata/pull/2933)] 支持mysql antlr sqlparser
+  - [[#3228](https://github.com/seata/seata/pull/3228)] 支持自定义序列化插件
+  - [[#3516](https://github.com/seata/seata/pull/3516)] 支持 consul 作为注册中心和配置中心时的 acl-token
+  - [[#3116](https://github.com/seata/seata/pull/3116)] 支持配置 apollo 配置中心配置 configService 和 cluster
+  - [[#3468](https://github.com/seata/seata/pull/3468)] 支持saga模式下任务循环执行
+  - [[#3447](https://github.com/seata/seata/pull/3447)] 支持日志框架中事务上下文的打印
+
+
+  ### bugfix:
+
+  - [[#3258](https://github.com/seata/seata/pull/3258)] 修复AsyncWorker潜在的OOM问题
+  - [[#3293](https://github.com/seata/seata/pull/3293)] 修复配置缓存获取值类型不匹配的问题
+  - [[#3241](https://github.com/seata/seata/pull/3241)] 禁止在多SQL的情况下使用 limit 和 order by 语法
+  - [[#3406](https://github.com/seata/seata/pull/3406)] 修复当config.txt中包含特殊字符时无法推送至 nacos 的问题
+  - [[#3367](https://github.com/seata/seata/pull/3367)] 修复最后一个XA分支二阶段时偶发无法回滚的异常
+  - [[#3418](https://github.com/seata/seata/pull/3418)] 修复 getGeneratedKeys 可能会取到历史的主键的问题
+  - [[#3448](https://github.com/seata/seata/pull/3448)] 修复多个锁竞争失败时,仅删除单个锁,并优化锁竞争逻辑提升处理性能  
+  - [[#3408](https://github.com/seata/seata/pull/3408)] 修复jar运行模式第三方依赖分离打包时的NPE问题
+  - [[#3431](https://github.com/seata/seata/pull/3431)] 修复在读取配置时Property Bean可能未初始化的问题
+  - [[#3413](https://github.com/seata/seata/pull/3413)] 修复回滚到savepoint以及releaseSavepoint的逻辑
+  - [[#3451](https://github.com/seata/seata/pull/3451)] 修复autoCommit=true,全局锁竞争失败时的脏写问题
+  - [[#3481](https://github.com/seata/seata/pull/3481)] 修复当 consul client 抛出异常时导致刷新任务中断的问题
+  - [[#3491](https://github.com/seata/seata/pull/3491)] 修复README.md文件中的拼写错误
+  - [[#3531](https://github.com/seata/seata/pull/3531)] 修复RedisTransactionStoreManager 获取 brachTransaction 可能的 NPE 问题
+  - [[#3500](https://github.com/seata/seata/pull/3500)] 修复 oracle 和 postgreSql 无法获取 column info 的问题
+  - [[#3560](https://github.com/seata/seata/pull/3560)] 修复 Committing 状态的事务异步任务没有时间阈值和无法进行事务恢复的问题
+  - [[#3555](https://github.com/seata/seata/pull/3555)] 通过setBytes代替setBlob,避免高版本jdbc驱动工作异常
+  - [[#3540](https://github.com/seata/seata/pull/3540)] 修复server发布打包时缺失文件的问题
+  - [[#3597](https://github.com/seata/seata/pull/3597)] 修复可能的 NPE问题
+  - [[#3568](https://github.com/seata/seata/pull/3568)] 修复自动数据源代理因 ConcurrentHashMap.computeIfAbsent 导致的死锁问题
+  - [[#3402](https://github.com/seata/seata/pull/3402)] 修复更新SQL中字段名含有库名无法解析更新列的问题
+  - [[#3464](https://github.com/seata/seata/pull/3464)] 修复测试用例空指针异常和StackTraceLogger中错误的日志格式.
+  - [[#3522](https://github.com/seata/seata/pull/3522)] 修复当 DML 影响行数为0时注册分支和插入undo_log的问题
+  - [[#3635](https://github.com/seata/seata/pull/3635)] 修复zookeeper 配置变更无法推送通知的问题
+  - [[#3133](https://github.com/seata/seata/pull/3133)] 修复某些场景下无法重试全局锁的问题
+  - [[#3156](https://github.com/seata/seata/pull/3156)] 修复嵌套代理类无法 获取target的问题 
+
+
+  ### optimize: 
+
+  - [[#3341](https://github.com/seata/seata/pull/3341)] 优化获取指定配置文件的路径格式问题
+  - [[#3385](https://github.com/seata/seata/pull/3385)] 优化 GitHub Actions 配置,修复单测失败问题
+  - [[#3175](https://github.com/seata/seata/pull/3175)] 支持雪花算法时钟回拨
+  - [[#3291](https://github.com/seata/seata/pull/3291)] 优化mysql连接参数
+  - [[#3336](https://github.com/seata/seata/pull/3336)] 支持使用System.getProperty获取Netty配置参数
+  - [[#3369](https://github.com/seata/seata/pull/3369)] 添加github action的dockerHub秘钥
+  - [[#3343](https://github.com/seata/seata/pull/3343)] 将CI程序从Travis CI迁移到Github Actions
+  - [[#3397](https://github.com/seata/seata/pull/3397)] 增加代码变更记录
+  - [[#3303](https://github.com/seata/seata/pull/3303)] 支持从nacos单一dataId中读取所有配置
+  - [[#3380](https://github.com/seata/seata/pull/3380)] 优化 globalTransactionScanner 中的 DISABLE_GLOBAL_TRANSACTION listener
+  - [[#3123](https://github.com/seata/seata/pull/3123)] 优化 seata-server 打包策略
+  - [[#3415](https://github.com/seata/seata/pull/3415)] 优化 maven 打包时清除 distribution 目录
+  - [[#3316](https://github.com/seata/seata/pull/3316)] 优化读取配置值时属性bean未初始化的问题
+  - [[#3420](https://github.com/seata/seata/pull/3420)] 优化枚举类的使用并添加单元测试
+  - [[#3533](https://github.com/seata/seata/pull/3533)] 支持获取当前事务角色
+  - [[#3436](https://github.com/seata/seata/pull/3436)] 优化SQLType类中的错别字
+  - [[#3439](https://github.com/seata/seata/pull/3439)] 调整springApplicationContextProvider order以使其可以在xml bean之前被调用
+  - [[#3248](https://github.com/seata/seata/pull/3248)] 优化负载均衡配置迁移到client节点下
+  - [[#3441](https://github.com/seata/seata/pull/3441)] 优化starter的自动配置处理
+  - [[#3466](https://github.com/seata/seata/pull/3466)] 优化使用equalsIgnoreCase() 进行字符串比较
+  - [[#3476](https://github.com/seata/seata/pull/3476)] 支持 server 参数传入hostname时自动将其转换为 ip
+  - [[#3236](https://github.com/seata/seata/pull/3236)] 优化执行解锁操作的条件,减少不必要的 unlock 操作
+  - [[#3485](https://github.com/seata/seata/pull/3485)] 删除 ConfigurationFactory 中无用的代码
+  - [[#3505](https://github.com/seata/seata/pull/3505)] 删除 GlobalTransactionScanner 中无用的 if 判断
+  - [[#3544](https://github.com/seata/seata/pull/3544)] 优化无法通过Statement#getGeneratedKeys时,只能获取到批量插入的第一个主键的问题
+  - [[#3549](https://github.com/seata/seata/pull/3549)] 统一DB存储模式下不同表中的xid字段的长度
+  - [[#3551](https://github.com/seata/seata/pull/3551)] 调大RETRY_DEAD_THRESHOLD的值以及设置成可配置
+  - [[#3589](https://github.com/seata/seata/pull/3589)] 使用JUnit API做异常检查
+  - [[#3601](https://github.com/seata/seata/pull/3601)] 使`LoadBalanceProperties`与`spring-boot:2.x`及以上版本兼容
+  - [[#3513](https://github.com/seata/seata/pull/3513)] Saga SpringBeanService调用器支持切换 json 解析器
+  - [[#3318](https://github.com/seata/seata/pull/3318)] 支持 CLIENT_TABLE_META_CHECKER_INTERVAL 可配置化
+  - [[#3371](https://github.com/seata/seata/pull/3371)] 支持 metric 按 applicationId 分组
+  - [[#3459](https://github.com/seata/seata/pull/3459)] 删除重复的ValidadAddress代码
+  - [[#3215](https://github.com/seata/seata/pull/3215)] 优化seata-server 在file模式下启动时的reload逻辑
+  - [[#3631](https://github.com/seata/seata/pull/3631)] 优化 nacos-config.py 脚本的入参问题
+  - [[#3638](https://github.com/seata/seata/pull/3638)] 优化 update 和 delete 的 SQL 不支持 join 的错误提示
+  - [[#3523](https://github.com/seata/seata/pull/3523)] 优化当使用oracle时调用releaseSavepoint()方法报异常的问题
+  - [[#3458](https://github.com/seata/seata/pull/3458)] 还原已删除的md
+  - [[#3574](https://github.com/seata/seata/pull/3574)] 修复EventBus.java文件中注释拼写错误
+  - [[#3573](https://github.com/seata/seata/pull/3573)] 修复 README.md 文件中设计器路径错误
+  - [[#3662](https://github.com/seata/seata/pull/3662)] 更新gpg密钥对
+  - [[#3664](https://github.com/seata/seata/pull/3664)] 优化 javadoc
+  - [[#3637](https://github.com/seata/seata/pull/3637)] 登记使用seata的公司和1.4.2版本包含的新增pr信息
+
+  ### test
+
+  - [[#3381](https://github.com/seata/seata/pull/3381)] 添加 TmClient 的测试用例
+  - [[#3607](https://github.com/seata/seata/pull/3607)] 修复 EventBus 的单元测试问题
+  - [[#3579](https://github.com/seata/seata/pull/3579)] 添加 StringFormatUtils 测试用例
+  - [[#3365](https://github.com/seata/seata/pull/3365)] 修复ParameterParserTest测试用例
+  - [[#3359](https://github.com/seata/seata/pull/3359)] 删除未使用的测试用例
+  - [[#3383](https://github.com/seata/seata/pull/3383)] 优化StatementProxyTest单元测试
+  - [[#3578](https://github.com/seata/seata/pull/3578)] 修复单元测试case里的UnfinishedStubbing异常
+
+
+ 非常感谢以下 contributors 的代码贡献。若有无意遗漏,请报告。
+
+  - [slievrly](https://github.com/slievrly) 
+  - [caohdgege](https://github.com/caohdgege) 
+  - [a364176773](https://github.com/a364176773) 
+  - [wangliang181230](https://github.com/wangliang181230)
+  - [xingfudeshi](https://github.com/xingfudeshi)
+  - [jsbxyyx](https://github.com/jsbxyyx) 
+  - [selfishlover](https://github.com/selfishlover)
+  - [l8189352](https://github.com/l81893521)
+  - [Rubbernecker](https://github.com/Rubbernecker)
+  - [lj2018110133](https://github.com/lj2018110133)
+  - [github-ganyu](https://github.com/github-ganyu)
+  - [dmego](https://github.com/dmego)
+  - [spilledyear](https://github.com/spilledyear)
+  - [hoverruan](https://github.com/hoverruan ) 
+  - [anselleeyy](https://github.com/anselleeyy)
+  - [Ifdevil](https://github.com/Ifdevil)
+  - [lvxianzheng](https://github.com/lvxianzheng)
+  - [MentosL](https://github.com/MentosL)
+  - [lian88jian](https://github.com/lian88jian)
+  - [litianyu1992](https://github.com/litianyu1992)
+  - [xyz327](https://github.com/xyz327)
+  - [13414850431](https://github.com/13414850431)
+  - [xuande](https://github.com/xuande)
+  - [tanggen](https://github.com/tanggen)
+  - [eas5](https://github.com/eas5)
+  - [nature80](https://github.com/nature80)
+  - [ls9527](https://github.com/ls9527)
+  - [drgnchan](https://github.com/drgnchan)
+  - [imyangyong](https://github.com/imyangyong)
+  - [sunlggggg](https://github.com/sunlggggg)
+  - [long187](https://github.com/long187)
+  - [h-zhi](https://github.com/h-zhi)
+  - [StellaiYang](https://github.com/StellaiYang)
+  - [slinpq](https://github.com/slinpq)
+  - [sustly](https://github.com/sustly)
+  - [cznc](https://github.com/cznc)
+  - [squallliu](https://github.com/squallliu)
+  - [81519434](https://github.com/81519434)
+  - [luoxn28](https://github.com/luoxn28)
+
+
+同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
+
+   #### Link
+
+   - **Seata:** https://github.com/seata/seata  
+   - **Seata-Samples:** https://github.com/seata/seata-samples   
+   - **Release:** https://github.com/seata/seata/releases
+   - **WebSite:** https://seata.io
+
+</details>

+ 315 - 0
changes/zh-cn/1.5.0.md

@@ -0,0 +1,315 @@
+### 1.5.0 
+
+ [source](https://github.com/seata/seata/archive/v1.5.0.zip) |
+ [binary](https://github.com/seata/seata/releases/download/v1.5.0/seata-server-1.5.0.zip) 
+
+<details>
+  <summary><mark>Release notes</mark></summary>
+
+
+  ### Seata 1.5.0 
+
+Seata 1.5.0  发布。
+
+Seata 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。
+
+此版本更新如下:
+
+
+### feature:
+  - [[#4115](https://github.com/seata/seata/pull/4115)] 支持用户控制台
+  - [[#3472](https://github.com/seata/seata/pull/3472)] 添加redisLocker的lua模式
+  - [[#3575](https://github.com/seata/seata/pull/3575)] 支持对锁和会话不同存储的混合使用
+  - [[#3374](https://github.com/seata/seata/pull/3374)] 支持mysql INSERT ON DUPLICATE KEY UPDATE
+  - [[#3642](https://github.com/seata/seata/pull/3642)] TCC模式支持使用API的形式进行二阶段参数传递
+  - [[#3064](https://github.com/seata/seata/pull/3064)] 支持可配置GlobalTransactionInterceptor和TccActionInterceptor的order值
+  - [[#2852](https://github.com/seata/seata/pull/2852)] 支持自定义`GlobalTransactionScanner`的扫描对象。
+  - [[#3683](https://github.com/seata/seata/pull/3683)] 支持redis分布式锁来避免多tc竞争执行任务
+  - [[#3545](https://github.com/seata/seata/pull/3545)] TCC模式支持幂等控制、防悬挂和空回滚
+  - [[#3009](https://github.com/seata/seata/pull/3009)] 支持server端以springboot的方式的启动
+  - [[#3652](https://github.com/seata/seata/pull/3652)] 支持APM SkyWalking监控。
+  - [[#3823](https://github.com/seata/seata/pull/3823)] TCC模式二阶段方法参数列表支持自定义
+  - [[#3642](https://github.com/seata/seata/pull/3642)] TCC模式一阶段支持BusinessActionContext隐式传递
+  - [[#3856](https://github.com/seata/seata/pull/3856)] 支持 edas-hsf RPC 框架
+  - [[#3880](https://github.com/seata/seata/pull/3880)] 贡献文档增加中文版本
+  - [[#3869](https://github.com/seata/seata/pull/3869)] 支持从环境 ENV 获取配置
+  - [[#2568](https://github.com/seata/seata/pull/2568)] 支持GlobalTransactionInterceptor配置切面表达式
+  - [[#3886](https://github.com/seata/seata/pull/3886)] 支持注册中心注册ip的网络偏好设置
+  - [[#3906](https://github.com/seata/seata/pull/3906)] 支持 SPI 卸载
+  - [[#3668](https://github.com/seata/seata/pull/3668)] 支持kotlin协程
+  - [[#3968](https://github.com/seata/seata/pull/3968)] 支持 brpc-java RPC框架
+  - [[#4134](https://github.com/seata/seata/pull/4134)] 初始化控制台基础代码
+  - [[#4268](https://github.com/seata/seata/pull/4268)] 控制台Global Session页面File模式实现
+  - [[#4281](https://github.com/seata/seata/pull/4281)] 控制台Global Session页面和Global LockRedis模式实现
+  - [[#4293](https://github.com/seata/seata/pull/4293)] 控制台Global Lock页面File模式实现
+  - [[#4335](https://github.com/seata/seata/pull/4335)] 实现配置中心上传配置交互脚本(nacos,etcd3)
+  - [[#4360](https://github.com/seata/seata/pull/4360)] 实现配置中心上传配置交互脚本(apollo,consul,zk)
+  - [[#4320](https://github.com/seata/seata/pull/4320)] 实现控制台db模式全局事务、锁查询接口
+  - [[#4435](https://github.com/seata/seata/pull/4435)] 控制台前端页面实现
+  - [[#4480](https://github.com/seata/seata/pull/4480)] 实现DefaultAuthSigner的默认签名加密方法
+  - [[#3870](https://github.com/seata/seata/pull/3870)] 让seata-bom成为真正的Bill-Of-Material
+  - [[#3487](https://github.com/seata/seata/pull/3487)] 添加分布式锁的db实现
+  - [[#3889](https://github.com/seata/seata/pull/3889)] 注册中心添加心跳
+  - [[#3951](https://github.com/seata/seata/pull/3951)] 支持zstd压缩 
+  - [[#2838](https://github.com/seata/seata/pull/2838)] Saga 支持springboot项目的自动配置
+
+### bugfix:
+  - [[#3497](https://github.com/seata/seata/pull/3497)] 修复TCC模式并发量较大时线程池导致的超时问题
+  - [[#3686](https://github.com/seata/seata/pull/3686)] 修复Apollo集群配置项错误及NPE错误
+  - [[#3702](https://github.com/seata/seata/pull/3702)] 修改注释
+  - [[#3716](https://github.com/seata/seata/pull/3716)] 修复findTargetClass方法的错误
+  - [[#3717](https://github.com/seata/seata/pull/3717)] 更正interval的拼写
+  - [[#3773](https://github.com/seata/seata/pull/3773)] 修复consul注册中心在自定义集群名下无法获取TC集群
+  - [[#3695](https://github.com/seata/seata/pull/3695)] 修复mariadb无法创建XA连接的问题
+  - [[#3783](https://github.com/seata/seata/pull/3783)] 修复store mode不生效问题
+  - [[#3740](https://github.com/seata/seata/pull/3740)] 修复在某些情况下,当`Saga`事务结束时`LocalThread`未被清除的问题
+  - [[#3792](https://github.com/seata/seata/pull/3792)] 修复Server 无法获取 redis host的问题
+  - [[#3828](https://github.com/seata/seata/pull/3828)] 修复StringUtils抛出StackOverflowError的问题
+  - [[#3817](https://github.com/seata/seata/pull/3817)] 修复TC在SkyWalking拓扑图节点不汇聚的问题
+  - [[#3803](https://github.com/seata/seata/pull/3803)] 修复 ReflectionUtil 抛出不预期异常问题
+  - [[#3879](https://github.com/seata/seata/pull/3879)] 修复 posrgresql多schema无法找到channel问题
+  - [[#3881](https://github.com/seata/seata/pull/3881)] 修复不存在的相同 DataId 不同默认值返回相同值的问题
+  - [[#3897](https://github.com/seata/seata/pull/3897)] 修复FastjsonUndoLogParser中 localdatatime类型不能回滚的问题
+  - [[#3901](https://github.com/seata/seata/pull/3901)] 修复 seataio/seata-server 中 servlet-api 冲突无法启动问题
+  - [[#3931](https://github.com/seata/seata/pull/3931)] 修复 线程池拒绝执行情况下,dump内存文件名和路径错误的问题
+  - [[#3949](https://github.com/seata/seata/pull/3949)] 修复`nacos-config.py`不会跳过空白选项的问题,解决多个分割选项可能导致内容丢失的问题
+  - [[#3988](https://github.com/seata/seata/pull/3988)] 修复 nacos 的密码带有特殊字符导致用户名不存在问题
+  - [[#3978](https://github.com/seata/seata/pull/3978)] 修复 future timeout 引发的 NPE 问题
+  - [[#3998](https://github.com/seata/seata/pull/3998)] 修复 jedis multi.exec 的 NPE 问题
+  - [[#4011](https://github.com/seata/seata/pull/4011)] 修复 springboot下无法获取distributed-lock-table配置
+  - [[#4025](https://github.com/seata/seata/pull/4025)] 修复潜在的数据库资源泄露
+  - [[#4023](https://github.com/seata/seata/pull/4023)] 修复 dubbo部分场景存在xid未清除的问题
+  - [[#4032](https://github.com/seata/seata/pull/4032)] 修复server端的ShutdownHook在资源释放时,ApplicationContext已关闭的问题
+  - [[#4039](https://github.com/seata/seata/pull/4039)] 修复 本地事务抛出异常之后,RM没有清除xid
+  - [[#4074](https://github.com/seata/seata/pull/4074)] 修复XA模式资源悬挂问题
+  - [[#4107](https://github.com/seata/seata/pull/4107)] 修复项目构建时的死锁问题
+  - [[#4158](https://github.com/seata/seata/pull/4158)] 修复logback无法加载到`RPC_PORT`的问题
+  - [[#4162](https://github.com/seata/seata/pull/4162)] 修复Redis注册中心内置配置名导致启动报错问题
+  - [[#4165](https://github.com/seata/seata/pull/4165)] 修复 `StringUtils.toString(obj)` 当obj是基本数据数组时,抛出`ClassCastException`的问题
+  - [[#4169](https://github.com/seata/seata/pull/4169)] 修复xa模式originalConnection已关闭,导致二阶段无法执行
+  - [[#4177](https://github.com/seata/seata/pull/4177)] 修复当事务超时且刚好tm发起commit决议时,意外造成全局锁释放的问题
+  - [[#4174](https://github.com/seata/seata/pull/4174)] 修复删除 undolog 时连接关闭问题
+  - [[#4189](https://github.com/seata/seata/pull/4189)] 修复 `kafka-appender.xml` 和 `logstash-appender.xml` 两个配置文件中`${}`表达式中的默认值前少了横杆的问题。
+  - [[#4213](https://github.com/seata/seata/pull/4213)] 修复部分"sessionMode"代码没执行导致启动失败问题
+  - [[#4220](https://github.com/seata/seata/pull/4220)] 修复 `zstd-compressor` 模块未合并到 `seata-all` 中的问题,同时修正其包名。另外,补充了 `kotlin-maven-plugin` 的版本号;顺便优化打包配置。
+  - [[#4222](https://github.com/seata/seata/pull/4222)] 修复字段列表为空时,插入语句无法回滚的问题
+  - [[#4253](https://github.com/seata/seata/pull/4253)] UpdateExecutor存储被真实修改的字段,而不是只存储set子句里面的字段
+  - [[#4233](https://github.com/seata/seata/pull/4233)] 修复 lock 和 branch 数据残留问题
+  - [[#4276](https://github.com/seata/seata/pull/4276)] 修复 seata-test 单测不运行的问题
+  - [[#4278](https://github.com/seata/seata/pull/4278)] 修复mysql的Blob/Clob/NClob数据类型无法反序列化的问题
+  - [[#4302](https://github.com/seata/seata/pull/4302)] 修复其他ORM可能存在获取不到自增主键值的问题
+  - [[#4308](https://github.com/seata/seata/pull/4308)] 修复Postgresql多个schema下存在相同表的TableMetaCache解析问题
+  - [[#4326](https://github.com/seata/seata/pull/4326)] 修复使用 mariadb 驱动程序时无法构建 Executor 的问题
+  - [[#4355](https://github.com/seata/seata/pull/4355)] 修复使用 mysql Loadbalance模式resourceId被误判为resourceIds的问题
+  - [[#4310](https://github.com/seata/seata/pull/4310)] 修复通过"SELECT LAST_INSERT_ID"获取mysql数据库自增id失败的问题
+  - [[#4331](https://github.com/seata/seata/pull/4331)] 修复使用ONLY_CARE_UPDATE_COLUMNS配置可能出现的脏写校验异常
+  - [[#4408](https://github.com/seata/seata/pull/4408)] 修复容器环境中设置环境变量无效的问题
+  - [[#4441](https://github.com/seata/seata/pull/4441)] 修复redis模式下查询时未关闭Pipeline和分支注册后添加分支session时branchSessions为null的问题
+  - [[#4438](https://github.com/seata/seata/pull/4438)] 修复develop版本file模式下GlobalSession在延迟删除的情况下无法被正常删除的问题
+  - [[#4432](https://github.com/seata/seata/pull/4432)] 修复develop版本下ServerApplicationListener无法读取配置中心配置的问题
+  - [[#4452](https://github.com/seata/seata/pull/4452)] 修复'service.disableGlobalTransaction'配置的日志输出错误
+  - [[#4449](https://github.com/seata/seata/pull/4449)] 修复redis分页查询npe问题,优化readession限制查询条数后均衡返回结果
+  - [[#4459](https://github.com/seata/seata/pull/4459)] 修复develop版本下oracle和pgsql数据库生成前后镜像失败的问题
+  - [[#4471](https://github.com/seata/seata/pull/4471)] 修复develop分支下,运行时切换事务分组对应集群引起的错误
+  - [[#4474](https://github.com/seata/seata/pull/4474)] 修复Mysql多位Bit类型字段回滚错误
+  - [[#4492](https://github.com/seata/seata/pull/4492)] 修复develop分支下eureka注册中心无法动态更新服务列表的问题
+  - [[#4228](https://github.com/seata/seata/pull/4228)] 修复tc获取不同ip的rm连接导致的xa模式资源悬挂问题
+  - [[#4535](https://github.com/seata/seata/pull/4535)] 修复FileSessionManagerTest单测错误
+  - [[#4561](https://github.com/seata/seata/pull/4561)] 修复 allSessions/findGlobalSessions 某些情况下返回null
+  - [[#4505](https://github.com/seata/seata/pull/4505)] 修复time类型的fastjson序列化问题
+  - [[#4579](https://github.com/seata/seata/pull/4579)] 修复MySQLInsertOrUpdateExecutor的prepareUndoLogAll
+  - [[#4005](https://github.com/seata/seata/pull/4005)] 修复PK约束名称与属于PK的唯一索引名称不同
+  - [[#4062](https://github.com/seata/seata/pull/4062)] 修复saga复杂参数序列化问题
+  - [[#4199](https://github.com/seata/seata/pull/4199)] 修复rpc tm 请求超时
+  - [[#4352](https://github.com/seata/seata/pull/4352)] 修复sql解析器的一些问题
+  - [[#4487](https://github.com/seata/seata/pull/4487)] 移除Pagination hideOnlyOnePage 属性
+  - [[#4449](https://github.com/seata/seata/pull/4449)] 优化redis limit并修复redis分页bug
+  - [[#4608](https://github.com/seata/seata/pull/4608)] 修复测试用例
+  - [[#3110](https://github.com/seata/seata/pull/3110)] 修复单元测试的一些问题
+
+
+### optimize:
+  - [[#4163](https://github.com/seata/seata/pull/4163)] 完善开发者奉献文档
+  - [[#3678](https://github.com/seata/seata/pull/3678)] 补充遗漏的配置及新版本pr登记md文件
+  - [[#3654](https://github.com/seata/seata/pull/3654)] 修正拼写,applicationContex -> applicationContext
+  - [[#3615](https://github.com/seata/seata/pull/3615)] 二阶段同步提交时,全局事务记录异步删除
+  - [[#3687](https://github.com/seata/seata/pull/3687)] 修复某些场景下无法重试全局锁的问题
+  - [[#3689](https://github.com/seata/seata/pull/3689)] 修正script/server/config/file.properties中属性编写错误
+  - [[#3700](https://github.com/seata/seata/pull/3700)] 优化buildLockKey方法的效率
+  - [[#3588](https://github.com/seata/seata/pull/3588)] 优化数据源自动代理的流程
+  - [[#3528](https://github.com/seata/seata/pull/3528)] 优化redis模式内存占用
+  - [[#3626](https://github.com/seata/seata/pull/3626)] 移除重复的change status代码
+  - [[#3722](https://github.com/seata/seata/pull/3722)] 添加分布式锁的基础代码
+  - [[#3713](https://github.com/seata/seata/pull/3713)] 统一enableClientBatchSendRequest的默认值
+  - [[#3120](https://github.com/seata/seata/pull/3120)] 优化`Configuration`的部分代码,并添加单元测试
+  - [[#3735](https://github.com/seata/seata/pull/3735)] 当TC只有单个节点时,不进行非必要的负载均衡操作
+  - [[#3770](https://github.com/seata/seata/pull/3770)] 关闭一些未关闭的对象
+  - [[#3627](https://github.com/seata/seata/pull/3627)] 使用TreeMap替换TableMeta中的LinkedHashMap以兼容高版本的MySQL
+  - [[#3760](https://github.com/seata/seata/pull/3760)] 优化`seata-server`的logback相关的配置
+  - [[#3765](https://github.com/seata/seata/pull/3765)] 将添加配置类的操作从`AutoConfiguration`转移到`EnvironmentPostProcessor`中,提升该操作的优先级
+  - [[#3730](https://github.com/seata/seata/pull/3730)] 重构TCC模式相关的代码,方便以后做功能扩展
+  - [[#3820](https://github.com/seata/seata/pull/3820)] 在表`tcc_fence_log`中添加字段`action_name`,用于查看该条记录是由哪个action产生的 
+  - [[#3738](https://github.com/seata/seata/pull/3738)] `JacksonUndoLogParser`支持解析`LocalDateTime`(支持微秒时间)
+  - [[#3794](https://github.com/seata/seata/pull/3794)] 优化`seata-server`的打包配置,修正Dockerfile的错误配置,并将Dockerfile也打包进去
+  - [[#3795](https://github.com/seata/seata/pull/3795)] 优化`zkRegistry`lookup方法性能
+  - [[#3840](https://github.com/seata/seata/pull/3840)] 优化`apm-skwalking`操作方法生成规则
+  - [[#3834](https://github.com/seata/seata/pull/3834)] 优化`seata-distribution`增加apm-seata-skywalking包
+  - [[#3847](https://github.com/seata/seata/pull/3847)] 优化ConcurrentHashMap.newKeySet替换ConcurrentSet
+  - [[#3849](https://github.com/seata/seata/pull/3849)] 优化字符串拼接
+  - [[#3890](https://github.com/seata/seata/pull/3890)] 优化insert后镜像仅查询插入字段
+  - [[#3895](https://github.com/seata/seata/pull/3895)] 优化解码异常
+  - [[#3212](https://github.com/seata/seata/pull/3212)] 优化解析OrderBy,Limit条件代码结构
+  - [[#3898](https://github.com/seata/seata/pull/3898)] 增加docker maven 插件
+  - [[#3904](https://github.com/seata/seata/pull/3904)] 增强 metrics 和修复 seata-server 单测不运行的问题
+  - [[#3905](https://github.com/seata/seata/pull/3905)] 优化 nacos-config.sh 支持 ash
+  - [[#3935](https://github.com/seata/seata/pull/3935)] 优化以redis为注册中心时,发送多条命令使用pipeline
+  - [[#3916](https://github.com/seata/seata/pull/3916)] 优化注册中心服务节点列表地址探活
+  - [[#3918](https://github.com/seata/seata/pull/3918)] 缓存Field和Method的反射结果
+  - [[#3311](https://github.com/seata/seata/pull/3311)] 支持从consul单一key中读取所有配置
+  - [[#3907](https://github.com/seata/seata/pull/3907)] 优化设置 Server 端口
+  - [[#3912](https://github.com/seata/seata/pull/3912)] 支持通过env配置JVM参数
+  - [[#3939](https://github.com/seata/seata/pull/3939)] 使用map优化大量的判断代码
+  - [[#3955](https://github.com/seata/seata/pull/3955)] 添加启动banner
+  - [[#4266](https://github.com/seata/seata/pull/4266)] 修改由于修改记录过多导致分支注册及lock释放失败的问题 
+  - [[#3949](https://github.com/seata/seata/pull/3949)] `nacos-config.py` 支持默认参数和选择性输入参数
+  - [[#3954](https://github.com/seata/seata/pull/3954)] 移除对druid依赖中过期方法的调用
+  - [[#3981](https://github.com/seata/seata/pull/3981)] 优化服务端口的优先级设置
+  - [[#4013](https://github.com/seata/seata/pull/4013)] 优化可用TC地址检测
+  - [[#3982](https://github.com/seata/seata/pull/3982)] 优化 readme 文档和升级POM依赖
+  - [[#3991](https://github.com/seata/seata/pull/3991)] 关闭spring boot下无用的fileListener
+  - [[#3994](https://github.com/seata/seata/pull/3994)] 优化`tcc_fence_log`表定时删除任务的机制
+  - [[#3327](https://github.com/seata/seata/pull/3327)] 支持从etcd3单一key中读取所有配置
+  - [[#4001](https://github.com/seata/seata/pull/4001)] 支持从Nacos,Zookeeper,Consul,Etcd3 中读取 yml
+  - [[#4017](https://github.com/seata/seata/pull/4017)] 优化文件配置
+  - [[#4018](https://github.com/seata/seata/pull/4018)] 优化 Apollo 配置
+  - [[#4021](https://github.com/seata/seata/pull/4021)] 优化 Nacos、Consul、Zookeeper、Etcd3 配置
+  - [[#4034](https://github.com/seata/seata/pull/4034)] 优化“优化 Nacos、Consul、Zookeeper、Etcd3 配置(#4019)”的单元测试类
+  - [[#4055](https://github.com/seata/seata/pull/4055)] 优化NetUtil的getLocalAddress0方法
+  - [[#4086](https://github.com/seata/seata/pull/4086)] 分支事务支持懒加载并优化任务调度
+  - [[#4056](https://github.com/seata/seata/pull/4056)] 优化 DurationUtil
+  - [[#4103](https://github.com/seata/seata/pull/4103)] 减少分支事务注册无需竞争锁时的内存占用 
+  - [[#3733](https://github.com/seata/seata/pull/3733)] 优化本地事务下的锁竞争机制 
+  - [[#4144](https://github.com/seata/seata/pull/4144)] 支持默认的事务分组配置 
+  - [[#4157](https://github.com/seata/seata/pull/4157)] 优化客户端批量发送请求
+  - [[#4191](https://github.com/seata/seata/pull/4191)] RPC请求超时时间支持配置化
+  - [[#4216](https://github.com/seata/seata/pull/4216)] 非AT模式无须清理undolog表
+  - [[#4176](https://github.com/seata/seata/pull/4176)] 优化redis注册中心存储,改用自动过期key替代hash.
+  - [[#4196](https://github.com/seata/seata/pull/4196)] TC 批量响应客户端
+  - [[#4212](https://github.com/seata/seata/pull/4212)] 控制台接口合并优化
+  - [[#4237](https://github.com/seata/seata/pull/4237)] 当所有的before image均为空的时候,跳过checkLock的步骤
+  - [[#4251](https://github.com/seata/seata/pull/4251)] 优化部分代码处理
+  - [[#4262](https://github.com/seata/seata/pull/4262)] 优化 tcc 模块代码处理
+  - [[#4235](https://github.com/seata/seata/pull/4235)] 优化eureka注册中心保存实例信息
+  - [[#4277](https://github.com/seata/seata/pull/4277)] 优化Redis-pipeline模式本地事务下的锁竞争机制
+  - [[#4284](https://github.com/seata/seata/pull/4284)] 支持MSE-Nacos 的 ak/sk 鉴权方式
+  - [[#4299](https://github.com/seata/seata/pull/4299)] 优化异常提示
+  - [[#4300](https://github.com/seata/seata/pull/4300)] 优化NettyRemotingServer的close()由DefaultCoordinator来调用,不再额外注册到ServerRunner
+  - [[#4270](https://github.com/seata/seata/pull/4270)] 提高全局提交和全局回滚的性能,分支事务清理异步化
+  - [[#4307](https://github.com/seata/seata/pull/4307)] 优化在TCC模式减少不必要的全局锁删除
+  - [[#4303](https://github.com/seata/seata/pull/4303)] `tcc_fence_log`表悬挂日志记录异步删除
+  - [[#4328](https://github.com/seata/seata/pull/4328)] 配置上传脚本支持注释
+  - [[#4305](https://github.com/seata/seata/pull/4305)] 优化tc端全局锁获取失败时的日志打印
+  - [[#4336](https://github.com/seata/seata/pull/4336)] 添加AT模式不支持的SQL语句异常提示
+  - [[#4359](https://github.com/seata/seata/pull/4359)] 支持配置元数据读取环境变量
+  - [[#4353](https://github.com/seata/seata/pull/4353)] 为 `seata-all.jar` 瘦身。  
+  - [[#4393](https://github.com/seata/seata/pull/4393)] redis & db 模式下启动不需要reload
+  - [[#4247](https://github.com/seata/seata/pull/4247)] 在`github/actions`上,添加基于 `java17` 和 `springboot` 各版本的测试
+  - [[#4400](https://github.com/seata/seata/pull/4400)] 异步二阶段任务支持并行处理提升效率 
+  - [[#4391](https://github.com/seata/seata/pull/4391)] commit/rollback 重试超时事件
+  - [[#4409](https://github.com/seata/seata/pull/4409)] 测试类添加版权标题
+  - [[#4282](https://github.com/seata/seata/pull/4282)] 优化回滚镜像构建逻辑
+  - [[#4407](https://github.com/seata/seata/pull/4407)] file模式下无需延迟删除globasession
+  - [[#4436](https://github.com/seata/seata/pull/4436)] 优化file模式下的global session查询接口
+  - [[#4431](https://github.com/seata/seata/pull/4431)] 优化redis模式查询globalSession限制查询条数
+  - [[#4465](https://github.com/seata/seata/pull/4465)] 优化TC 批量响应客户端模式客户端版本传输方式
+  - [[#4469](https://github.com/seata/seata/pull/4469)] 优化控制台db模式下获取配置的方式
+  - [[#4478](https://github.com/seata/seata/pull/4478)] 优化 Nacos 配置和注册元数据属性
+  - [[#4522](https://github.com/seata/seata/pull/4522)] 优化 GC 参数
+  - [[#4517](https://github.com/seata/seata/pull/4517)] 增强失败/超时状态的监控
+  - [[#4451](https://github.com/seata/seata/pull/4451)] filesessionmanager改为单例并优化任务线程池处理
+  - [[#4551](https://github.com/seata/seata/pull/4551)] 优化 metrics rt 统计问题
+  - [[#4574](https://github.com/seata/seata/pull/4574)] 支持 accessKey/secretKey 配置自动注入
+  - [[#4583](https://github.com/seata/seata/pull/4583)] DefaultAuthSigner的默认签名加密方法替换为HmacSHA256
+  - [[#4591](https://github.com/seata/seata/pull/4591)] 优化开关默认值
+  - [[#3780](https://github.com/seata/seata/pull/3780)] 升级 Druid 版本
+  - [[#3797](https://github.com/seata/seata/pull/3797)] 支持在`Try` 方法外,由用户自己实例化`BusinessActionContext`,再以`Try`方法入参的形式传入
+  - [[#3909](https://github.com/seata/seata/pull/3909)] 优化`collectRowLocks` 方法
+  - [[#3763](https://github.com/seata/seata/pull/3763)] 优化 github actions
+  - [[#4345](https://github.com/seata/seata/pull/4345)] 修正包目录名
+  - [[#4346](https://github.com/seata/seata/pull/4346)] 优化服务器日志并移除lombok
+  - [[#4348](https://github.com/seata/seata/pull/4348)] 统一管理maven插件及其版本
+  - [[#4354](https://github.com/seata/seata/pull/4354)] 优化saga测试用例
+  - [[#4227](https://github.com/seata/seata/pull/4227)] 统一管理依赖的版本,并且升级spring-boot到2.4.13
+  - [[#4403](https://github.com/seata/seata/pull/4403)] 禁用saga单测
+  - [[#4453](https://github.com/seata/seata/pull/4453)] 升级 eureka-clients 和 xstream 的版本
+  - [[#4481](https://github.com/seata/seata/pull/4481)] 优化nacos配置和命名属性
+  - [[#4477](https://github.com/seata/seata/pull/4477)] 优化调试级别日志并修复拼写错误
+  - [[#4484](https://github.com/seata/seata/pull/4484)] 优化TM/RM注册时TC的日志打印
+  - [[#3874](https://github.com/seata/seata/pull/4484)] 增加登记企业,修改图片至alicdn
+  - [[#4458](https://github.com/seata/seata/pull/4458)] 修复 metrices 模块 README.md 的配置遗漏问题
+  - [[#4482](https://github.com/seata/seata/pull/4482)] 移除重复单词
+
+### test:
+
+
+ 非常感谢以下 contributors 的代码贡献。若有无意遗漏,请报告。
+
+  - [slievrly](https://github.com/slievrly) 
+  - [wangliang181230](https://github.com/wangliang181230)
+  - [a364176773](https://github.com/a364176773) 
+  - [lvekee](https://github.com/lvekee)
+  - [caohdgege](https://github.com/caohdgege)
+  - [lightClouds917](https://github.com/lightClouds917)
+  - [objcoding](https://github.com/objcoding)
+  - [siyu](https://github.com/Pinocchio2018)
+  - [GoodBoyCoder](https://github.com/GoodBoyCoder)
+  - [pengten](https://github.com/pengten)
+  - [Bughue](https://github.com/Bughue)
+  - [doubleDimple](https://github.com/doubleDimple)
+  - [zhaoyuguang](https://github.com/zhaoyuguang)
+  - [liuqiufeng](https://github.com/liuqiufeng)
+  - [jsbxyyx](https://github.com/jsbxyyx)
+  - [lcmvs](https://github.com/lcmvs)
+  - [onlinechild](https://github.com/onlinechild)
+  - [xjlgod](https://github.com/xjlgod)
+  - [h-zhi](https://github.com/h-zhi)
+  - [tanzzj](https://github.com/tanzzj)
+  - [miaoxueyu](https://github.com/miaoxueyu)
+  - [selfishlover](https://github.com/selfishlover)
+  - [tuwenlin](https://github.com/tuwenlin)
+  - [dmego](https://github.com/dmego)
+  - [xiaochangbai](https://github.com/xiaochangbai)
+  - [Rubbernecker](https://github.com/Rubbernecker)
+  - [ruanun](https://github.com/ruanun)
+  - [huan415](https://github.com/huan415)
+  - [drgnchan](https://github.com/drgnchan) 
+  - [cmonkey](https://github.com/cmonkey)
+  - [13414850431](https://github.com/13414850431)
+  - [ls9527](https://github.com/ls9527)
+  - [xingfudeshi](https://github.com/xingfudeshi)
+  - [spilledyear](https://github.com/spilledyear)
+  - [kaka2code](https://github.com/kaka2code)
+  - [iqinning](https://github.com/iqinning)
+  - [yujianfei1986](https://github.com/yujianfei1986)
+  - [elrond-g](https://github.com/elrond-g)
+  - [jameslcj](https://github.com/jameslcj)
+  - [zhouchuhang](https://github.com/zch0214)
+  - [xujj](https://github.com/XBNGit)
+  - [mengxzh](https://github.com/mengxzh)
+  - [portman](https://github.com/iportman)
+  - [anselleeyy](https://github.com/anselleeyy)
+  - [wangyuewen](https://github.com/2858917634)
+  - [imherewait](https://github.com/imherewait)
+  - [wfnuser](https://github.com/wfnuser)
+  - [zhixing](https://github.com/chenlei3641)
+
+同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
+
+   #### Link
+
+   - **Seata:** https://github.com/seata/seata  
+   - **Seata-Samples:** https://github.com/seata/seata-samples   
+   - **Release:** https://github.com/seata/seata/releases
+   - **WebSite:** https://seata.io
+
+</details>

+ 92 - 0
changes/zh-cn/1.5.2.md

@@ -0,0 +1,92 @@
+### 1.5.2
+
+[source](https://github.com/seata/seata/archive/v1.5.2.zip) |
+[binary](https://github.com/seata/seata/releases/download/v1.5.2/seata-server-1.5.2.zip)
+
+<details>
+  <summary><mark>Release notes</mark></summary>
+
+
+### Seata 1.5.2
+
+Seata 1.5.2  发布。
+
+Seata 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。
+
+此版本更新如下:
+
+### feature:
+- [[#4661](https://github.com/seata/seata/pull/4713)] 支持根据xid负载均衡算法
+- [[#4676](https://github.com/seata/seata/pull/4676)] 支持Nacos作为注册中心时,server通过挂载SLB暴露服务
+- [[#4642](https://github.com/seata/seata/pull/4642)] 支持client批量请求并行处理
+- [[#4567](https://github.com/seata/seata/pull/4567)] 支持where条件中find_in_set函数
+
+
+### bugfix:
+- [[#4515](https://github.com/seata/seata/pull/4515)] 修复develop分支SeataTCCFenceAutoConfiguration在客户端未使用DB时,启动抛出ClassNotFoundException的问题。
+- [[#4661](https://github.com/seata/seata/pull/4661)] 修复控制台中使用PostgreSQL出现的SQL异常
+- [[#4667](https://github.com/seata/seata/pull/4682)] 修复develop分支RedisTransactionStoreManager迭代时更新map的异常
+- [[#4678](https://github.com/seata/seata/pull/4678)] 修复属性transport.enableRmClientBatchSendRequest没有配置的情况下缓存穿透的问题
+- [[#4701](https://github.com/seata/seata/pull/4701)] 修复命令行参数丢失问题
+- [[#4607](https://github.com/seata/seata/pull/4607)] 修复跳过全局锁校验的缺陷
+- [[#4696](https://github.com/seata/seata/pull/4696)] 修复 oracle 存储模式时的插入问题
+- [[#4726](https://github.com/seata/seata/pull/4726)] 修复批量发送消息时可能的NPE问题
+- [[#4729](https://github.com/seata/seata/pull/4729)] 修复AspectTransactional.rollbackForClassName设置错误
+- [[#4653](https://github.com/seata/seata/pull/4653)] 修复 INSERT_ON_DUPLICATE 主键为非数值异常
+
+### optimize:
+- [[#4650](https://github.com/seata/seata/pull/4650)] 修复安全漏洞
+- [[#4670](https://github.com/seata/seata/pull/4670)] 优化branchResultMessageExecutor线程池的线程数
+- [[#4662](https://github.com/seata/seata/pull/4662)] 优化回滚事务监控指标
+- [[#4693](https://github.com/seata/seata/pull/4693)] 优化控制台导航栏
+- [[#4700](https://github.com/seata/seata/pull/4700)] 修复 maven-compiler-plugin 和 maven-resources-plugin 执行失败
+- [[#4711](https://github.com/seata/seata/pull/4711)] 分离部署时 lib 依赖
+- [[#4720](https://github.com/seata/seata/pull/4720)] 优化pom描述
+- [[#4728](https://github.com/seata/seata/pull/4728)] 将logback版本依赖升级至1.2.9
+- [[#4745](https://github.com/seata/seata/pull/4745)] 发行包中支持 mysql8 driver
+- [[#4626](https://github.com/seata/seata/pull/4626)] 使用 `easyj-maven-plugin` 插件代替 `flatten-maven-plugin`插件,以修复`shade` 插件与 `flatten` 插件不兼容的问题
+- [[#4629](https://github.com/seata/seata/pull/4629)] 更新globalSession状态时检查更改前后的约束关系
+- [[#4662](https://github.com/seata/seata/pull/4662)] 优化 EnhancedServiceLoader 可读性
+- [[#4445](https://github.com/seata/seata/pull/4445)] 优化事务超时判断
+- [[#4958](https://github.com/seata/seata/pull/4958)] 优化当本地事务超时回滚后after commit事件被调用
+
+
+### test:
+- [[#4544](https://github.com/seata/seata/pull/4544)] 优化TransactionContextFilterTest中jackson包依赖问题
+- [[#4731](https://github.com/seata/seata/pull/4731)] 修复 AsyncWorkerTest 和 LockManagerTest 的单测问题。
+
+
+非常感谢以下 contributors 的代码贡献。若有无意遗漏,请报告。
+
+<!-- 请确保您的 GitHub ID 在以下列表中 -->
+- [slievrly](https://github.com/slievrly)
+- [pengten](https://github.com/pengten)
+- [YSF-A](https://github.com/YSF-A)
+- [tuwenlin](https://github.com/tuwenlin)
+- [2129zxl](https://github.com/2129zxl)
+- [Ifdevil](https://github.com/Ifdevil)
+- [wingchi-leung](https://github.com/wingchi-leung)
+- [liurong](https://github.com/robynron)
+- [opelok-z](https://github.com/opelok-z)
+- [a364176773](https://github.com/a364176773)
+- [Smery-lxm](https://github.com/Smery-lxm)
+- [lvekee](https://github.com/lvekee)
+- [doubleDimple](https://github.com/doubleDimple)
+- [wangliang181230](https://github.com/wangliang181230)
+- [Bughue](https://github.com/Bughue)
+- [AYue-94](https://github.com/AYue-94)
+- [lingxiao-wu](https://github.com/lingxiao-wu)
+- [caohdgege](https://github.com/caohdgege)
+- [miaoxueyu](https://github.com/miaoxueyu)
+
+同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
+
+
+#### Link
+
+- **Seata:** https://github.com/seata/seata
+- **Seata-Samples:** https://github.com/seata/seata-samples
+- **Release:** https://github.com/seata/seata/releases
+- **WebSite:** https://seata.io
+
+</details>

+ 153 - 0
changes/zh-cn/1.6.0.md

@@ -0,0 +1,153 @@
+### 1.6.0
+
+[source](https://github.com/seata/seata/archive/v1.6.0.zip) |
+[binary](https://github.com/seata/seata/releases/download/v1.6.0/seata-server-1.6.0.zip)
+
+<details>
+  <summary><mark>Release notes</mark></summary>
+
+
+### Seata 1.6.0
+
+Seata 1.6.0  发布。
+
+Seata 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。
+
+此版本更新如下:
+
+### feature:
+- [[#4863](https://github.com/seata/seata/pull/4863)] 支持 oracle 和 postgresql 多主键
+- [[#4649](https://github.com/seata/seata/pull/4649)] seata-server支持多注册中心
+- [[#4779](https://github.com/seata/seata/pull/4779)] 支持 Apache Dubbo3
+- [[#4479](https://github.com/seata/seata/pull/4479)] TCC注解支持添加在接口和实现类上
+- [[#4877](https://github.com/seata/seata/pull/4877)] client sdk 支持jdk17
+- [[#4914](https://github.com/seata/seata/pull/4914)] 支持 mysql 的update join联表更新语法
+- [[#4542](https://github.com/seata/seata/pull/4542)] 支持 oracle timestamp 类型
+- [[#5111](https://github.com/seata/seata/pull/5111)] 支持Nacos contextPath 配置
+- [[#4802](https://github.com/seata/seata/pull/4802)] dockerfile 支持 arm64
+
+
+### bugfix:
+- [[#4780](https://github.com/seata/seata/pull/4780)] 修复超时回滚成功后无法发送TimeoutRollbacked事件
+- [[#4954](https://github.com/seata/seata/pull/4954)] 修复output表达式错误时,保存执行结果空指针异常
+- [[#4817](https://github.com/seata/seata/pull/4817)] 修复高版本springboot配置不标准的问题
+- [[#4838](https://github.com/seata/seata/pull/4838)] 修复使用 Statement.executeBatch() 时无法生成undo log 的问题
+- [[#4533](https://github.com/seata/seata/pull/4533)] 修复handleRetryRollbacking的event重复导致的指标数据不准确 
+- [[#4912](https://github.com/seata/seata/pull/4912)] 修复mysql InsertOnDuplicateUpdate 列名大小写不一致无法正确匹配
+- [[#4543](https://github.com/seata/seata/pull/4543)] 修复对 Oracle 数据类型nclob的支持
+- [[#4915](https://github.com/seata/seata/pull/4915)] 修复获取不到ServerRecoveryProperties属性的问题
+- [[#4919](https://github.com/seata/seata/pull/4919)] 修复XID的port和address出现null:0的情况
+- [[#4928](https://github.com/seata/seata/pull/4928)] 修复 rpcContext.getClientRMHolderMap NPE 问题
+- [[#4953](https://github.com/seata/seata/pull/4953)] 修复InsertOnDuplicateUpdate可绕过修改主键的问题
+- [[#4978](https://github.com/seata/seata/pull/4978)] 修复 kryo 支持循环依赖
+- [[#4985](https://github.com/seata/seata/pull/4985)] 修复 undo_log id重复的问题
+- [[#4874](https://github.com/seata/seata/pull/4874)] 修复OpenJDK 11 启动失败
+- [[#5018](https://github.com/seata/seata/pull/5018)] 修复启动脚本中 loader path 使用相对路径导致 server 启动失败问题
+- [[#5004](https://github.com/seata/seata/pull/5004)] 修复mysql update join行数据重复的问题
+- [[#5032](https://github.com/seata/seata/pull/5032)] 修复mysql InsertOnDuplicateUpdate中条件参数填充位置计算错误导致的镜像查询SQL语句异常问题
+- [[#5033](https://github.com/seata/seata/pull/5033)] 修复InsertOnDuplicateUpdate的SQL语句中无插入列字段导致的空指针问题
+- [[#5038](https://github.com/seata/seata/pull/5038)] 修复SagaAsyncThreadPoolProperties冲突问题
+- [[#5050](https://github.com/seata/seata/pull/5050)] 修复Saga模式下全局状态未正确更改成Committed问题
+- [[#5052](https://github.com/seata/seata/pull/5052)] 修复update join条件中占位符参数问题
+- [[#5031](https://github.com/seata/seata/pull/5031)] 修复InsertOnDuplicateUpdate中不应该使用null值索引作为查询条件
+- [[#5075](https://github.com/seata/seata/pull/5075)] 修复InsertOnDuplicateUpdate无法拦截无主键和唯一索引的SQL
+- [[#5093](https://github.com/seata/seata/pull/5093)] 修复seata server重启后accessKey丢失问题
+- [[#5092](https://github.com/seata/seata/pull/5092)] 修复当seata and jpa共同使用时, AutoConfiguration的顺序不正确的问题
+- [[#5109](https://github.com/seata/seata/pull/5109)] 修复当RM侧没有加@GlobalTransactional报NPE的问题
+- [[#5098](https://github.com/seata/seata/pull/5098)] Druid 禁用 oracle implicit cache
+- [[#4860](https://github.com/seata/seata/pull/4860)] 修复metrics tag覆盖问题
+- [[#5028](https://github.com/seata/seata/pull/5028)] 修复 insert on duplicate SQL中 null 值问题
+- [[#5078](https://github.com/seata/seata/pull/5078)] 修复SQL语句中无主键和唯一键拦截问题
+- [[#5097](https://github.com/seata/seata/pull/5097)] 修复当Server重启时 accessKey 丢失问题
+- [[#5131](https://github.com/seata/seata/pull/5131)] 修复XAConn处于active状态时无法回滚的问题
+- [[#5134](https://github.com/seata/seata/pull/5134)] 修复hikariDataSource 自动代理在某些情况下失效的问题
+- [[#5163](https://github.com/seata/seata/pull/5163)] 修复高版本JDK编译失败的问题
+
+### optimize:
+- [[#4681](https://github.com/seata/seata/pull/4681)] 优化竞争锁过程
+- [[#4774](https://github.com/seata/seata/pull/4774)] 优化 seataio/seata-server 镜像中的 mysql8 依赖
+- [[#4750](https://github.com/seata/seata/pull/4750)] 优化AT分支释放全局锁不使用xid
+- [[#4790](https://github.com/seata/seata/pull/4790)] 添加自动发布 OSSRH github action
+- [[#4765](https://github.com/seata/seata/pull/4765)] mysql8.0.29版本及以上XA模式不持connection至二阶段
+- [[#4797](https://github.com/seata/seata/pull/4797)] 优化所有github actions脚本
+- [[#4800](https://github.com/seata/seata/pull/4800)] 添加 NOTICE 文件
+- [[#4761](https://github.com/seata/seata/pull/4761)] 使用 hget 代替 RedisLocker 中的 hmget
+- [[#4414](https://github.com/seata/seata/pull/4414)] 移除log4j依赖
+- [[#4836](https://github.com/seata/seata/pull/4836)] 优化 BaseTransactionalExecutor#buildLockKey(TableRecords rowsIncludingPK) 方法可读性
+- [[#4865](https://github.com/seata/seata/pull/4865)] 修复 Saga 可视化设计器 GGEditor 安全漏洞
+- [[#4590](https://github.com/seata/seata/pull/4590)] 自动降级支持开关支持动态配置
+- [[#4490](https://github.com/seata/seata/pull/4490)] tccfence 记录表优化成按索引删除
+- [[#4911](https://github.com/seata/seata/pull/4911)] 添加 header 和license 检测
+- [[#4917](https://github.com/seata/seata/pull/4917)] 升级 package-lock.json 修复漏洞
+- [[#4924](https://github.com/seata/seata/pull/4924)] 优化 pom 依赖
+- [[#4932](https://github.com/seata/seata/pull/4932)] 抽取部分配置的默认值
+- [[#4925](https://github.com/seata/seata/pull/4925)] 优化 javadoc 注释
+- [[#4921](https://github.com/seata/seata/pull/4921)] 修复控制台模块安全漏洞和升级 skywalking-eyes 版本
+- [[#4936](https://github.com/seata/seata/pull/4936)] 优化存储配置的读取
+- [[#4946](https://github.com/seata/seata/pull/4946)] 将获取锁时遇到的sql异常传递给客户端
+- [[#4962](https://github.com/seata/seata/pull/4962)] 优化构建配置,并修正docker镜像的基础镜像
+- [[#4974](https://github.com/seata/seata/pull/4974)] 取消redis模式下,查询globalStatus数量的限制
+- [[#4981](https://github.com/seata/seata/pull/4981)] 优化当tcc fence记录查不到时的错误提示
+- [[#4995](https://github.com/seata/seata/pull/4995)] 修复mysql InsertOnDuplicateUpdate后置镜像查询SQL中重复的主键查询条件
+- [[#5047](https://github.com/seata/seata/pull/5047)] 移除无用代码
+- [[#5051](https://github.com/seata/seata/pull/5051)] 回滚时undolog产生脏写需要抛出不再重试(BranchRollbackFailed_Unretriable)的异常
+- [[#5075](https://github.com/seata/seata/pull/5075)] 拦截没有主键及唯一索引值的insert on duplicate update语句
+- [[#5104](https://github.com/seata/seata/pull/5104)] ConnectionProxy脱离对druid的依赖
+- [[#5124](https://github.com/seata/seata/pull/5124)] 支持oracle删除TCC fence记录表
+- [[#4468](https://github.com/seata/seata/pull/4968)] 支持kryo 5.3.0
+- [[#4807](https://github.com/seata/seata/pull/4807)] 优化镜像和OSS仓库发布流水线
+- [[#4445](https://github.com/seata/seata/pull/4445)] 优化事务超时判断
+- [[#4958](https://github.com/seata/seata/pull/4958)] 优化超时事务 triggerAfterCommit() 的执行
+- [[#4582](https://github.com/seata/seata/pull/4582)] 优化redis存储模式的事务排序
+- [[#4963](https://github.com/seata/seata/pull/4963)] 增加 ARM64 流水线 CI 测试
+- [[#4434](https://github.com/seata/seata/pull/4434)] 移除 seata-server CMS GC 参数
+
+
+### test:
+- [[#4411](https://github.com/seata/seata/pull/4411)] 测试Oracle数据库AT模式下类型支持
+- [[#4794](https://github.com/seata/seata/pull/4794)] 重构代码,尝试修复单元测试 `DataSourceProxyTest.getResourceIdTest()`
+- [[#5101](https://github.com/seata/seata/pull/5101)] 修复zk注册和配置中心报ClassNotFoundException的问题 `DataSourceProxyTest.getResourceIdTest()`
+
+
+非常感谢以下 contributors 的代码贡献。若有无意遗漏,请报告。
+
+<!-- 请确保您的 GitHub ID 在以下列表中 -->
+- [slievrly](https://github.com/slievrly)
+- [renliangyu857](https://github.com/renliangyu857)
+- [wangliang181230](https://github.com/wangliang181230)
+- [a364176773](https://github.com/a364176773)
+- [tuwenlin](https://github.com/tuwenlin)
+- [lcmvs](https://github.com/lcmvs)
+- [AlexStocks](https://github.com/AlexStocks)
+- [liujunlin5168](https://github.com/liujunlin5168)
+- [pengten](https://github.com/pengten)
+- [YSF-A](https://github.com/YSF-A)
+- [doubleDimple](https://github.com/doubleDimple)
+- [liuqiufeng](https://github.com/liuqiufeng)
+- [yujianfei1986](https://github.com/yujianfei1986)
+- [Bughue](https://github.com/Bughue)
+- [AlbumenJ](https://github.com/AlbumenJ)
+- [jsbxyyx](https://github.com/jsbxyyx)
+- [tuwenlin](https://github.com/tuwenlin)
+- [CrazyLionLi](https://github.com/JavaLionLi)
+- [whxxxxx](https://github.com/whxxxxx)
+- [neillee95](https://github.com/neillee95)
+- [crazy-sheep](https://github.com/crazy-sheep)
+- [zhangzq7](https://github.com/zhangzq7)
+- [l81893521](https://github.com/l81893521)
+- [zhuyoufeng](https://github.com/zhuyoufeng)
+- [xingfudeshi](https://github.com/xingfudeshi)
+- [odidev](https://github.com/odidev)
+- [miaoxueyu](https://github.com/miaoxueyu)
+
+同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
+
+
+#### Link
+
+- **Seata:** https://github.com/seata/seata
+- **Seata-Samples:** https://github.com/seata/seata-samples
+- **Release:** https://github.com/seata/seata/releases
+- **WebSite:** https://seata.io
+
+</details>

+ 49 - 0
changes/zh-cn/1.6.1.md

@@ -0,0 +1,49 @@
+### 1.6.1
+
+[source](https://github.com/seata/seata/archive/v1.6.1.zip) |
+[binary](https://github.com/seata/seata/releases/download/v1.6.1/seata-server-1.6.1.zip)
+
+<details>
+  <summary><mark>Release notes</mark></summary>
+
+
+### Seata 1.6.1
+
+Seata 1.6.1  发布。
+
+Seata 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。
+
+此版本更新如下:
+
+### feature:
+- [[#5115](https://github.com/seata/seata/pull/5115)] 支持 `spring-boot:3.x`
+
+### bugfix:
+- [[#5179](https://github.com/seata/seata/pull/5179)] 修复使用Eureka作为注册中心ClassNotFoundException问题
+
+### optimize:
+- [[#5120](https://github.com/seata/seata/pull/5120)] 统一yml文件中的配置项格式
+- [[#5180](https://github.com/seata/seata/pull/5180)] GlobalTransactionScanner,SeataAutoDataSourceProxyCreator 创建bean用static修饰
+- [[#5182](https://github.com/seata/seata/pull/5182)] 修复 Saga 可视化设计器 GGEditor 安全漏洞
+- [[#5183](https://github.com/seata/seata/pull/5183)] 优化配置开关的默认值
+
+非常感谢以下 contributors 的代码贡献。若有无意遗漏,请报告。
+
+<!-- 请确保您的 GitHub ID 在以下列表中 -->
+- [slievrly](https://github.com/slievrly)
+- [wangliang181230](https://github.com/wangliang181230)
+- [xingfudeshi](https://github.com/xingfudeshi)
+- [whxxxxx](https://github.com/whxxxxx)
+- [xssdpgy](https://github.com/xssdpgy)
+
+同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
+
+
+#### Link
+
+- **Seata:** https://github.com/seata/seata
+- **Seata-Samples:** https://github.com/seata/seata-samples
+- **Release:** https://github.com/seata/seata/releases
+- **WebSite:** https://seata.io
+
+</details>

+ 46 - 0
changes/zh-cn/2.0.0.md

@@ -0,0 +1,46 @@
+### 2.0.0
+
+ [source](https://github.com/seata/seata/archive/v2.0.0.zip) |
+ [binary](https://github.com/seata/seata/releases/download/v2.0.0/seata-server-2.0.0.zip) 
+
+<details>
+  <summary><mark>Release notes</mark></summary>
+
+### Seata 2.0.0
+
+Seata 2.0.0 发布。
+
+Seata 是一款开源的分布式事务解决方案,提供高性能和简单易用的分布式事务服务。
+
+此版本更新如下:
+
+### feature:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] 样例,后续请删除
+
+### bugfix:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] 样例,后续请删除
+
+### optimize:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] 样例,后续请删除
+
+### test:
+  - [[#1234](https://github.com/seata/seata/pull/1234)] 样例,后续请删除
+
+
+### Contributors:
+
+非常感谢以下 contributors 的代码贡献。若有无意遗漏,请报告。
+
+  - [slievrly](https://github.com/slievrly)
+
+同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。
+
+
+#### Link
+
+  - **Seata:** https://github.com/seata/seata  
+  - **Seata-Samples:** https://github.com/seata/seata-samples   
+  - **Release:** https://github.com/seata/seata/releases
+  - **WebSite:** https://seata.io
+
+</details>

+ 22 - 0
changes/zh-cn/develop.md

@@ -0,0 +1,22 @@
+所有提交到 develop 分支的 PR 请在此处登记。
+
+<!-- 请根据PR的类型添加 `变更记录` 到以下对应位置(feature/bugfix/optimize/test) 下 -->
+
+### feature:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] 支持 xxx
+
+### bugfix:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] 修复 xxx
+
+### optimize:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] 优化 xxx
+
+### test:
+- [[#xxx](https://github.com/seata/seata/pull/xxx)] 增加 xxx 测试
+
+非常感谢以下 contributors 的代码贡献。若有无意遗漏,请报告。
+
+<!-- 请确保您的 GitHub ID 在以下列表中 -->
+- [slievrly](https://github.com/slievrly)
+
+同时,我们收到了社区反馈的很多有价值的issue和建议,非常感谢大家。

+ 25 - 0
codecov.yml

@@ -0,0 +1,25 @@
+codecov:
+  require_ci_to_pass: yes
+coverage:
+  status:
+    patch: no
+    project:
+      default:
+        threshold: 1%
+        if_not_found: success
+    changes: no
+  precision: 2
+  range: "50...100"
+ignore:
+ - "test/.*"
+ - ".github/.*"
+ - ".mvn/.*"
+ - ".style/.*"
+ - "*.md"
+ - "rm-datasource/src/test/java/io/seata/rm/datasource/mock"
+ - "sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/antlr/.*"
+ - "sqlparser/seata-sqlparser-antlr/src/main/java/io/seata/sqlparser/antlr/mysql/parser/.*"
+comment:
+  layout: "reach,diff,flags,tree"
+  behavior: default
+  require_changes: no

+ 55 - 0
common/.flattened-pom.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>io.seata</groupId>
+	<artifactId>seata-common</artifactId>
+	<version>1.6.1</version>
+	<name>seata-common 1.6.1</name>
+	<description>common library for Seata built with Maven</description>
+	<url>https://seata.io</url>
+	<organization>
+		<name>Seata</name>
+		<url>https://github.com/seata</url>
+	</organization>
+	<licenses>
+		<license>
+			<name>Apache License, Version 2.0</name>
+			<url>https://www.apache.org/licenses/LICENSE-2.0</url>
+			<distribution>repo</distribution>
+		</license>
+	</licenses>
+	<developers>
+		<developer>
+			<id>Seata</id>
+			<name>Seata</name>
+			<email>dev-seata@googlegroups.com</email>
+			<url>https://seata.io</url>
+		</developer>
+	</developers>
+	<scm>
+		<connection>scm:git@github.com:seata/seata.git</connection>
+		<developerConnection>scm:git@github.com:seata/seata.git</developerConnection>
+		<url>git@github.com:seata/seata.git</url>
+	</scm>
+	<issueManagement>
+		<system>github</system>
+		<url>https://github.com/seata/seata/issues</url>
+	</issueManagement>
+	<dependencies>
+		<dependency>
+			<groupId>io.netty</groupId>
+			<artifactId>netty-all</artifactId>
+			<version>4.1.76.Final</version>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+			<version>1.7.36</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.6</version>
+		</dependency>
+	</dependencies>
+</project>

+ 44 - 0
common/pom.xml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~  Copyright 1999-2019 Seata.io Group.
+  ~
+  ~  Licensed 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>io.seata</groupId>
+        <artifactId>seata-parent</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>seata-common</artifactId>
+    <packaging>jar</packaging>
+    <name>seata-common ${project.version}</name>
+    <description>common library for Seata built with Maven</description>
+    <dependencies>
+        <dependency>
+            <groupId>io.netty</groupId>
+            <artifactId>netty-all</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+        </dependency>
+    </dependencies>
+</project>

+ 867 - 0
common/src/main/java/io/seata/common/ConfigurationKeys.java

@@ -0,0 +1,867 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common;
+
+/**
+ * The type Configuration keys.
+ *
+ * @author slievrly
+ */
+public interface ConfigurationKeys {
+    /**
+     * The constant SEATA_FILE_ROOT_CONFIG
+     */
+    String SEATA_FILE_ROOT_CONFIG = "seata";
+    /**
+     * The constant FILE_ROOT_REGISTRY.
+     */
+    String FILE_ROOT_REGISTRY = "registry";
+    /**
+     * The constant FILE_ROOT_CONFIG.
+     */
+    String FILE_ROOT_CONFIG = "config";
+    /**
+     * The constant FILE_CONFIG_SPLIT_CHAR.
+     */
+    String FILE_CONFIG_SPLIT_CHAR = ".";
+    /**
+     * The constant FILE_ROOT_TYPE.
+     */
+    String FILE_ROOT_TYPE = "type";
+    /**
+     * The constant DATA_TYPE.
+     */
+    String DATA_TYPE = "dataType";
+
+    /**
+     * The constant SEATA_PREFIX.
+     */
+    String SEATA_PREFIX = SEATA_FILE_ROOT_CONFIG + ".";
+
+    /**
+     * The constant SERVICE_PREFIX.
+     */
+    String SERVICE_PREFIX = "service.";
+
+    /**
+     * The constant STORE_PREFIX.
+     */
+    String STORE_PREFIX = "store.";
+
+    /**
+     * The constant SESSION_PREFIX.
+     */
+    String SESSION_PREFIX = "session.";
+
+    /**
+     * The constant STORE_SESSION_PREFIX.
+     */
+    String STORE_SESSION_PREFIX = STORE_PREFIX + SESSION_PREFIX;
+
+    /**
+     * The constant MODE.
+     */
+    String MODE = "mode";
+
+    /**
+     * The constant STORE_MODE.
+     */
+    String STORE_MODE = STORE_PREFIX + MODE;
+
+    /**
+     * The constant SERVER_STORE_MODE.
+     */
+    String SERVER_STORE_MODE = SEATA_PREFIX + STORE_PREFIX + MODE;
+
+    /**
+     * The constant STORE_LOCK_MODE.
+     */
+    String STORE_LOCK_MODE = STORE_PREFIX + "lock." + MODE;
+
+    /**
+     * The constant SERVER_STORE_LOCK_MODE.
+     */
+    String SERVER_STORE_LOCK_MODE = SEATA_PREFIX + STORE_PREFIX + "lock." + MODE;
+
+    /**
+     * The constant STORE_SESSION_MODE.
+     */
+    String STORE_SESSION_MODE = STORE_SESSION_PREFIX + MODE;
+
+    /**
+     * The constant SERVER_STORE_SESSION_MODE.
+     */
+    String SERVER_STORE_SESSION_MODE = SEATA_PREFIX + STORE_SESSION_PREFIX + MODE;
+
+    /**
+     * The constant STORE_PUBLIC_KEY.
+     */
+    String STORE_PUBLIC_KEY = STORE_PREFIX + "publicKey";
+
+    /**
+     * The constant STORE_FILE_PREFIX
+     */
+    String STORE_FILE_PREFIX = STORE_PREFIX + "file.";
+
+    /**
+     * The constant STORE_FILE_DIR
+     */
+    String STORE_FILE_DIR = STORE_FILE_PREFIX + "dir";
+
+    /**
+     * The constant SERVICE_GROUP_MAPPING_PREFIX.
+     */
+    String SERVICE_GROUP_MAPPING_PREFIX = SERVICE_PREFIX + "vgroupMapping.";
+    /**
+     * The constant GROUPLIST_POSTFIX.
+     */
+    String GROUPLIST_POSTFIX = ".grouplist";
+    /**
+     * The constant SERVER_NODE_SPLIT_CHAR.
+     */
+    String SERVER_NODE_SPLIT_CHAR = System.getProperty("line.separator");
+
+    /**
+     * The constant ENABLE_DEGRADE_POSTFIX.
+     */
+    String ENABLE_DEGRADE_POSTFIX = "enableDegrade";
+
+    /**
+     * The constant CLIENT_PREFIX.
+     */
+    String CLIENT_PREFIX = "client.";
+
+    /**
+     * The constant SERVER_PREFIX.
+     */
+    String SERVER_PREFIX = "server.";
+
+    /**
+     * The constant TRANSPORT_PREFIX.
+     */
+    String TRANSPORT_PREFIX = "transport.";
+
+    /**
+     * The constant CLIENT_RM_PREFIX.
+     */
+    String CLIENT_RM_PREFIX = CLIENT_PREFIX + "rm.";
+
+    /**
+     * The constant CLIENT_ASYNC_COMMIT_BUFFER_LIMIT.
+     */
+    String CLIENT_ASYNC_COMMIT_BUFFER_LIMIT = CLIENT_RM_PREFIX + "asyncCommitBufferLimit";
+    /**
+     * The constant CLIENT_RM_LOCK_PREFIX.
+     */
+    String CLIENT_RM_LOCK_PREFIX = CLIENT_RM_PREFIX + "lock.";
+
+    /**
+     * The constant CLIENT_LOCK_RETRY_TIMES.
+     */
+    String CLIENT_LOCK_RETRY_TIMES = CLIENT_RM_LOCK_PREFIX + "retryTimes";
+    /**
+     * The constant CLIENT_LOCK_RETRY_INTERVAL.
+     */
+    String CLIENT_LOCK_RETRY_INTERVAL = CLIENT_RM_LOCK_PREFIX + "retryInterval";
+    /**
+     * The constant CLIENT_LOCK_RETRY_POLICY_BRANCH_ROLLBACK_ON_CONFLICT.
+     */
+    String CLIENT_LOCK_RETRY_POLICY_BRANCH_ROLLBACK_ON_CONFLICT = CLIENT_RM_LOCK_PREFIX + "retryPolicyBranchRollbackOnConflict";
+
+    /**
+     * The constant SERVICE_SESSION_RELOAD_READ_SIZE
+     */
+    String SERVICE_SESSION_RELOAD_READ_SIZE = STORE_FILE_PREFIX + "sessionReloadReadSize";
+
+    /**
+     * The constant CLIENT_REPORT_SUCCESS_ENABLE.
+     */
+    String CLIENT_REPORT_SUCCESS_ENABLE = CLIENT_RM_PREFIX + "reportSuccessEnable";
+
+    /**
+     * The constant CLIENT_SAGA_BRANCH_REGISTER_ENABLE.
+     */
+    String CLIENT_SAGA_BRANCH_REGISTER_ENABLE = CLIENT_RM_PREFIX + "sagaBranchRegisterEnable";
+
+    /**
+     * The constant CLIENT_SAGA_JSON_PARSER.
+     */
+    String CLIENT_SAGA_JSON_PARSER = CLIENT_RM_PREFIX + "sagaJsonParser";
+
+    /**
+     * The constant CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE.
+     */
+    String CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE = CLIENT_RM_PREFIX + "sagaRetryPersistModeUpdate";
+
+    /**
+     * The constant CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE.
+     */
+    String CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE = CLIENT_RM_PREFIX + "sagaCompensatePersistModeUpdate";
+
+    /**
+     * The constant CLIENT_REPORT_RETRY_COUNT.
+     */
+    String CLIENT_REPORT_RETRY_COUNT = CLIENT_RM_PREFIX + "reportRetryCount";
+
+    /**
+     * The constant CLIENT_TABLE_META_CHECK_ENABLE.
+     */
+    String CLIENT_TABLE_META_CHECK_ENABLE = CLIENT_RM_PREFIX + "tableMetaCheckEnable";
+
+    /**
+     * The constant CLIENT_TABLE_META_CHECKER_INTERVAL.
+     */
+    String CLIENT_TABLE_META_CHECKER_INTERVAL = CLIENT_RM_PREFIX + "tableMetaCheckerInterval";
+
+    /**
+     * The constant TCC_ACTION_INTERCEPTOR_ORDER.
+     */
+    String TCC_ACTION_INTERCEPTOR_ORDER = CLIENT_RM_PREFIX + "tccActionInterceptorOrder";
+
+    /**
+     * The constant CLIENT_TM_PREFIX.
+     */
+    String CLIENT_TM_PREFIX = CLIENT_PREFIX + "tm.";
+    /**
+     * The constant CLIENT_TM_COMMIT_RETRY_TIMES.
+     */
+    String CLIENT_TM_COMMIT_RETRY_COUNT = CLIENT_TM_PREFIX + "commitRetryCount";
+
+    /**
+     * The constant CLIENT_TM_ROLLBACK_RETRY_TIMES.
+     */
+    String CLIENT_TM_ROLLBACK_RETRY_COUNT = CLIENT_TM_PREFIX + "rollbackRetryCount";
+
+    /**
+     * The constant DEFAULT_GLOBAL_TRANSACTION_TIMEOUT.
+     */
+    String DEFAULT_GLOBAL_TRANSACTION_TIMEOUT = CLIENT_TM_PREFIX + "defaultGlobalTransactionTimeout";
+
+    /**
+     * The constant SERIALIZE_FOR_RPC.
+     */
+    String SERIALIZE_FOR_RPC = TRANSPORT_PREFIX + "serialization";
+
+    /**
+     * The constant COMPRESSOR_FOR_RPC.
+     *
+     * @since 0.7.0
+     */
+    String COMPRESSOR_FOR_RPC = TRANSPORT_PREFIX + "compressor";
+
+    /**
+     * The constant STORE_DB_PREFIX.
+     */
+    String STORE_DB_PREFIX = "store.db.";
+
+    /**
+     * The constant STORE_REDIS_PREFIX.
+     */
+    String STORE_REDIS_PREFIX = "store.redis.";
+
+    /**
+     * The constant STORE_DB_GLOBAL_TABLE.
+     */
+    String STORE_DB_GLOBAL_TABLE = STORE_DB_PREFIX + "globalTable";
+
+    /**
+     * The constant STORE_DB_BRANCH_TABLE.
+     */
+    String STORE_DB_BRANCH_TABLE = STORE_DB_PREFIX + "branchTable";
+
+    /**
+     * The constant DISTRIBUTED_LOCK_DB_TABLE.
+     */
+    String DISTRIBUTED_LOCK_DB_TABLE = STORE_DB_PREFIX + "distributedLockTable";
+
+    /**
+     * The constant STORE_DB_DATASOURCE_TYPE.
+     */
+    String STORE_DB_DATASOURCE_TYPE = STORE_DB_PREFIX + "datasource";
+
+    /**
+     * The constant STORE_DB_TYPE.
+     */
+    String STORE_DB_TYPE = STORE_DB_PREFIX + "dbType";
+
+    /**
+     * The constant STORE_DB_DRIVER_CLASS_NAME.
+     */
+    String STORE_DB_DRIVER_CLASS_NAME = STORE_DB_PREFIX + "driverClassName";
+
+    /**
+     * The constant STORE_DB_MAX_WAIT.
+     */
+    String STORE_DB_MAX_WAIT = STORE_DB_PREFIX + "maxWait";
+
+    /**
+     * The constant STORE_DB_URL.
+     */
+    String STORE_DB_URL = STORE_DB_PREFIX + "url";
+
+    /**
+     * The constant STORE_DB_USER.
+     */
+    String STORE_DB_USER = STORE_DB_PREFIX + "user";
+
+    /**
+     * The constant STORE_DB_PASSWORD.
+     */
+    String STORE_DB_PASSWORD = STORE_DB_PREFIX + "password";
+
+    /**
+     * The constant STORE_DB_MIN_CONN.
+     */
+    String STORE_DB_MIN_CONN = STORE_DB_PREFIX + "minConn";
+
+    /**
+     * The constant STORE_DB_MAX_CONN.
+     */
+    String STORE_DB_MAX_CONN = STORE_DB_PREFIX + "maxConn";
+
+    /**
+     * The constant STORE_DB_LOG_QUERY_LIMIT.
+     */
+    String STORE_DB_LOG_QUERY_LIMIT = STORE_DB_PREFIX + "queryLimit";
+
+    /**
+     * The constant LOCK_DB_TABLE.
+     */
+    String LOCK_DB_TABLE = STORE_DB_PREFIX + "lockTable";
+
+    /**
+     * The constant SERVER_RPC_PORT.
+     */
+    String SERVER_SERVICE_PORT_CAMEL = SERVER_PREFIX + "servicePort";
+
+    /**
+     * The constant SERVER_SERVICE_PORT_CONFIG.
+     */
+    String SERVER_SERVICE_PORT_CONFIG = SEATA_PREFIX + SERVER_PREFIX + "service-port";
+
+    /**
+     * The constant ENV_SEATA_PORT_KEY.
+     */
+    String ENV_SEATA_PORT_KEY = "SEATA_PORT";
+
+    /**
+     * The constant RECOVERY_PREFIX.
+     */
+    String RECOVERY_PREFIX = SERVER_PREFIX + "recovery.";
+
+    /**
+     * The constant COMMITING_RETRY_PERIOD.
+     */
+    String COMMITING_RETRY_PERIOD = RECOVERY_PREFIX + "committingRetryPeriod";
+
+    /**
+     * The constant ASYN_COMMITING_RETRY_PERIOD.
+     */
+    String ASYNC_COMMITING_RETRY_PERIOD = RECOVERY_PREFIX + "asyncCommittingRetryPeriod";
+
+    /**
+     * The constant ROLLBACKING_RETRY_PERIOD.
+     */
+    String ROLLBACKING_RETRY_PERIOD = RECOVERY_PREFIX + "rollbackingRetryPeriod";
+
+    /**
+     * The constant TIMEOUT_RETRY_PERIOD.
+     */
+    String TIMEOUT_RETRY_PERIOD = RECOVERY_PREFIX + "timeoutRetryPeriod";
+
+    /**
+     * The constant CLIENT_UNDO_PREFIX.
+     */
+    String CLIENT_UNDO_PREFIX = "client.undo.";
+
+    /**
+     * The constant TRANSACTION_UNDO_DATA_VALIDATION.
+     */
+    String TRANSACTION_UNDO_DATA_VALIDATION = CLIENT_UNDO_PREFIX + "dataValidation";
+
+    /**
+     * The constant TRANSACTION_UNDO_LOG_SERIALIZATION.
+     */
+    String TRANSACTION_UNDO_LOG_SERIALIZATION = CLIENT_UNDO_PREFIX + "logSerialization";
+
+    /**
+     * The constant TRANSACTION_UNDO_ONLY_CARE_UPDATE_COLUMNS.
+     */
+    String TRANSACTION_UNDO_ONLY_CARE_UPDATE_COLUMNS = CLIENT_UNDO_PREFIX + "onlyCareUpdateColumns";
+
+    /**
+     * the constant CLIENT_UNDO_COMPRESS_PREFIX
+     */
+    String CLIENT_UNDO_COMPRESS_PREFIX = CLIENT_UNDO_PREFIX + "compress.";
+
+    /**
+     * the constant CLIENT_UNDO_COMPRESS_TYPE
+     */
+    String CLIENT_UNDO_COMPRESS_TYPE = CLIENT_UNDO_COMPRESS_PREFIX + "type";
+
+    /**
+     * the constant CLIENT_UNDO_COMPRESS_ENABLE
+     */
+    String CLIENT_UNDO_COMPRESS_ENABLE = CLIENT_UNDO_COMPRESS_PREFIX + "enable";
+
+    /**
+     * the constant CLIENT_UNDO_COMPRESS_THRESHOLD
+     */
+    String CLIENT_UNDO_COMPRESS_THRESHOLD = CLIENT_UNDO_COMPRESS_PREFIX + "threshold";
+
+    /**
+     * The constant METRICS_PREFIX.
+     */
+    String METRICS_PREFIX = "metrics.";
+
+    /**
+     * The constant METRICS_ENABLED.
+     */
+    String METRICS_ENABLED = "enabled";
+
+    /**
+     * The constant METRICS_REGISTRY_TYPE.
+     */
+    String METRICS_REGISTRY_TYPE = "registryType";
+
+    /**
+     * The constant METRICS_EXPORTER_LIST.
+     */
+    String METRICS_EXPORTER_LIST = "exporterList";
+    /**
+     * The constant METRICS_EXPORTER_PROMETHEUS_PORT
+     */
+    String METRICS_EXPORTER_PROMETHEUS_PORT = "exporterPrometheusPort";
+
+    /**
+     * The constant SERVER_UNDO_PREFIX.
+     */
+    String SERVER_UNDO_PREFIX = SERVER_PREFIX + "undo.";
+
+    /**
+     * The constant TRANSACTION_UNDO_LOG_SAVE_DAYS.
+     */
+    String TRANSACTION_UNDO_LOG_SAVE_DAYS = SERVER_UNDO_PREFIX + "logSaveDays";
+
+    /**
+     * The constant TRANSACTION_UNDO_LOG_DELETE_PERIOD
+     */
+    String TRANSACTION_UNDO_LOG_DELETE_PERIOD = SERVER_UNDO_PREFIX + "logDeletePeriod";
+
+    /**
+     * The constant TRANSACTION_UNDO_LOG_TABLE
+     */
+    String TRANSACTION_UNDO_LOG_TABLE = CLIENT_UNDO_PREFIX + "logTable";
+    /**
+     * The constant LOG_PREFIX
+     */
+    String LOG_PREFIX = "log.";
+
+    /**
+     * The constant TRANSACTION_UNDO_LOG_EXCEPTION_RATE
+     */
+    String TRANSACTION_LOG_EXCEPTION_RATE = LOG_PREFIX + "exceptionRate";
+
+    /**
+     * The constant MAX_COMMIT_RETRY_TIMEOUT.
+     */
+    String MAX_COMMIT_RETRY_TIMEOUT = SERVER_PREFIX + "maxCommitRetryTimeout";
+
+    /**
+     * The constant MAX_ROLLBACK_RETRY_TIMEOUT.
+     */
+    String MAX_ROLLBACK_RETRY_TIMEOUT = SERVER_PREFIX + "maxRollbackRetryTimeout";
+
+    /**
+     * The constant ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE.
+     */
+    String ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE = SERVER_PREFIX + "rollbackRetryTimeoutUnlockEnable";
+
+    /**
+     * the constant RETRY_DEAD_THRESHOLD
+     */
+    String RETRY_DEAD_THRESHOLD = SERVER_PREFIX + "retryDeadThreshold";
+
+    /**
+     * the constant DISTRIBUTED_LOCK_EXPIRE_TIME
+     */
+    String DISTRIBUTED_LOCK_EXPIRE_TIME = SERVER_PREFIX + "distributedLockExpireTime";
+
+    /**
+     * The constant MIN_SERVER_POOL_SIZE.
+     */
+    String MIN_SERVER_POOL_SIZE = TRANSPORT_PREFIX + "minServerPoolSize";
+
+    /**
+     * The constant MAX_SERVER_POOL_SIZE.
+     */
+    String MAX_SERVER_POOL_SIZE = TRANSPORT_PREFIX + "maxServerPoolSize";
+
+    /**
+     * The constant MIN_BRANCH_RESULT_POOL_SIZE.
+     */
+    String MIN_BRANCH_RESULT_POOL_SIZE = TRANSPORT_PREFIX + "minBranchResultPoolSize";
+
+    /**
+     * The constant MAX_BRANCH_RESULT_POOL_SIZE.
+     */
+    String MAX_BRANCH_RESULT_POOL_SIZE = TRANSPORT_PREFIX + "maxBranchResultPoolSize";
+
+    /**
+     * The constant MAX_TASK_QUEUE_SIZE.
+     */
+    String MAX_TASK_QUEUE_SIZE = TRANSPORT_PREFIX + "maxTaskQueueSize";
+
+    /**
+     * The constant KEEP_ALIVE_TIME.
+     */
+    String KEEP_ALIVE_TIME = TRANSPORT_PREFIX + "keepAliveTime";
+
+    /**
+     * The constant TRANSPORT_TYPE
+     */
+    String TRANSPORT_TYPE = TRANSPORT_PREFIX + "type";
+
+    /**
+     * The constant TRANSPORT_SERVER
+     */
+    String TRANSPORT_SERVER = TRANSPORT_PREFIX + "server";
+
+    /**
+     * The constant TRANSPORT_HEARTBEAT
+     */
+    String TRANSPORT_HEARTBEAT = TRANSPORT_PREFIX + "heartbeat";
+
+    /**
+     * The constant THREAD_FACTORY_PREFIX
+     */
+    String THREAD_FACTORY_PREFIX = TRANSPORT_PREFIX + "threadFactory.";
+
+    /**
+     * The constant BOSS_THREAD_PREFIX
+     */
+    String BOSS_THREAD_PREFIX = THREAD_FACTORY_PREFIX + "bossThreadPrefix";
+
+    /**
+     * The constant WORKER_THREAD_PREFIX
+     */
+    String WORKER_THREAD_PREFIX = THREAD_FACTORY_PREFIX + "workerThreadPrefix";
+
+    /**
+     * The constant SERVER_EXECUTOR_THREAD_PREFIX
+     */
+    String SERVER_EXECUTOR_THREAD_PREFIX = THREAD_FACTORY_PREFIX + "serverExecutorThreadPrefix";
+
+    /**
+     * The constant SHARE_BOSS_WORKER
+     */
+    String SHARE_BOSS_WORKER = THREAD_FACTORY_PREFIX + "shareBossWorker";
+
+    /**
+     * The constant CLIENT_SELECTOR_THREAD_PREFIX
+     */
+    String CLIENT_SELECTOR_THREAD_PREFIX = THREAD_FACTORY_PREFIX + "clientSelectorThreadPrefix";
+
+    /**
+     * The constant CLIENT_SELECTOR_THREAD_SIZE
+     */
+    String CLIENT_SELECTOR_THREAD_SIZE = THREAD_FACTORY_PREFIX + "clientSelectorThreadSize";
+
+    /**
+     * The constant CLIENT_WORKER_THREAD_PREFIX
+     */
+    String CLIENT_WORKER_THREAD_PREFIX = THREAD_FACTORY_PREFIX + "clientWorkerThreadPrefix";
+
+    /**
+     * The constant BOSS_THREAD_SIZE
+     */
+    String BOSS_THREAD_SIZE = THREAD_FACTORY_PREFIX + "bossThreadSize";
+
+    /**
+     * The constant WORKER_THREAD_SIZE
+     */
+    String WORKER_THREAD_SIZE = THREAD_FACTORY_PREFIX + "workerThreadSize";
+
+    /**
+     * The constant SHUTDOWN_PREFIX
+     */
+    String SHUTDOWN_PREFIX = TRANSPORT_PREFIX + "shutdown.";
+
+    /**
+     * The constant SHUTDOWN_WAIT
+     */
+    String SHUTDOWN_WAIT = SHUTDOWN_PREFIX + "wait";
+
+    /**
+     * The constant ENABLE_CLIENT_BATCH_SEND_REQUEST
+     */
+    @Deprecated
+    String ENABLE_CLIENT_BATCH_SEND_REQUEST = TRANSPORT_PREFIX + "enableClientBatchSendRequest";
+
+    /**
+     * The constant ENABLE_TM_CLIENT_BATCH_SEND_REQUEST
+     */
+    String ENABLE_TM_CLIENT_BATCH_SEND_REQUEST = TRANSPORT_PREFIX + "enableTmClientBatchSendRequest";
+
+    /**
+     * The constant ENABLE_RM_CLIENT_BATCH_SEND_REQUEST
+     */
+    String ENABLE_RM_CLIENT_BATCH_SEND_REQUEST = TRANSPORT_PREFIX + "enableRmClientBatchSendRequest";
+
+    /**
+     * The constant ENABLE_TC_SERVER_BATCH_SEND_RESPONSE
+     */
+    String ENABLE_TC_SERVER_BATCH_SEND_RESPONSE = TRANSPORT_PREFIX + "enableTcServerBatchSendResponse";
+
+    /**
+     * The constant DISABLE_GLOBAL_TRANSACTION.
+     */
+    String DISABLE_GLOBAL_TRANSACTION = SERVICE_PREFIX + "disableGlobalTransaction";
+
+    /**
+     * The constant SQL_PARSER_TYPE.
+     */
+    String SQL_PARSER_TYPE = CLIENT_RM_PREFIX + "sqlParserType";
+
+    /**
+     * The constant STORE_REDIS_MODE.
+     */
+    String STORE_REDIS_MODE = STORE_REDIS_PREFIX + "mode";
+
+    /**
+     * The constant STORE_REDIS_HOST.
+     */
+    String STORE_REDIS_HOST = STORE_REDIS_PREFIX + "host";
+
+    /**
+     * The constant STORE_REDIS_PORT.
+     */
+    String STORE_REDIS_PORT = STORE_REDIS_PREFIX + "port";
+
+    /**
+     * The constant STORE_REDIS_SINGLE_PREFIX.
+     */
+    String STORE_REDIS_SINGLE_PREFIX = STORE_REDIS_PREFIX + "single.";
+
+    /**
+     * The constant STORE_REDIS_SINGLE_HOST.
+     */
+    String STORE_REDIS_SINGLE_HOST = STORE_REDIS_SINGLE_PREFIX + "host";
+
+    /**
+     * The constant STORE_MIN_Conn.
+     */
+    String STORE_REDIS_MIN_CONN = STORE_REDIS_PREFIX + "minConn";
+
+    /**
+     * The constant STORE_REDIS_SINGLE_PORT.
+     */
+    String STORE_REDIS_SINGLE_PORT = STORE_REDIS_SINGLE_PREFIX + "port";
+
+    /**
+     * The constant STORE_REDIS_MAX_CONN.
+     */
+    String STORE_REDIS_MAX_CONN = STORE_REDIS_PREFIX + "maxConn";
+
+    /**
+     * the constant STORE_REDIS_MAX_TOTAL
+     */
+    String STORE_REDIS_MAX_TOTAL = STORE_REDIS_PREFIX + "maxTotal";
+
+    /**
+     * The constant STORE_REDIS_DATABASE.
+     */
+    String STORE_REDIS_DATABASE = STORE_REDIS_PREFIX + "database";
+
+    /**
+     * The constant STORE_REDIS_PASSWORD.
+     */
+    String STORE_REDIS_PASSWORD = STORE_REDIS_PREFIX + "password";
+
+    /**
+     * The constant STORE_REDIS_QUERY_LIMIT.
+     */
+    String STORE_REDIS_QUERY_LIMIT = STORE_REDIS_PREFIX + "queryLimit";
+
+    /**
+     * The constant REDIS_SENTINEL_MODE.
+     */
+    String REDIS_SENTINEL_MODE = "sentinel";
+
+    /**
+     * The constant REDIS_SINGLE_MODE.
+     */
+    String REDIS_SINGLE_MODE = "single";
+
+    /**
+     * The constant STORE_REDIS_SENTINEL_PREFIX.
+     */
+    String STORE_REDIS_SENTINEL_PREFIX = STORE_REDIS_PREFIX + "sentinel.";
+
+    /**
+     * STORE_REDIS_SENTINEL_MASTERNAME.
+     */
+    String STORE_REDIS_SENTINEL_MASTERNAME = STORE_REDIS_SENTINEL_PREFIX + "masterName";
+
+    /**
+     * STORE_REDIS_SENTINEL_HOST.
+     */
+    String STORE_REDIS_SENTINEL_HOST = STORE_REDIS_SENTINEL_PREFIX + "sentinelHosts";
+
+    /**
+     * The constant CLIENT_DEGRADE_CHECK_PERIOD.
+     */
+    String CLIENT_DEGRADE_CHECK_PERIOD = CLIENT_TM_PREFIX + "degradeCheckPeriod";
+
+    /**
+     * The constant CLIENT_DEGRADE_CHECK.
+     */
+    String CLIENT_DEGRADE_CHECK = CLIENT_TM_PREFIX + "degradeCheck";
+    /**
+     * The constant CLIENT_DEGRADE_CHECK_ALLOW_TIMES.
+     */
+    String CLIENT_DEGRADE_CHECK_ALLOW_TIMES = CLIENT_TM_PREFIX + "degradeCheckAllowTimes";
+
+    /**
+     * The constant GLOBAL_TRANSACTION_INTERCEPTOR_ORDER.
+     */
+    String TM_INTERCEPTOR_ORDER = CLIENT_TM_PREFIX + "interceptorOrder";
+
+    /**
+     * The constant ACCESS_KEY.
+     */
+    String ACCESS_KEY = "accesskey";
+
+    /**
+     * The constant SECRET_KEY.
+     */
+    String SECRET_KEY = "secretkey";
+
+    /**
+     * The constant SEATA_ACCESS_KEY.
+     */
+    String SEATA_ACCESS_KEY = SEATA_PREFIX + ACCESS_KEY;
+
+    /**
+     * The constant SEATA_SECRET_KEY.
+     */
+    String SEATA_SECRET_KEY = SEATA_PREFIX + SECRET_KEY;
+
+    /**
+     * The constant EXTRA_DATA_SPLIT_CHAR.
+     */
+    String EXTRA_DATA_SPLIT_CHAR = "\n";
+    /**
+     * The constant EXTRA_DATA_KV_CHAR.
+     */
+    String EXTRA_DATA_KV_CHAR = "=";
+
+    /**
+     * The constant SERVER_ENABLE_CHECK_AUTH.
+     */
+    String SERVER_ENABLE_CHECK_AUTH = SERVER_PREFIX + "enableCheckAuth";
+
+    /**
+     * The constant APPLICATION_ID.
+     */
+    String APPLICATION_ID = "applicationId";
+
+    /**
+     * The constant TX_SERVICE_GROUP.
+     */
+    String TX_SERVICE_GROUP = "txServiceGroup";
+
+    /**
+     * The constant DATA_SOURCE_PROXY_MODE.
+     */
+    String DATA_SOURCE_PROXY_MODE = "dataSourceProxyMode";
+
+    /**
+     * The constant TCC_PREFIX
+     */
+    String TCC_PREFIX = "tcc.";
+
+    /**
+     * The constant TCC_FENCE_PREFIX
+     */
+    String TCC_FENCE_PREFIX = TCC_PREFIX + "fence.";
+
+    /**
+     * The constant TCC_FENCE_CLEAN_PERIOD
+     */
+    String TCC_FENCE_CLEAN_PERIOD = TCC_FENCE_PREFIX + "cleanPeriod";
+
+    /**
+     * The constant TCC_FENCE_LOG_TABLE_NAME
+     */
+    String TCC_FENCE_LOG_TABLE_NAME = TCC_FENCE_PREFIX + "logTableName";
+
+    /**
+     * The constant rpcRmRequestTimeout
+     */
+    String RPC_RM_REQUEST_TIMEOUT = TRANSPORT_PREFIX + "rpcRmRequestTimeout";
+
+    /**
+     * The constant RPC_TM_REQUEST_TIMEOUT
+     */
+    String RPC_TM_REQUEST_TIMEOUT = TRANSPORT_PREFIX + "rpcTmRequestTimeout";
+
+    /**
+     * The constant RPC_TM_REQUEST_TIMEOUT
+     */
+    String RPC_TC_REQUEST_TIMEOUT = TRANSPORT_PREFIX + "rpcTcRequestTimeout";
+
+    /**
+     * The constant SESSION_BRANCH_ASYNC_QUEUE_SIZE
+     */
+    String SESSION_BRANCH_ASYNC_QUEUE_SIZE = SERVER_PREFIX + SESSION_PREFIX + "branchAsyncQueueSize";
+
+    /**
+     * The constant ENABLE_BRANCH_ASYNC_REMOVE
+     */
+    String ENABLE_BRANCH_ASYNC_REMOVE = SERVER_PREFIX + SESSION_PREFIX + "enableBranchAsyncRemove";
+
+    /**
+     * The constant IS_USE_CLOUD_NAMESPACE_PARSING.
+     */
+    String IS_USE_CLOUD_NAMESPACE_PARSING = "isUseCloudNamespaceParsing";
+
+    /**
+     * The constant IS_USE_ENDPOINT_PARSING_RULE.
+     */
+    String IS_USE_ENDPOINT_PARSING_RULE = "isUseEndpointParsingRule";
+
+    /**
+     * The constant XAER_NOTA_RETRY_TIMEOUT
+     */
+    String XAER_NOTA_RETRY_TIMEOUT = SERVER_PREFIX + "xaerNotaRetryTimeout";
+
+    /**
+     * The constant XA_BRANCH_EXECUTION_TIMEOUT
+     */
+    String XA_BRANCH_EXECUTION_TIMEOUT = CLIENT_RM_PREFIX + "branchExecutionTimeoutXA";
+
+    /**
+     * The constant XA_CONNECTION_TWO_PHASE_HOLD_TIMEOUT
+     */
+    String XA_CONNECTION_TWO_PHASE_HOLD_TIMEOUT = CLIENT_RM_PREFIX + "connectionTwoPhaseHoldTimeoutXA";
+
+    /**
+     * The constant ENABLE_PARALLEL_REQUEST_HANDLE_KEY
+     */
+    String ENABLE_PARALLEL_REQUEST_HANDLE_KEY = SERVER_PREFIX + "enableParallelRequestHandle";
+
+}

+ 169 - 0
common/src/main/java/io/seata/common/Constants.java

@@ -0,0 +1,169 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common;
+
+import java.nio.charset.Charset;
+
+/**
+ * The type Constants.
+ *
+ * @author slievrly
+ */
+public interface Constants {
+
+    /**
+     * The constant IP_PORT_SPLIT_CHAR.
+     */
+    String IP_PORT_SPLIT_CHAR = ":";
+    /**
+     * The constant CLIENT_ID_SPLIT_CHAR.
+     */
+    String CLIENT_ID_SPLIT_CHAR = ":";
+    /**
+     * The constant ENDPOINT_BEGIN_CHAR.
+     */
+    String ENDPOINT_BEGIN_CHAR = "/";
+    /**
+     * The constant DBKEYS_SPLIT_CHAR.
+     */
+    String DBKEYS_SPLIT_CHAR = ",";
+
+    /**
+     * The constant ROW_LOCK_KEY_SPLIT_CHAR.
+     */
+    String ROW_LOCK_KEY_SPLIT_CHAR = ";";
+
+    /**
+     * the start time of transaction
+     */
+    String START_TIME = "start-time";
+
+    /**
+     * app name
+     */
+    String APP_NAME = "appName";
+
+    /**
+     * TCC start time
+     */
+    String ACTION_START_TIME = "action-start-time";
+
+    /**
+     * TCC name
+     */
+    String ACTION_NAME = "actionName";
+
+    /**
+     * Use TCC fence
+     */
+    String USE_TCC_FENCE = "useTCCFence";
+
+    /**
+     * phase one method name
+     */
+    String PREPARE_METHOD = "sys::prepare";
+
+    /**
+     * phase two commit method name
+     */
+    String COMMIT_METHOD = "sys::commit";
+
+    /**
+     * phase two rollback method name
+     */
+    String ROLLBACK_METHOD = "sys::rollback";
+
+    /**
+     * host ip
+     */
+    String HOST_NAME = "host-name";
+
+    /**
+     * branch context
+     */
+    String TCC_ACTION_CONTEXT = "actionContext";
+
+    /**
+     * default charset name
+     */
+    String DEFAULT_CHARSET_NAME = "UTF-8";
+
+    /**
+     * default charset is utf-8
+     */
+    Charset DEFAULT_CHARSET = Charset.forName(DEFAULT_CHARSET_NAME);
+    /**
+     * The constant OBJECT_KEY_SPRING_APPLICATION_CONTEXT
+     */
+    String OBJECT_KEY_SPRING_APPLICATION_CONTEXT = "springApplicationContext";
+    /**
+     * The constant OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT
+     */
+    String OBJECT_KEY_SPRING_CONFIGURABLE_ENVIRONMENT = "springConfigurableEnvironment";
+    /**
+     * The constant BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER
+     */
+    String BEAN_NAME_SPRING_APPLICATION_CONTEXT_PROVIDER = "springApplicationContextProvider";
+    /**
+     * The constant BEAN_NAME_FAILURE_HANDLER
+     */
+    String BEAN_NAME_FAILURE_HANDLER = "failureHandler";
+    /**
+     * The constant SAGA_TRANS_NAME_PREFIX
+     */
+    String SAGA_TRANS_NAME_PREFIX = "$Saga_";
+
+    /**
+     * The constant RETRY_ROLLBACKING
+     */
+    String RETRY_ROLLBACKING = "RetryRollbacking";
+
+    /**
+     * The constant RETRY_COMMITTING
+     */
+    String RETRY_COMMITTING = "RetryCommitting";
+
+    /**
+     * The constant ASYNC_COMMITTING
+     */
+    String ASYNC_COMMITTING = "AsyncCommitting";
+
+    /**
+     * The constant TX_TIMEOUT_CHECK
+     */
+    String TX_TIMEOUT_CHECK = "TxTimeoutCheck";
+
+    /**
+     * The constant UNDOLOG_DELETE
+     */
+    String UNDOLOG_DELETE = "UndologDelete";
+
+    /**
+     * The constant AUTO_COMMIT
+     */
+    String AUTO_COMMIT = "autoCommit";
+
+    /**
+     * The constant SKIP_CHECK_LOCK
+     */
+    String SKIP_CHECK_LOCK = "skipCheckLock";
+
+    /**
+     * The constant REGISTRY_TYPE_SPLIT_CHAR.
+     */
+    String REGISTRY_TYPE_SPLIT_CHAR = ",";
+
+}

+ 284 - 0
common/src/main/java/io/seata/common/DefaultValues.java

@@ -0,0 +1,284 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common;
+
+import java.time.Duration;
+
+/**
+ * @author xingfudeshi@gmail.com
+ */
+public interface DefaultValues {
+    int DEFAULT_CLIENT_LOCK_RETRY_INTERVAL = 10;
+    int DEFAULT_TM_DEGRADE_CHECK_ALLOW_TIMES = 10;
+    int DEFAULT_CLIENT_LOCK_RETRY_TIMES = 30;
+    boolean DEFAULT_CLIENT_LOCK_RETRY_POLICY_BRANCH_ROLLBACK_ON_CONFLICT = true;
+    int DEFAULT_LOG_EXCEPTION_RATE = 100;
+    int DEFAULT_CLIENT_ASYNC_COMMIT_BUFFER_LIMIT = 10000;
+    int DEFAULT_TM_DEGRADE_CHECK_PERIOD = 2000;
+    int DEFAULT_CLIENT_REPORT_RETRY_COUNT = 5;
+    boolean DEFAULT_CLIENT_REPORT_SUCCESS_ENABLE = false;
+    boolean DEFAULT_CLIENT_TABLE_META_CHECK_ENABLE = true;
+    long DEFAULT_TABLE_META_CHECKER_INTERVAL = 60000L;
+    boolean DEFAULT_TM_DEGRADE_CHECK = false;
+    boolean DEFAULT_CLIENT_SAGA_BRANCH_REGISTER_ENABLE = false;
+    boolean DEFAULT_CLIENT_SAGA_RETRY_PERSIST_MODE_UPDATE = false;
+    boolean DEFAULT_CLIENT_SAGA_COMPENSATE_PERSIST_MODE_UPDATE = false;
+
+    /**
+     * Shutdown timeout default 3s
+     */
+    int DEFAULT_SHUTDOWN_TIMEOUT_SEC = 3;
+    int DEFAULT_SELECTOR_THREAD_SIZE = 1;
+    int DEFAULT_BOSS_THREAD_SIZE = 1;
+
+
+    String DEFAULT_SELECTOR_THREAD_PREFIX = "NettyClientSelector";
+    String DEFAULT_WORKER_THREAD_PREFIX = "NettyClientWorkerThread";
+    @Deprecated
+    boolean DEFAULT_ENABLE_CLIENT_BATCH_SEND_REQUEST = true;
+    boolean DEFAULT_ENABLE_TM_CLIENT_BATCH_SEND_REQUEST = false;
+    boolean DEFAULT_ENABLE_RM_CLIENT_BATCH_SEND_REQUEST = true;
+    boolean DEFAULT_ENABLE_TC_SERVER_BATCH_SEND_RESPONSE = false;
+
+
+    String DEFAULT_BOSS_THREAD_PREFIX = "NettyBoss";
+    String DEFAULT_NIO_WORKER_THREAD_PREFIX = "NettyServerNIOWorker";
+    String DEFAULT_EXECUTOR_THREAD_PREFIX = "NettyServerBizHandler";
+
+    boolean DEFAULT_TRANSPORT_HEARTBEAT = true;
+    boolean DEFAULT_TRANSACTION_UNDO_DATA_VALIDATION = true;
+    String DEFAULT_TRANSACTION_UNDO_LOG_SERIALIZATION = "jackson";
+    boolean DEFAULT_ONLY_CARE_UPDATE_COLUMNS = true;
+    /**
+     * The constant  DEFAULT_TRANSACTION_UNDO_LOG_TABLE.
+     */
+    String DEFAULT_TRANSACTION_UNDO_LOG_TABLE = "undo_log";
+    /**
+     * The constant DEFAULT_STORE_DB_GLOBAL_TABLE.
+     */
+    String DEFAULT_STORE_DB_GLOBAL_TABLE = "global_table";
+
+    /**
+     * The constant DEFAULT_STORE_DB_BRANCH_TABLE.
+     */
+    String DEFAULT_STORE_DB_BRANCH_TABLE = "branch_table";
+
+    /**
+     * The constant DEFAULT_LOCK_DB_TABLE.
+     */
+    String DEFAULT_LOCK_DB_TABLE = "lock_table";
+
+    /**
+     * the constant DEFAULT_DISTRIBUTED_LOCK_DB_TABLE
+     */
+    String DEFAULT_DISTRIBUTED_LOCK_DB_TABLE = "distributed_lock";
+
+    int DEFAULT_TM_COMMIT_RETRY_COUNT = 5;
+    int DEFAULT_TM_ROLLBACK_RETRY_COUNT = 5;
+    int DEFAULT_GLOBAL_TRANSACTION_TIMEOUT = 60000;
+
+    String DEFAULT_TX_GROUP = "default_tx_group";
+    @Deprecated
+    String DEFAULT_TX_GROUP_OLD = "my_test_tx_group";
+    String DEFAULT_TC_CLUSTER = "default";
+    String DEFAULT_GROUPLIST = "127.0.0.1:8091";
+
+    String DEFAULT_DATA_SOURCE_PROXY_MODE = "AT";
+
+    boolean DEFAULT_DISABLE_GLOBAL_TRANSACTION = false;
+
+    //currently not use and will be delete in the next version
+    @Deprecated
+    int SERVICE_DEFAULT_PORT = 8091;
+
+    int SERVICE_OFFSET_SPRING_BOOT = 1000;
+
+    String SERVER_PORT = "seata.server.port";
+
+    String SERVER_DEFAULT_STORE_MODE = "file";
+
+    String DEFAULT_SAGA_JSON_PARSER = "fastjson";
+
+    boolean DEFAULT_SERVER_ENABLE_CHECK_AUTH = true;
+
+    String DEFAULT_LOAD_BALANCE = "XID";
+    int VIRTUAL_NODES_DEFAULT = 10;
+
+    /**
+     * the constant DEFAULT_CLIENT_UNDO_COMPRESS_ENABLE
+     */
+    boolean DEFAULT_CLIENT_UNDO_COMPRESS_ENABLE = true;
+
+    /**
+     * the constant DEFAULT_CLIENT_UNDO_COMPRESS_TYPE
+     */
+    String DEFAULT_CLIENT_UNDO_COMPRESS_TYPE = "zip";
+
+    /**
+     * the constant DEFAULT_CLIENT_UNDO_COMPRESS_THRESHOLD
+     */
+    String DEFAULT_CLIENT_UNDO_COMPRESS_THRESHOLD = "64k";
+
+    /**
+     * the constant DEFAULT_RETRY_DEAD_THRESHOLD
+     */
+    int DEFAULT_RETRY_DEAD_THRESHOLD = 2 * 60 * 1000 + 10 * 1000;
+
+    /**
+     * the constant TM_INTERCEPTOR_ORDER
+     */
+    int TM_INTERCEPTOR_ORDER = Integer.MIN_VALUE + 1000;
+  
+    /**
+     * the constant TCC_ACTION_INTERCEPTOR_ORDER
+     */
+    int TCC_ACTION_INTERCEPTOR_ORDER = Integer.MIN_VALUE + 1000;
+
+    /**
+     * the constant DEFAULT_DISTRIBUTED_LOCK_EXPIRE
+     */
+    int DEFAULT_DISTRIBUTED_LOCK_EXPIRE = 10000;
+
+    /**
+     * the constant DEFAULT_TCC_FENCE_CLEAN_PERIOD
+     */
+    int DEFAULT_TCC_FENCE_CLEAN_PERIOD = 1;
+    /**
+     * the constant DEFAULT_TCC_FENCE_LOG_TABLE_NAME
+     */
+    String DEFAULT_TCC_FENCE_LOG_TABLE_NAME = "tcc_fence_log";
+    /**
+     * the constant TCC_FENCE_BEAN_NAME
+     */
+    String TCC_FENCE_BEAN_NAME = "tccFenceConfig";
+
+    /**
+     * the constant DEFAULT_RPC_RM_REQUEST_TIMEOUT
+     */
+    long DEFAULT_RPC_RM_REQUEST_TIMEOUT = Duration.ofSeconds(15).toMillis();
+
+    /**
+     * the constant DEFAULT_RPC_TM_REQUEST_TIMEOUT
+     */
+    long DEFAULT_RPC_TM_REQUEST_TIMEOUT = Duration.ofSeconds(30).toMillis();
+
+    /**
+     * the constant DEFAULT_RPC_TC_REQUEST_TIMEOUT
+     */
+    long DEFAULT_RPC_TC_REQUEST_TIMEOUT = Duration.ofSeconds(15).toMillis();
+
+    /**
+     * the constant DEFAULT_XAER_NOTA_RETRY_TIMEOUT
+     */
+    int DEFAULT_XAER_NOTA_RETRY_TIMEOUT = 60000;
+
+    /**
+     * the constant DEFAULT_XA_BRANCH_EXECUTION_TIMEOUT
+     */
+    int DEFAULT_XA_BRANCH_EXECUTION_TIMEOUT = 60000;
+
+    /**
+     * the constant DEFAULT_XA_TWO_PHASE_WAIT_TIMEOUT
+     */
+    int DEFAULT_XA_CONNECTION_TWO_PHASE_HOLD_TIMEOUT = 10000;
+
+    /**
+     * the constant DEFAULT_COMMITING_RETRY_PERIOD
+     */
+    int DEFAULT_COMMITING_RETRY_PERIOD = 1000;
+
+    /**
+     * the constant DEFAULT_ASYNC_COMMITTING_RETRY_PERIOD
+     */
+    int DEFAULT_ASYNC_COMMITTING_RETRY_PERIOD = 1000;
+
+    /**
+     * the constant DEFAULT_ROLLBACKING_RETRY_PERIOD
+     */
+    int DEFAULT_ROLLBACKING_RETRY_PERIOD = 1000;
+
+    /**
+     * the constant DEFAULT_TIMEOUT_RETRY_PERIOD
+     */
+    int DEFAULT_TIMEOUT_RETRY_PERIOD = 1000;
+
+    /**
+     * the constant DEFAULT_UNDO_LOG_DELETE_PERIOD
+     */
+    long DEFAULT_UNDO_LOG_DELETE_PERIOD = 24 * 60 * 60 * 1000;
+
+    /**
+     * the constant DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE
+     */
+    int DEFAULT_SERVICE_SESSION_RELOAD_READ_SIZE = 100;
+
+    /**
+     *the constant DEFAULT_PROMETHEUS_PORT
+     */
+    int DEFAULT_PROMETHEUS_PORT = 9898;
+
+    /**
+     * the const DEFAULT_METRICS_ENABLED
+     */
+    boolean DEFAULT_METRICS_ENABLED = false;
+
+    /**
+     * the const DEFAULT_METRICS_REGISTRY_TYPE
+     */
+    String DEFAULT_METRICS_REGISTRY_TYPE = "compact";
+
+    /**
+     * the const DEFAULT_METRICS_EXPORTER_LIST
+     */
+    String DEFAULT_METRICS_EXPORTER_LIST = "prometheus";
+
+    /**
+     * the const DEFAULT_MAX_COMMIT_RETRY_TIMEOUT
+     */
+    long DEFAULT_MAX_COMMIT_RETRY_TIMEOUT = 100;
+
+    /**
+     * the const DEFAULT_MAX_ROLLBACK_RETRY_TIMEOUT
+     */
+    long DEFAULT_MAX_ROLLBACK_RETRY_TIMEOUT = 100;
+
+    /**
+     * the const DEFAULT_ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE
+     */
+    boolean DEFAULT_ROLLBACK_RETRY_TIMEOUT_UNLOCK_ENABLE = false;
+
+    /**
+     * DEFAULT_DISTRIBUTED_LOCK_EXPIRE_TIME
+     */
+    long DEFAULT_DISTRIBUTED_LOCK_EXPIRE_TIME = 10000;
+
+    /**
+     * DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE
+     */
+    boolean DEFAULT_ENABLE_BRANCH_ASYNC_REMOVE = false;
+
+    int DEFAULT_DB_MAX_CONN = 100;
+
+    int DEFAULT_DB_MIN_CONN = 10;
+
+    int DEFAULT_REDIS_MAX_IDLE = 100;
+
+    int DEFAULT_REDIS_MAX_TOTAL = 100;
+
+    int DEFAULT_REDIS_MIN_IDLE = 10;
+
+    int DEFAULT_QUERY_LIMIT = 1000;
+}

+ 30 - 0
common/src/main/java/io/seata/common/LockStrategyMode.java

@@ -0,0 +1,30 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common;
+
+/**
+ * @funkye
+ */
+public enum LockStrategyMode {
+    /**
+     * Optimistic lock mode is recommended when resources are not reused in the current global transaction.
+     */
+    OPTIMISTIC,
+    /**
+     * Pessimistic lock mode is recommended when there may be repeated use of the same resource in a global transaction.
+     */
+    PESSIMISTIC
+}

+ 100 - 0
common/src/main/java/io/seata/common/XID.java

@@ -0,0 +1,100 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common;
+
+import static io.seata.common.Constants.IP_PORT_SPLIT_CHAR;
+
+/**
+ * The type Xid.
+ *
+ * @author slievrly
+ */
+public class XID {
+
+    private static int port;
+
+    private static String ipAddress;
+
+    /**
+     * Sets port.
+     *
+     * @param port the port
+     */
+    public static void setPort(int port) {
+        XID.port = port;
+    }
+
+    /**
+     * Sets ip address.
+     *
+     * @param ipAddress the ip address
+     */
+    public static void setIpAddress(String ipAddress) {
+        XID.ipAddress = ipAddress;
+    }
+
+    /**
+     * Generate xid string.
+     *
+     * @param tranId the tran id
+     * @return the string
+     */
+    public static String generateXID(long tranId) {
+        return new StringBuilder().append(ipAddress).append(IP_PORT_SPLIT_CHAR).append(port).append(IP_PORT_SPLIT_CHAR).append(tranId).toString();
+    }
+
+    /**
+     * Gets transaction id.
+     *
+     * @param xid the xid
+     * @return the transaction id
+     */
+    public static long getTransactionId(String xid) {
+        if (xid == null) {
+            return -1;
+        }
+
+        int idx = xid.lastIndexOf(":");
+        return Long.parseLong(xid.substring(idx + 1));
+    }
+
+    /**
+     * Gets port.
+     *
+     * @return the port
+     */
+    public static int getPort() {
+        return port;
+    }
+
+    /**
+     * Gets ip address.
+     *
+     * @return the ip address
+     */
+    public static String getIpAddress() {
+        return ipAddress;
+    }
+
+    /**
+     * Gets ipAddress:port
+     *
+     * @return eg: 127.0.0.1:8091
+     */
+    public static String getIpAddressAndPort() {
+        return new StringBuilder().append(ipAddress).append(IP_PORT_SPLIT_CHAR).append(port).toString();
+    }
+}

+ 68 - 0
common/src/main/java/io/seata/common/exception/DataAccessException.java

@@ -0,0 +1,68 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * the data access exception
+ * @author jsbxyyx
+ */
+public class DataAccessException extends StoreException {
+
+    /**
+     * constructor with framework error code
+     * @param err the framework error code
+     */
+    public DataAccessException(FrameworkErrorCode err) {
+        super(err);
+    }
+
+    /**
+     * constructor with msg
+     * @param msg the msg
+     */
+    public DataAccessException(String msg) {
+        super(msg);
+    }
+
+    /**
+     * constructor with cause
+     * @param cause the cause
+     */
+    public DataAccessException(Throwable cause) {
+        super(cause);
+    }
+
+    /**
+     * constructor with msg and framework error code
+     * @param msg the msg
+     * @param errCode the framework error code
+     */
+    public DataAccessException(String msg, FrameworkErrorCode errCode) {
+        super(msg, errCode);
+    }
+
+    /**
+     * constructor with cause and msg and framework error code
+     * @param cause the throwable
+     * @param msg the msg
+     * @param errCode the framework error code
+     */
+    public DataAccessException(Throwable cause, String msg, FrameworkErrorCode errCode) {
+        super(cause, msg, errCode);
+    }
+
+
+}

+ 52 - 0
common/src/main/java/io/seata/common/exception/EurekaRegistryException.java

@@ -0,0 +1,52 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * eureka registry exception
+ *
+ * @author rui_849217@163.com
+ */
+public class EurekaRegistryException extends RuntimeException {
+
+    /**
+     * eureka registry exception.
+     *
+     * @param message the message
+     */
+    public EurekaRegistryException(String message) {
+        super(message);
+    }
+
+    /**
+     * eureka registry exception.
+     *
+     * @param message the message
+     * @param cause   the cause
+     */
+    public EurekaRegistryException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * eureka registry exception.
+     *
+     * @param cause the cause
+     */
+    public EurekaRegistryException(Throwable cause) {
+        super(cause);
+    }
+}

+ 284 - 0
common/src/main/java/io/seata/common/exception/FrameworkErrorCode.java

@@ -0,0 +1,284 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * The enum Framework error code.
+ *
+ * @author slievrly
+ */
+public enum FrameworkErrorCode {
+    /**
+     * 0001 ~ 0099  Configuration related errors
+     */
+    ThreadPoolFull("0004", "Thread pool is full", "Please check the thread pool configuration"),
+
+    /**
+     * The Init services client error.
+     */
+    InitSeataClientError("0008", "Seata app name or seata server group is null", "Please check your configuration"),
+
+    /**
+     * The Null rule error.
+     */
+    NullRuleError("0010", "Services rules is null", "Please check your configuration"),
+
+    /**
+     * 0101 ~ 0199 Network related error. (Not connected, disconnected, dispatched, etc.)
+     */
+    NetConnect("0101", "Can not connect to the server", "Please check if the seata service is started. Is the network connection to the seata server normal?"),
+
+    /**
+     * The Net reg appname.
+     */
+    NetRegAppname("0102", "Register client app name failed", "Please check if the seata service is started. Is the network connection to the seata server normal?"),
+
+    /**
+     * The Net disconnect.
+     */
+    NetDisconnect("0103", "Seata connection closed", "The network is disconnected. Please check the network connection to the client or seata server."),
+
+    /**
+     * The Net dispatch.
+     */
+    NetDispatch("0104", "Dispatch error", "Network processing error. Please check the network connection to the client or seata server."),
+
+    /**
+     * The Net on message.
+     */
+    NetOnMessage("0105", "On message error", "Network processing error. Please check the network connection to the client or seata server."),
+    /**
+     * Get channel error framework error code.
+     */
+    getChannelError("0106", "Get channel error", "Get channel error"),
+
+    /**
+     * Channel not writable framework error code.
+     */
+    ChannelNotWritable("0107", "Channel not writable", "Channel not writable"),
+
+    /**
+     * Send half message failed framework error code.
+     */
+    SendHalfMessageFailed("0108", "Send half message failed", "Send half message failed"),
+
+    /**
+     * Channel is not writable framework error code.
+     */
+    ChannelIsNotWritable("0109", "Channel is not writable", "Channel is not writable"),
+    /**
+     * No available service framework error code.
+     */
+    NoAvailableService("0110", "No available service", "No available service"),
+
+    /**
+     * Invalid configuration framework error code.
+     */
+    InvalidConfiguration("0201", "Invalid configuration", "Invalid configuration"),
+
+    /**
+     * Exception caught framework error code.
+     */
+    ExceptionCaught("0318", "Exception caught", "Exception caught"),
+
+    /**
+     * Register rm framework error code.
+     */
+    RegisterRM("0304", "Register RM failed", "Register RM failed"),
+
+    /** 0400~0499 Saga related error **/
+
+    /**
+     * Process type not found
+     */
+    ProcessTypeNotFound("0401", "Process type not found", "Process type not found"),
+
+    /**
+     * Process handler not found
+     */
+    ProcessHandlerNotFound("0402", "Process handler not found", "Process handler not found"),
+
+    /**
+     * Process router not found
+     */
+    ProcessRouterNotFound("0403", "Process router not found", "Process router not found"),
+
+    /**
+     * method not public
+     */
+    MethodNotPublic("0404", "method not public", "method not public"),
+
+    /**
+     * method invoke error
+     */
+    MethodInvokeError("0405", "method invoke error", "method invoke error"),
+
+    /**
+     * CompensationState not found
+     */
+    CompensationStateNotFound("0406", "CompensationState not found", "CompensationState not found"),
+
+    /**
+     * Evaluation returns null
+     */
+    EvaluationReturnsNull("0407", "Evaluation returns null", "Evaluation returns null"),
+
+    /**
+     * Evaluation returns non-Boolean
+     */
+    EvaluationReturnsNonBoolean("0408", "Evaluation returns non-Boolean", "Evaluation returns non-Boolean"),
+
+    /**
+     * Not a exception class
+     */
+    NotExceptionClass("0409", "Not a exception class", "Not a exception class"),
+
+    /**
+     * No such method
+     */
+    NoSuchMethod("0410", "No such method", "No such method"),
+
+    /**
+     * Object not exists
+     */
+    ObjectNotExists("0411", "Object not exists", "Object not exists"),
+
+    /**
+     * Parameter required
+     */
+    ParameterRequired("0412", "Parameter required", "Parameter required"),
+
+    /**
+     * Variables assign error
+     */
+    VariablesAssignError("0413", "Variables assign error", "Variables assign error"),
+
+    /**
+     * No matched status
+     */
+    NoMatchedStatus("0414", "No matched status", "No matched status"),
+
+    /**
+     * Asynchronous start disabled
+     */
+    AsynchronousStartDisabled("0415", "Asynchronous start disabled", "Asynchronous start disabled"),
+
+    /**
+     * Operation denied
+     */
+    OperationDenied("0416", "Operation denied", "Operation denied"),
+
+    /**
+     * Context variable replay failed
+     */
+    ContextVariableReplayFailed("0417", "Context variable replay failed", "Context variable replay failed"),
+
+    /**
+     * Context variable replay failed
+     */
+    InvalidParameter("0418", "Invalid parameter", "Invalid parameter"),
+
+    /**
+     * Invoke transaction manager error
+     */
+    TransactionManagerError("0419", "Invoke transaction manager error", "Invoke transaction manager error"),
+
+    /**
+     * State machine instance not exists
+     */
+    StateMachineInstanceNotExists("0420", "State machine instance not exists", "State machine instance not exists"),
+
+    /**
+     * State machine execution timeout
+     */
+    StateMachineExecutionTimeout("0421", "State machine execution timeout", "State machine execution timeout"),
+
+    /**
+     * State machine execution no choice matched
+     */
+    StateMachineNoChoiceMatched("0422", "State machine no choice matched", "State machine no choice matched"),
+
+    /** 0500~0599 TCC fence related error **/
+
+    /**
+     * TCC fence datasource need injected
+     */
+    DateSourceNeedInjected("0501","TCC fence datasource need injected","TCC fence datasource need injected"),
+
+    /**
+     * TCC fence record not exists
+     */
+    RecordNotExists("0502","TCC fence record not exists","TCC fence record not exists"),
+
+    /**
+     * Insert tcc fence record error
+     */
+    InsertRecordError("0503","Insert tcc fence record error","Insert tcc fence record error"),
+
+    /**
+     * Insert tcc fence record duplicate key exception
+     */
+    DuplicateKeyException("0504", "Insert tcc fence record duplicate key exception", "Insert tcc fence record duplicate key exception"),
+
+    /**
+     * TCC fence transactionManager need injected
+     */
+    TransactionManagerNeedInjected("0505","TCC fence transactionManager need injected","TCC fence transactionManager need injected"),
+
+    /**
+     * Undefined error
+     */
+    UnknownAppError("10000", "Unknown error", "Internal error"),
+    ;
+
+    /**
+     * The Err code.
+     */
+    private String errCode;
+
+    /**
+     * The Err message.
+     */
+    private String errMessage;
+
+    /**
+     * The Err dispose.
+     */
+    private String errDispose;
+
+    FrameworkErrorCode(String errCode, String errMessage, String errDispose) {
+        this.errCode = errCode;
+        this.errMessage = errMessage;
+        this.errDispose = errDispose;
+    }
+
+    public String getErrCode() {
+        return errCode;
+    }
+
+    public String getErrMessage() {
+        return errMessage;
+    }
+
+    public String getErrDispose() {
+        return errDispose;
+    }
+
+    @Override
+    public String toString() {
+        return String.format("[%s] [%s] [%s]", errCode, errMessage, errDispose);
+    }
+}

+ 161 - 0
common/src/main/java/io/seata/common/exception/FrameworkException.java

@@ -0,0 +1,161 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+import java.sql.SQLException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The type Framework exception.
+ *
+ * @author slievrly
+ */
+public class FrameworkException extends RuntimeException {
+    private static final Logger LOGGER = LoggerFactory.getLogger(FrameworkException.class);
+
+    private static final long serialVersionUID = 5531074229174745826L;
+
+    private final FrameworkErrorCode errcode;
+
+    /**
+     * Instantiates a new Framework exception.
+     */
+    public FrameworkException() {
+        this(FrameworkErrorCode.UnknownAppError);
+    }
+
+    /**
+     * Instantiates a new Framework exception.
+     *
+     * @param err the err
+     */
+    public FrameworkException(FrameworkErrorCode err) {
+        this(err.getErrMessage(), err);
+    }
+
+    /**
+     * Instantiates a new Framework exception.
+     *
+     * @param msg the msg
+     */
+    public FrameworkException(String msg) {
+        this(msg, FrameworkErrorCode.UnknownAppError);
+    }
+
+    /**
+     * Instantiates a new Framework exception.
+     *
+     * @param msg     the msg
+     * @param errCode the err code
+     */
+    public FrameworkException(String msg, FrameworkErrorCode errCode) {
+        this(null, msg, errCode);
+    }
+
+    /**
+     * Instantiates a new Framework exception.
+     *
+     * @param cause   the cause
+     * @param msg     the msg
+     * @param errCode the err code
+     */
+    public FrameworkException(Throwable cause, String msg, FrameworkErrorCode errCode) {
+        super(msg, cause);
+        this.errcode = errCode;
+    }
+
+    /**
+     * Instantiates a new Framework exception.
+     *
+     * @param th the th
+     */
+    public FrameworkException(Throwable th) {
+        this(th, th.getMessage());
+    }
+
+    /**
+     * Instantiates a new Framework exception.
+     *
+     * @param th  the th
+     * @param msg the msg
+     */
+    public FrameworkException(Throwable th, String msg) {
+        this(th, msg, FrameworkErrorCode.UnknownAppError);
+    }
+
+    /**
+     * Gets errcode.
+     *
+     * @return the errcode
+     */
+    public FrameworkErrorCode getErrcode() {
+        return errcode;
+    }
+
+    /**
+     * Nested exception framework exception.
+     *
+     * @param e the e
+     * @return the framework exception
+     */
+    public static FrameworkException nestedException(Throwable e) {
+        return nestedException("", e);
+    }
+
+    /**
+     * Nested exception framework exception.
+     *
+     * @param msg the msg
+     * @param e   the e
+     * @return the framework exception
+     */
+    public static FrameworkException nestedException(String msg, Throwable e) {
+        LOGGER.error(msg, e.getMessage(), e);
+        if (e instanceof FrameworkException) {
+            return (FrameworkException)e;
+        }
+
+        return new FrameworkException(e, msg);
+    }
+
+    /**
+     * Nested sql exception sql exception.
+     *
+     * @param e the e
+     * @return the sql exception
+     */
+    public static SQLException nestedSQLException(Throwable e) {
+        return nestedSQLException("", e);
+    }
+
+    /**
+     * Nested sql exception sql exception.
+     *
+     * @param msg the msg
+     * @param e   the e
+     * @return the sql exception
+     */
+    public static SQLException nestedSQLException(String msg, Throwable e) {
+        LOGGER.error(msg, e.getMessage(), e);
+        if (e instanceof SQLException) {
+            return (SQLException)e;
+        }
+
+        return new SQLException(e);
+    }
+}

+ 59 - 0
common/src/main/java/io/seata/common/exception/NotSupportYetException.java

@@ -0,0 +1,59 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * The type Not support yet exception.
+ *
+ * @author slievrly
+ */
+public class NotSupportYetException extends RuntimeException {
+
+    /**
+     * Instantiates a new Not support yet exception.
+     */
+    public NotSupportYetException() {
+        this("currently not supported, may be supported in future");
+    }
+
+    /**
+     * Instantiates a new Not support yet exception.
+     *
+     * @param message the message
+     */
+    public NotSupportYetException(String message) {
+        super(message);
+    }
+
+    /**
+     * Instantiates a new Not support yet exception.
+     *
+     * @param message the message
+     * @param cause   the cause
+     */
+    public NotSupportYetException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Instantiates a new Not support yet exception.
+     *
+     * @param cause the cause
+     */
+    public NotSupportYetException(Throwable cause) {
+        super(cause);
+    }
+}

+ 82 - 0
common/src/main/java/io/seata/common/exception/RedisException.java

@@ -0,0 +1,82 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * The redis operate exception
+ *
+ * @author wangzhongxiang
+ */
+public class RedisException extends FrameworkException {
+
+    /**
+     * Instantiates a new Redis exception.
+     *
+     * @param err the err
+     */
+    public RedisException(FrameworkErrorCode err) {
+        super(err);
+    }
+
+    /**
+     * Instantiates a new Redis exception.
+     *
+     * @param msg the msg
+     */
+    public RedisException(String msg) {
+        super(msg);
+    }
+
+    /**
+     * Instantiates a new Redis exception.
+     *
+     * @param msg     the msg
+     * @param errCode the err code
+     */
+    public RedisException(String msg, FrameworkErrorCode errCode) {
+        super(msg, errCode);
+    }
+
+    /**
+     * Instantiates a new Redis exception.
+     *
+     * @param cause   the cause
+     * @param msg     the msg
+     * @param errCode the err code
+     */
+    public RedisException(Throwable cause, String msg, FrameworkErrorCode errCode) {
+        super(cause, msg, errCode);
+    }
+
+    /**
+     * Instantiates a new Redis exception.
+     *
+     * @param th the th
+     */
+    public RedisException(Throwable th) {
+        super(th);
+    }
+
+    /**
+     * Instantiates a new Redis exception.
+     *
+     * @param th  the th
+     * @param msg the msg
+     */
+    public RedisException(Throwable th, String msg) {
+        super(th, msg);
+    }
+}

+ 52 - 0
common/src/main/java/io/seata/common/exception/ShouldNeverHappenException.java

@@ -0,0 +1,52 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * The type Should never happen exception.
+ *
+ * @author slievrly
+ */
+public class ShouldNeverHappenException extends RuntimeException {
+
+    /**
+     * Instantiates a new Should never happen exception.
+     *
+     * @param message the message
+     */
+    public ShouldNeverHappenException(String message) {
+        super(message);
+    }
+
+    /**
+     * Instantiates a new Should never happen exception.
+     *
+     * @param message the message
+     * @param cause   the cause
+     */
+    public ShouldNeverHappenException(String message, Throwable cause) {
+        super(message, cause);
+    }
+
+    /**
+     * Instantiates a new Should never happen exception.
+     *
+     * @param cause the cause
+     */
+    public ShouldNeverHappenException(Throwable cause) {
+        super(cause);
+    }
+}

+ 36 - 0
common/src/main/java/io/seata/common/exception/SkipCallbackWrapperException.java

@@ -0,0 +1,36 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * Skip Callback Wrapper Exception.
+ * This exception class will make the semantics clearer.
+ *
+ * @author wang.liang
+ * @since above 1.4.2
+ */
+public class SkipCallbackWrapperException extends RuntimeException {
+
+    public SkipCallbackWrapperException(Throwable cause) {
+        super(cause);
+    }
+
+    @Override
+    public synchronized Throwable fillInStackTrace() {
+        // do nothing
+        return null;
+    }
+}

+ 82 - 0
common/src/main/java/io/seata/common/exception/StoreException.java

@@ -0,0 +1,82 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+/**
+ * the store exception
+ *
+ * @author zhangsen
+ */
+public class StoreException extends FrameworkException {
+
+    /**
+     * Instantiates a new Store exception.
+     *
+     * @param err the err
+     */
+    public StoreException(FrameworkErrorCode err) {
+        super(err);
+    }
+
+    /**
+     * Instantiates a new Store exception.
+     *
+     * @param msg the msg
+     */
+    public StoreException(String msg) {
+        super(msg);
+    }
+
+    /**
+     * Instantiates a new Store exception.
+     *
+     * @param msg     the msg
+     * @param errCode the err code
+     */
+    public StoreException(String msg, FrameworkErrorCode errCode) {
+        super(msg, errCode);
+    }
+
+    /**
+     * Instantiates a new Store exception.
+     *
+     * @param cause   the cause
+     * @param msg     the msg
+     * @param errCode the err code
+     */
+    public StoreException(Throwable cause, String msg, FrameworkErrorCode errCode) {
+        super(cause, msg, errCode);
+    }
+
+    /**
+     * Instantiates a new Store exception.
+     *
+     * @param th the th
+     */
+    public StoreException(Throwable th) {
+        super(th);
+    }
+
+    /**
+     * Instantiates a new Store exception.
+     *
+     * @param th  the th
+     * @param msg the msg
+     */
+    public StoreException(Throwable th, String msg) {
+        super(th, msg);
+    }
+}

+ 35 - 0
common/src/main/java/io/seata/common/executor/Callback.java

@@ -0,0 +1,35 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.executor;
+
+/**
+ * The interface Callback.
+ *
+ * @param <T> the type parameter
+ *
+ * @author zhangsen
+ */
+public interface Callback<T> {
+
+    /**
+     * Execute t.
+     *
+     * @return the t
+     * @throws Throwable the throwable
+     */
+    T execute() throws Throwable;
+}
+

+ 30 - 0
common/src/main/java/io/seata/common/executor/Initialize.java

@@ -0,0 +1,30 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.executor;
+
+/**
+ * The interface Initialize.
+ *
+ * @author zhangsen
+ */
+public interface Initialize {
+
+    /**
+     * init method
+     */
+    void init();
+
+}

+ 53 - 0
common/src/main/java/io/seata/common/holder/ObjectHolder.java

@@ -0,0 +1,53 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.holder;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import io.seata.common.exception.ShouldNeverHappenException;
+
+/**
+ * @author xingfudeshi@gmail.com
+ * The enum object holder
+ */
+public enum ObjectHolder {
+    /**
+     * singleton instance
+     */
+    INSTANCE;
+    private static final int MAP_SIZE = 8;
+    private static final Map<String, Object> OBJECT_MAP = new ConcurrentHashMap<>(MAP_SIZE);
+
+    public Object getObject(String objectKey) {
+        return OBJECT_MAP.get(objectKey);
+    }
+
+    public <T> T getObject(Class<T> clasz) {
+        return clasz.cast(OBJECT_MAP.values().stream().filter(clasz::isInstance).findAny().orElseThrow(() -> new ShouldNeverHappenException("Can't find any object of class " + clasz.getName())));
+    }
+
+    /**
+     * Sets object.
+     *
+     * @param objectKey the key
+     * @param object    the object
+     * @return the previous object with the key, or null
+     */
+    public Object setObject(String objectKey, Object object) {
+        return OBJECT_MAP.put(objectKey, object);
+    }
+}

+ 80 - 0
common/src/main/java/io/seata/common/io/FileLoader.java

@@ -0,0 +1,80 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.io;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * file loader
+ *
+ * @author tianyu.li
+ */
+public class FileLoader {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(FileLoader.class);
+
+    public static File load(String name) {
+        try {
+            if (name == null) {
+                throw new IllegalArgumentException("name can't be null");
+            }
+            String decodedPath = URLDecoder.decode(name, StandardCharsets.UTF_8.name());
+
+            return getFileFromFileSystem(decodedPath);
+
+        } catch (UnsupportedEncodingException e) {
+            LOGGER.error("decode name error: {}", e.getMessage(), e);
+        }
+
+        return null;
+    }
+
+    private static File getFileFromFileSystem(String decodedPath) {
+
+        // run with jar file and not package third lib into jar file, this.getClass().getClassLoader() will be null
+        URL resourceUrl = FileLoader.class.getClassLoader().getResource("");
+        String[] tryPaths;
+        if (resourceUrl != null) {
+            tryPaths = new String[]{
+                // first: project dir
+                resourceUrl.getPath() + decodedPath,
+                // second: system path
+                decodedPath
+            };
+        } else {
+            tryPaths = new String[]{
+                decodedPath
+            };
+        }
+
+        for (String tryPath : tryPaths) {
+            File targetFile = new File(tryPath);
+            if (targetFile.exists()) {
+                return targetFile;
+            }
+        }
+
+        return null;
+    }
+
+}

+ 657 - 0
common/src/main/java/io/seata/common/loader/EnhancedServiceLoader.java

@@ -0,0 +1,657 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.loader;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
+
+import io.seata.common.Constants;
+import io.seata.common.executor.Initialize;
+import io.seata.common.util.CollectionUtils;
+import org.apache.commons.lang.exception.ExceptionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The type Enhanced service loader.
+ *
+ * @author slievrly
+ */
+public class EnhancedServiceLoader {
+
+    /**
+     * Class->InnerEnhancedServiceLoader map
+     */
+    private static final ConcurrentMap<Class<?>, InnerEnhancedServiceLoader<?>> SERVICE_LOADERS =
+            new ConcurrentHashMap<>();
+
+    /**
+     * Specify classLoader to load the service provider
+     *
+     * @param <S>     the type parameter
+     * @param service the service
+     * @param loader  the loader
+     * @return s s
+     * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+     */
+    public static <S> S load(Class<S> service, ClassLoader loader) throws EnhancedServiceNotFoundException {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).load(loader);
+    }
+
+    /**
+     * load service provider
+     *
+     * @param <S>     the type parameter
+     * @param service the service
+     * @return s s
+     * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+     */
+    public static <S> S load(Class<S> service) throws EnhancedServiceNotFoundException {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).load(findClassLoader());
+    }
+
+    /**
+     * load service provider
+     *
+     * @param <S>          the type parameter
+     * @param service      the service
+     * @param activateName the activate name
+     * @return s s
+     * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+     */
+    public static <S> S load(Class<S> service, String activateName) throws EnhancedServiceNotFoundException {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).load(activateName, findClassLoader());
+    }
+
+    /**
+     * Specify classLoader to load the service provider
+     *
+     * @param <S>          the type parameter
+     * @param service      the service
+     * @param activateName the activate name
+     * @param loader       the loader
+     * @return s s
+     * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+     */
+    public static <S> S load(Class<S> service, String activateName, ClassLoader loader)
+            throws EnhancedServiceNotFoundException {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).load(activateName, loader);
+    }
+
+    /**
+     * Load s.
+     *
+     * @param <S>          the type parameter
+     * @param service      the service
+     * @param activateName the activate name
+     * @param args         the args
+     * @return the s
+     * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+     */
+    public static <S> S load(Class<S> service, String activateName, Object[] args)
+            throws EnhancedServiceNotFoundException {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).load(activateName, args, findClassLoader());
+    }
+
+    /**
+     * Load s.
+     *
+     * @param <S>          the type parameter
+     * @param service      the service
+     * @param activateName the activate name
+     * @param argsType     the args type
+     * @param args         the args
+     * @return the s
+     * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+     */
+    public static <S> S load(Class<S> service, String activateName, Class<?>[] argsType, Object[] args)
+            throws EnhancedServiceNotFoundException {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).load(activateName, argsType, args, findClassLoader());
+    }
+
+    /**
+     * get all implements
+     *
+     * @param <S>     the type parameter
+     * @param service the service
+     * @return list list
+     */
+    public static <S> List<S> loadAll(Class<S> service) {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).loadAll(findClassLoader());
+    }
+
+    /**
+     * get all implements
+     *
+     * @param <S>      the type parameter
+     * @param service  the service
+     * @param argsType the args type
+     * @param args     the args
+     * @return list list
+     */
+    public static <S> List<S> loadAll(Class<S> service, Class<?>[] argsType, Object[] args) {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).loadAll(argsType, args, findClassLoader());
+    }
+
+    /**
+     * Unload all.
+     */
+    public static void unloadAll() {
+        InnerEnhancedServiceLoader.removeAllServiceLoader();
+    }
+
+    /**
+     * Unload.
+     *
+     * @param <S>     the type parameter
+     * @param service the service
+     */
+    public static <S> void unload(Class<S> service) {
+        InnerEnhancedServiceLoader.removeServiceLoader(service);
+    }
+
+    /**
+     * Unload.
+     *
+     * @param <S>          the type parameter
+     * @param service      the service
+     * @param activateName the activate name
+     */
+    public static <S> void unload(Class<S> service, String activateName) {
+
+        if (activateName == null) {
+            throw new IllegalArgumentException("activateName is null");
+        }
+        InnerEnhancedServiceLoader<S> serviceLoader = InnerEnhancedServiceLoader.getServiceLoader(service);
+        ConcurrentMap<Class<?>, ExtensionDefinition<S>> classToDefinitionMap = serviceLoader.classToDefinitionMap;
+        List<ExtensionDefinition<S>> extensionDefinitions = new ArrayList<>();
+        for (Map.Entry<Class<?>, ExtensionDefinition<S>> entry : classToDefinitionMap.entrySet()) {
+            String name = entry.getValue().getName();
+            if (null == name) {
+                continue;
+            }
+            if (name.equals(activateName)) {
+                extensionDefinitions.add(entry.getValue());
+                classToDefinitionMap.remove(entry.getKey());
+            }
+        }
+        serviceLoader.nameToDefinitionsMap.remove(activateName);
+        if (CollectionUtils.isNotEmpty(extensionDefinitions)) {
+            for (ExtensionDefinition<S> definition : extensionDefinitions) {
+                serviceLoader.definitionToInstanceMap.remove(definition);
+
+            }
+        }
+
+    }
+
+
+    /**
+     * Get all the extension classes, follow {@linkplain LoadLevel} defined and sort order
+     *
+     * @param <S>     the type parameter
+     * @param service the service
+     * @return all extension class
+     */
+    static <S> List<Class<S>> getAllExtensionClass(Class<S> service) {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).getAllExtensionClass(findClassLoader());
+    }
+
+    /**
+     * Get all the extension classes, follow {@linkplain LoadLevel} defined and sort order
+     *
+     * @param <S>     the type parameter
+     * @param service the service
+     * @param loader  the loader
+     * @return all extension class
+     */
+    static <S> List<Class<S>> getAllExtensionClass(Class<S> service, ClassLoader loader) {
+        return InnerEnhancedServiceLoader.getServiceLoader(service).getAllExtensionClass(loader);
+    }
+    /**
+     * Cannot use TCCL, in the pandora container will cause the class in the plugin not to be loaded
+     *
+     * @return
+     */
+    private static ClassLoader findClassLoader() {
+        return EnhancedServiceLoader.class.getClassLoader();
+    }
+
+
+    private static class InnerEnhancedServiceLoader<S> {
+        private static final Logger LOGGER = LoggerFactory.getLogger(InnerEnhancedServiceLoader.class);
+        private static final String SERVICES_DIRECTORY = "META-INF/services/";
+        private static final String SEATA_DIRECTORY = "META-INF/seata/";
+
+        private final Class<S> type;
+        private final Holder<List<ExtensionDefinition<S>>> definitionsHolder = new Holder<>();
+        private final ConcurrentMap<ExtensionDefinition<S>, Holder<Object>> definitionToInstanceMap =
+                new ConcurrentHashMap<>();
+        private final ConcurrentMap<String, List<ExtensionDefinition<S>>> nameToDefinitionsMap = new ConcurrentHashMap<>();
+        private final ConcurrentMap<Class<?>, ExtensionDefinition<S>> classToDefinitionMap = new ConcurrentHashMap<>();
+
+        private InnerEnhancedServiceLoader(Class<S> type) {
+            this.type = type;
+        }
+
+        /**
+         * Get the ServiceLoader for the specified Class
+         *
+         * @param type the type of the extension point
+         * @param <S>  the type
+         * @return the service loader
+         */
+        @SuppressWarnings("unchecked")
+        private static <S> InnerEnhancedServiceLoader<S> getServiceLoader(Class<S> type) {
+            if (type == null) {
+                throw new IllegalArgumentException("Enhanced Service type is null");
+            }
+            return (InnerEnhancedServiceLoader<S>)CollectionUtils.computeIfAbsent(SERVICE_LOADERS, type,
+                key -> new InnerEnhancedServiceLoader<>(type));
+        }
+
+        @SuppressWarnings("unchecked")
+        private static <S> InnerEnhancedServiceLoader<S> removeServiceLoader(Class<S> type) {
+            if (type == null) {
+                throw new IllegalArgumentException("Enhanced Service type is null");
+            }
+            return (InnerEnhancedServiceLoader<S>)SERVICE_LOADERS.remove(type);
+        }
+
+        private static void removeAllServiceLoader() {
+
+            SERVICE_LOADERS.clear();
+        }
+
+        /**
+         * Specify classLoader to load the service provider
+         *
+         * @param loader the loader
+         * @return s s
+         * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+         */
+        private S load(ClassLoader loader) throws EnhancedServiceNotFoundException {
+            return loadExtension(loader, null, null);
+        }
+
+        /**
+         * Specify classLoader to load the service provider
+         *
+         * @param activateName the activate name
+         * @param loader       the loader
+         * @return s s
+         * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+         */
+        private S load(String activateName, ClassLoader loader)
+                throws EnhancedServiceNotFoundException {
+            return loadExtension(activateName, loader, null, null);
+        }
+
+        /**
+         * Load s.
+         *
+         * @param activateName the activate name
+         * @param args         the args
+         * @param loader       the loader
+         * @return the s
+         * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+         */
+        private S load(String activateName, Object[] args, ClassLoader loader)
+                throws EnhancedServiceNotFoundException {
+            Class<?>[] argsType = null;
+            if (args != null && args.length > 0) {
+                argsType = new Class[args.length];
+                for (int i = 0; i < args.length; i++) {
+                    argsType[i] = args[i].getClass();
+                }
+            }
+            return loadExtension(activateName, loader, argsType, args);
+        }
+
+        /**
+         * Load s.
+         *
+         * @param activateName the activate name
+         * @param argsType     the args type
+         * @param args         the args
+         * @param loader  the class loader
+         * @return the s
+         * @throws EnhancedServiceNotFoundException the enhanced service not found exception
+         */
+        private S load(String activateName, Class<?>[] argsType, Object[] args, ClassLoader loader)
+                throws EnhancedServiceNotFoundException {
+            return loadExtension(activateName, loader, argsType, args);
+        }
+
+        /**
+         * get all implements
+         * @param loader  the class loader
+         *
+         * @return list list
+         */
+        private List<S> loadAll(ClassLoader loader) {
+            return loadAll(null, null, loader);
+        }
+
+        /**
+         * get all implements
+         *
+         * @param argsType the args type
+         * @param args     the args
+         * @return list list
+         */
+        private List<S> loadAll(Class<?>[] argsType, Object[] args, ClassLoader loader) {
+            List<S> allInstances = new ArrayList<>();
+            List<Class<S>> allClazzs = getAllExtensionClass(loader);
+            if (CollectionUtils.isEmpty(allClazzs)) {
+                return allInstances;
+            }
+            try {
+                for (Class<S> clazz : allClazzs) {
+                    ExtensionDefinition<S> definition = classToDefinitionMap.get(clazz);
+                    allInstances.add(getExtensionInstance(definition, loader, argsType, args));
+                }
+            } catch (Throwable t) {
+                throw new EnhancedServiceNotFoundException(t);
+            }
+            return allInstances;
+        }
+
+        /**
+         * Get all the extension classes, follow {@linkplain LoadLevel} defined and sort order
+         *
+         * @param loader the loader
+         * @return all extension class
+         */
+        private List<Class<S>> getAllExtensionClass(ClassLoader loader) {
+            return loadAllExtensionClass(loader);
+        }
+
+        private S loadExtension(ClassLoader loader, Class<?>[] argTypes,
+                                Object[] args) {
+            try {
+                loadAllExtensionClass(loader);
+                ExtensionDefinition<S> defaultExtensionDefinition = getDefaultExtensionDefinition();
+                return getExtensionInstance(defaultExtensionDefinition, loader, argTypes, args);
+            } catch (Throwable e) {
+                if (e instanceof EnhancedServiceNotFoundException) {
+                    throw (EnhancedServiceNotFoundException)e;
+                } else {
+                    throw new EnhancedServiceNotFoundException(
+                        "not found service provider for : " + type.getName() + " caused by " + ExceptionUtils
+                            .getFullStackTrace(e));
+                }
+            }
+        }
+
+        @SuppressWarnings("rawtypes")
+        private S loadExtension(String activateName, ClassLoader loader, Class[] argTypes,
+                                Object[] args) {
+            if (io.seata.common.util.StringUtils.isEmpty(activateName)) {
+                throw new IllegalArgumentException("the name of service provider for [" + type.getName() + "] name is null");
+            }
+            try {
+                loadAllExtensionClass(loader);
+                ExtensionDefinition<S> cachedExtensionDefinition = getCachedExtensionDefinition(activateName);
+                return getExtensionInstance(cachedExtensionDefinition, loader, argTypes, args);
+            } catch (Throwable e) {
+                if (e instanceof EnhancedServiceNotFoundException) {
+                    throw (EnhancedServiceNotFoundException)e;
+                } else {
+                    throw new EnhancedServiceNotFoundException(
+                            "not found service provider for : " + type.getName() + " caused by " + ExceptionUtils
+                                    .getFullStackTrace(e));
+                }
+            }
+        }
+
+        private S getExtensionInstance(ExtensionDefinition<S> definition, ClassLoader loader, Class<?>[] argTypes,
+                                       Object[] args) {
+            if (definition == null) {
+                throw new EnhancedServiceNotFoundException("not found service provider for : " + type.getName());
+            }
+            if (Scope.SINGLETON.equals(definition.getScope())) {
+                Holder<Object> holder = CollectionUtils.computeIfAbsent(definitionToInstanceMap, definition,
+                    key -> new Holder<>());
+                Object instance = holder.get();
+                if (instance == null) {
+                    synchronized (holder) {
+                        instance = holder.get();
+                        if (instance == null) {
+                            instance = createNewExtension(definition, loader, argTypes, args);
+                            holder.set(instance);
+                        }
+                    }
+                }
+                return (S)instance;
+            } else {
+                return createNewExtension(definition, loader, argTypes, args);
+            }
+        }
+
+        private S createNewExtension(ExtensionDefinition<S> definition, ClassLoader loader, Class<?>[] argTypes, Object[] args) {
+            Class<S> clazz = definition.getServiceClass();
+            try {
+                return initInstance(clazz, argTypes, args);
+            } catch (Throwable t) {
+                throw new IllegalStateException("Extension instance(definition: " + definition + ", class: " +
+                        type + ")  could not be instantiated: " + t.getMessage(), t);
+            }
+        }
+
+        private List<Class<S>> loadAllExtensionClass(ClassLoader loader) {
+            List<ExtensionDefinition<S>> definitions = definitionsHolder.get();
+            if (definitions == null) {
+                synchronized (definitionsHolder) {
+                    definitions = definitionsHolder.get();
+                    if (definitions == null) {
+                        definitions = findAllExtensionDefinition(loader);
+                        definitionsHolder.set(definitions);
+                    }
+                }
+            }
+            return definitions.stream().map(ExtensionDefinition::getServiceClass).collect(Collectors.toList());
+        }
+
+        private List<ExtensionDefinition<S>> findAllExtensionDefinition(ClassLoader loader) {
+            List<ExtensionDefinition<S>> extensionDefinitions = new ArrayList<>();
+            try {
+                loadFile(SERVICES_DIRECTORY, loader, extensionDefinitions);
+                loadFile(SEATA_DIRECTORY, loader, extensionDefinitions);
+            } catch (IOException e) {
+                throw new EnhancedServiceNotFoundException(e);
+            }
+
+            //After loaded all the extensions,sort the caches by order
+            if (!nameToDefinitionsMap.isEmpty()) {
+                for (List<ExtensionDefinition<S>> definitions : nameToDefinitionsMap.values()) {
+                    definitions.sort((def1, def2) -> {
+                        int o1 = def1.getOrder();
+                        int o2 = def2.getOrder();
+                        return Integer.compare(o1, o2);
+                    });
+                }
+            }
+
+            if (!extensionDefinitions.isEmpty()) {
+                extensionDefinitions.sort((definition1, definition2) -> {
+                    int o1 = definition1.getOrder();
+                    int o2 = definition2.getOrder();
+                    return Integer.compare(o1, o2);
+                });
+            }
+
+            return extensionDefinitions;
+        }
+
+
+        private void loadFile(String dir, ClassLoader loader, List<ExtensionDefinition<S>> extensions)
+                throws IOException {
+            String fileName = dir + type.getName();
+            Enumeration<java.net.URL> urls;
+            if (loader != null) {
+                urls = loader.getResources(fileName);
+            } else {
+                urls = ClassLoader.getSystemResources(fileName);
+            }
+            if (urls != null) {
+                while (urls.hasMoreElements()) {
+                    java.net.URL url = urls.nextElement();
+                    try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), Constants.DEFAULT_CHARSET))) {
+                        String line;
+                        while ((line = reader.readLine()) != null) {
+                            final int ci = line.indexOf('#');
+                            if (ci >= 0) {
+                                line = line.substring(0, ci);
+                            }
+                            line = line.trim();
+                            if (line.length() > 0) {
+                                try {
+                                    ExtensionDefinition<S> extensionDefinition = getUnloadedExtensionDefinition(line, loader);
+                                    if (extensionDefinition == null) {
+                                        if (LOGGER.isDebugEnabled()) {
+                                            LOGGER.debug("The same extension {} has already been loaded, skipped", line);
+                                        }
+                                        continue;
+                                    }
+                                    extensions.add(extensionDefinition);
+                                } catch (LinkageError | ClassNotFoundException e) {
+                                    LOGGER.warn("Load [{}] class fail. {}", line, e.getMessage());
+                                } catch (ClassCastException e) {
+                                    LOGGER.error("Load [{}] class fail, please make sure the extension" +
+                                            " config in {} implements {}.", line, fileName, type.getName());
+                                }
+                            }
+                        }
+                    } catch (Throwable e) {
+                        LOGGER.warn("load clazz instance error: {}", e.getMessage());
+                    }
+                }
+            }
+        }
+
+        @SuppressWarnings("unchecked")
+        private ExtensionDefinition<S> getUnloadedExtensionDefinition(String className, ClassLoader loader)
+                throws ClassNotFoundException, ClassCastException {
+            //Check whether the definition has been loaded
+            if (!isDefinitionContainsClazz(className, loader)) {
+                Class<?> clazz = Class.forName(className, true, loader);
+                if (!type.isAssignableFrom(clazz)) {
+                    LOGGER.error("can't cast {} to {}", clazz.getName(), type.getName());
+                    throw new ClassCastException();
+                }
+                Class<S> enhancedServiceClass = (Class<S>) clazz;
+                String serviceName = null;
+                int priority = 0;
+                Scope scope = Scope.SINGLETON;
+                LoadLevel loadLevel = clazz.getAnnotation(LoadLevel.class);
+                if (loadLevel != null) {
+                    serviceName = loadLevel.name();
+                    priority = loadLevel.order();
+                    scope = loadLevel.scope();
+                }
+                ExtensionDefinition<S> result = new ExtensionDefinition<>(serviceName, priority, scope, enhancedServiceClass);
+                classToDefinitionMap.put(clazz, result);
+                if (serviceName != null) {
+                    CollectionUtils.computeIfAbsent(nameToDefinitionsMap, serviceName, e -> new ArrayList<>())
+                            .add(result);
+                }
+                return result;
+            }
+            return null;
+        }
+
+        private boolean isDefinitionContainsClazz(String className, ClassLoader loader) {
+            for (Map.Entry<Class<?>, ExtensionDefinition<S>> entry : classToDefinitionMap.entrySet()) {
+                if (!entry.getKey().getName().equals(className)) {
+                    continue;
+                }
+                if (Objects.equals(entry.getValue().getServiceClass().getClassLoader(), loader)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        private ExtensionDefinition<S> getDefaultExtensionDefinition() {
+            List<ExtensionDefinition<S>> currentDefinitions = definitionsHolder.get();
+            return CollectionUtils.getLast(currentDefinitions);
+        }
+
+        private ExtensionDefinition<S> getCachedExtensionDefinition(String activateName) {
+            List<ExtensionDefinition<S>> definitions = nameToDefinitionsMap.get(activateName);
+            return CollectionUtils.getLast(definitions);
+        }
+
+        /**
+         * init instance
+         *
+         * @param implClazz the impl clazz
+         * @param argTypes  the arg types
+         * @param args      the args
+         * @return s s
+         * @throws IllegalAccessException    the illegal access exception
+         * @throws InstantiationException    the instantiation exception
+         * @throws NoSuchMethodException     the no such method exception
+         * @throws InvocationTargetException the invocation target exception
+         */
+        private S initInstance(Class<S> implClazz, Class<?>[] argTypes, Object[] args)
+                throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
+            S s = null;
+            if (argTypes != null && args != null) {
+                // Constructor with arguments
+                Constructor<S> constructor = implClazz.getDeclaredConstructor(argTypes);
+                s = type.cast(constructor.newInstance(args));
+            } else {
+                // default Constructor
+                s = type.cast(implClazz.newInstance());
+            }
+            if (s instanceof Initialize) {
+                ((Initialize)s).init();
+            }
+            return s;
+        }
+
+        /**
+         * Helper Class for hold a value.
+         * @param <T>
+         */
+        private static class Holder<T> {
+            private volatile T value;
+
+            private void set(T value) {
+                this.value = value;
+            }
+
+            private T get() {
+                return value;
+            }
+        }
+    }
+
+
+}

+ 81 - 0
common/src/main/java/io/seata/common/loader/EnhancedServiceNotFoundException.java

@@ -0,0 +1,81 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.loader;
+
+import org.apache.commons.lang.exception.NestableRuntimeException;
+
+/**
+ * The type Enhanced service not found exception.
+ *
+ * @author slievrly
+ */
+public class EnhancedServiceNotFoundException extends NestableRuntimeException {
+    private static final long serialVersionUID = 7748438218914409019L;
+
+    /**
+     * Instantiates a new Enhanced service not found exception.
+     *
+     * @param errorCode the error code
+     */
+    public EnhancedServiceNotFoundException(String errorCode) {
+        super(errorCode);
+    }
+
+    /**
+     * Instantiates a new Enhanced service not found exception.
+     *
+     * @param errorCode the error code
+     * @param cause     the cause
+     */
+    public EnhancedServiceNotFoundException(String errorCode, Throwable cause) {
+        super(errorCode, cause);
+    }
+
+    /**
+     * Instantiates a new Enhanced service not found exception.
+     *
+     * @param errorCode the error code
+     * @param errorDesc the error desc
+     */
+    public EnhancedServiceNotFoundException(String errorCode, String errorDesc) {
+        super(errorCode + ":" + errorDesc);
+    }
+
+    /**
+     * Instantiates a new Enhanced service not found exception.
+     *
+     * @param errorCode the error code
+     * @param errorDesc the error desc
+     * @param cause     the cause
+     */
+    public EnhancedServiceNotFoundException(String errorCode, String errorDesc, Throwable cause) {
+        super(errorCode + ":" + errorDesc, cause);
+    }
+
+    /**
+     * Instantiates a new Enhanced service not found exception.
+     *
+     * @param cause the cause
+     */
+    public EnhancedServiceNotFoundException(Throwable cause) {
+        super(cause);
+    }
+
+    @Override
+    public synchronized Throwable fillInStackTrace() {
+        return this;
+    }
+}

+ 91 - 0
common/src/main/java/io/seata/common/loader/ExtensionDefinition.java

@@ -0,0 +1,91 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.loader;
+
+import io.seata.common.util.StringUtils;
+
+/**
+ * The type ExtensionDefinition
+ *
+ * @param <S> type of serviceClass
+ * @author haozhibei
+ */
+final class ExtensionDefinition<S> {
+
+    private final String name;
+    private final Class<S> serviceClass;
+    private final Integer order;
+    private final Scope scope;
+
+    public Integer getOrder() {
+        return this.order;
+    }
+
+    public Class<S> getServiceClass() {
+        return this.serviceClass;
+    }
+
+    public Scope getScope() {
+        return this.scope;
+    }
+
+    public ExtensionDefinition(String name, Integer order, Scope scope, Class<S> clazz) {
+        this.name = name;
+        this.order = order;
+        this.scope = scope;
+        this.serviceClass = clazz;
+    }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + ((serviceClass == null) ? 0 : serviceClass.hashCode());
+        result = prime * result + ((order == null) ? 0 : order.hashCode());
+        result = prime * result + ((scope == null) ? 0 : scope.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+
+        ExtensionDefinition<?> other = (ExtensionDefinition<?>) obj;
+        if (!StringUtils.equals(name, other.name)) {
+            return false;
+        }
+        if (!serviceClass.equals(other.serviceClass)) {
+            return false;
+        }
+        if (!order.equals(other.order)) {
+            return false;
+        }
+        return !scope.equals(other.scope);
+    }
+
+    public String getName() {
+        return name;
+    }
+}

+ 51 - 0
common/src/main/java/io/seata/common/loader/LoadLevel.java

@@ -0,0 +1,51 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.loader;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * The interface Load level.
+ *
+ * @author slievrly
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.METHOD})
+public @interface LoadLevel {
+    /**
+     * Name string.
+     *
+     * @return the string
+     */
+    String name();
+
+    /**
+     * Order int.
+     *
+     * @return the int
+     */
+    int order() default 0;
+
+    /**
+     * Scope enum.
+     */
+    Scope scope() default Scope.SINGLETON;
+}

+ 34 - 0
common/src/main/java/io/seata/common/loader/Scope.java

@@ -0,0 +1,34 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.loader;
+
+/**
+ * the scope of the extension
+ *
+ * @author haozhibei
+ */
+public enum Scope {
+    /**
+     * The extension will be loaded in singleton mode
+     */
+    SINGLETON,
+
+    /**
+     * The extension will be loaded in multi instance mode
+     */
+    PROTOTYPE
+
+}

+ 93 - 0
common/src/main/java/io/seata/common/rpc/RpcStatus.java

@@ -0,0 +1,93 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.rpc;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.LongAdder;
+
+/**
+ * The state statistics.
+ *
+ * @author ph3636
+ */
+public class RpcStatus {
+
+    private static final ConcurrentMap<String, RpcStatus> SERVICE_STATUS_MAP = new ConcurrentHashMap<>();
+    private final AtomicLong active = new AtomicLong();
+    private final LongAdder total = new LongAdder();
+
+    private RpcStatus() {
+    }
+
+    /**
+     * get the RpcStatus of this service
+     *
+     * @param service the service
+     * @return RpcStatus
+     */
+    public static RpcStatus getStatus(String service) {
+        return SERVICE_STATUS_MAP.computeIfAbsent(service, key -> new RpcStatus());
+    }
+
+    /**
+     * remove the RpcStatus of this service
+     *
+     * @param service the service
+     */
+    public static void removeStatus(String service) {
+        SERVICE_STATUS_MAP.remove(service);
+    }
+
+    /**
+     * begin count
+     *
+     * @param service the service
+     */
+    public static void beginCount(String service) {
+        getStatus(service).active.incrementAndGet();
+    }
+
+    /**
+     * end count
+     *
+     * @param service the service
+     */
+    public static void endCount(String service) {
+        RpcStatus rpcStatus = getStatus(service);
+        rpcStatus.active.decrementAndGet();
+        rpcStatus.total.increment();
+    }
+
+    /**
+     * get active.
+     *
+     * @return active
+     */
+    public long getActive() {
+        return active.get();
+    }
+
+    /**
+     * get total.
+     *
+     * @return total
+     */
+    public long getTotal() {
+        return total.longValue();
+    }
+}

+ 91 - 0
common/src/main/java/io/seata/common/thread/NamedThreadFactory.java

@@ -0,0 +1,91 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.thread;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import io.netty.util.concurrent.FastThreadLocalThread;
+import io.seata.common.util.CollectionUtils;
+
+/**
+ * The type Named thread factory.
+ *
+ * @author slievrly
+ * @author ggndnn
+ */
+public class NamedThreadFactory implements ThreadFactory {
+    private final static Map<String, AtomicInteger> PREFIX_COUNTER = new ConcurrentHashMap<>();
+    private final ThreadGroup group;
+    private final AtomicInteger counter = new AtomicInteger(0);
+    private final String prefix;
+    private final int totalSize;
+    private final boolean makeDaemons;
+
+    /**
+     * Instantiates a new Named thread factory.
+     *
+     * @param prefix      the prefix
+     * @param totalSize   the total size
+     * @param makeDaemons the make daemons
+     */
+    public NamedThreadFactory(String prefix, int totalSize, boolean makeDaemons) {
+        int prefixCounter = CollectionUtils.computeIfAbsent(PREFIX_COUNTER, prefix, key -> new AtomicInteger(0))
+                .incrementAndGet();
+        SecurityManager securityManager = System.getSecurityManager();
+        group = (securityManager != null) ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup();
+        this.prefix = prefix + "_" + prefixCounter;
+        this.makeDaemons = makeDaemons;
+        this.totalSize = totalSize;
+    }
+
+    /**
+     * Instantiates a new Named thread factory.
+     *
+     * @param prefix      the prefix
+     * @param makeDaemons the make daemons
+     */
+    public NamedThreadFactory(String prefix, boolean makeDaemons) {
+        this(prefix, 0, makeDaemons);
+    }
+
+    /**
+     * Instantiates a new Named thread factory.
+     *
+     * @param prefix    the prefix
+     * @param totalSize the total size
+     */
+    public NamedThreadFactory(String prefix, int totalSize) {
+        this(prefix, totalSize, true);
+    }
+
+    @Override
+    public Thread newThread(Runnable r) {
+        String name = prefix + "_" + counter.incrementAndGet();
+        if (totalSize > 1) {
+            name += "_" + totalSize;
+        }
+        Thread thread = new FastThreadLocalThread(group, r, name);
+
+        thread.setDaemon(makeDaemons);
+        if (thread.getPriority() != Thread.NORM_PRIORITY) {
+            thread.setPriority(Thread.NORM_PRIORITY);
+        }
+        return thread;
+    }
+}

+ 45 - 0
common/src/main/java/io/seata/common/thread/PositiveAtomicCounter.java

@@ -0,0 +1,45 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.thread;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * positive atomic counter, begin with 0, ensure the number is positive.
+ *
+ * @author Geng Zhang
+ */
+public class PositiveAtomicCounter {
+    private static final int MASK = 0x7FFFFFFF;
+    private final AtomicInteger atom;
+
+    public PositiveAtomicCounter() {
+        atom = new AtomicInteger(0);
+    }
+
+    public final int incrementAndGet() {
+        return atom.incrementAndGet() & MASK;
+    }
+
+    public final int getAndIncrement() {
+        return atom.getAndIncrement() & MASK;
+    }
+
+    public int get() {
+        return atom.get() & MASK;
+    }
+
+}

+ 49 - 0
common/src/main/java/io/seata/common/thread/RejectedPolicies.java

@@ -0,0 +1,49 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.thread;
+
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.RejectedExecutionHandler;
+
+/**
+ * Policies for RejectedExecutionHandler
+ *
+ * @author guoyao
+ */
+public final class RejectedPolicies {
+
+    /**
+     * when rejected happened ,add the new task and run the oldest task
+     *
+     * @return rejected execution handler
+     */
+    public static RejectedExecutionHandler runsOldestTaskPolicy() {
+        return (r, executor) -> {
+            if (executor.isShutdown()) {
+                return;
+            }
+            BlockingQueue<Runnable> workQueue = executor.getQueue();
+            Runnable firstWork = workQueue.poll();
+            boolean newTaskAdd = workQueue.offer(r);
+            if (firstWork != null) {
+                firstWork.run();
+            }
+            if (!newTaskAdd) {
+                executor.execute(r);
+            }
+        };
+    }
+}

+ 111 - 0
common/src/main/java/io/seata/common/util/ArrayUtils.java

@@ -0,0 +1,111 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.lang.reflect.Array;
+
+/**
+ * The type Array utils.
+ *
+ * @author wang.liang
+ */
+public class ArrayUtils {
+
+    private ArrayUtils() {
+    }
+
+    /**
+     * arrayObj cast to Object[]
+     *
+     * @param arrayObj the array obj
+     * @return array
+     */
+    public static Object[] toArray(Object arrayObj) {
+        if (arrayObj == null) {
+            return null;
+        }
+
+        if (!arrayObj.getClass().isArray()) {
+            throw new ClassCastException("'arrayObj' is not an array, can't cast to Object[]");
+        }
+
+        int length = Array.getLength(arrayObj);
+        Object[] array = new Object[length];
+        if (length > 0) {
+            for (int i = 0; i < length; ++i) {
+                array[i] = Array.get(arrayObj, i);
+            }
+        }
+        return array;
+    }
+
+    /**
+     * Array To String.
+     *
+     * @param array the array
+     * @return str the string
+     */
+    public static String toString(final Object[] array) {
+        if (array == null) {
+            return "null";
+        }
+        if (array.length == 0) {
+            return "[]";
+        }
+
+        return CycleDependencyHandler.wrap(array, o -> {
+            StringBuilder sb = new StringBuilder(32);
+            sb.append("[");
+            for (Object obj : array) {
+                if (sb.length() > 1) {
+                    sb.append(", ");
+                }
+                if (obj == array) {
+                    sb.append("(this ").append(obj.getClass().getSimpleName()).append(")");
+                } else {
+                    sb.append(StringUtils.toString(obj));
+                }
+            }
+            sb.append("]");
+            return sb.toString();
+        });
+    }
+
+    /**
+     * Array To String.
+     *
+     * @param arrayObj the array obj
+     * @return str the string
+     */
+    public static String toString(final Object arrayObj) {
+        if (arrayObj == null) {
+            return "null";
+        }
+        if (!arrayObj.getClass().isArray()) {
+            return StringUtils.toString(arrayObj);
+        }
+
+        if (Array.getLength(arrayObj) == 0) {
+            return "[]";
+        }
+
+        if (arrayObj.getClass().getComponentType().isPrimitive()) {
+            return toString(toArray(arrayObj));
+        } else {
+            return toString((Object[])arrayObj);
+        }
+    }
+}

+ 153 - 0
common/src/main/java/io/seata/common/util/BeanUtils.java

@@ -0,0 +1,153 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import io.seata.common.exception.NotSupportYetException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * The bean utils
+ *
+ * @author wangzhongxiang
+ */
+public class BeanUtils {
+
+    protected static final Logger LOGGER = LoggerFactory.getLogger(BeanUtils.class);
+
+    public static String beanToString(Object o) {
+        if (o == null) {
+            return null;
+        }
+
+        Field[] fields = o.getClass().getDeclaredFields();
+        StringBuilder buffer = new StringBuilder();
+        buffer.append("[");
+        for (Field field : fields) {
+            Object val = null;
+            try {
+                val = ReflectionUtil.getFieldValue(o, field);
+            } catch (RuntimeException e) {
+                LOGGER.warn("get field value failed", e);
+            }
+            if (val != null) {
+                buffer.append(field.getName()).append("=").append(val).append(", ");
+            }
+        }
+        if (buffer.length() > 2) {
+            buffer.delete(buffer.length() - 2, buffer.length());
+        }
+        buffer.append("]");
+        return buffer.toString();
+    }
+
+    /**
+     * map to object
+     *
+     * @param map the map
+     * @param clazz the Object class
+     * @return the object
+     */
+    public static Object mapToObject(Map<String, String> map, Class<?> clazz) {
+        if (CollectionUtils.isEmpty(map)) {
+            return null;
+        }
+        try {
+            Object instance = clazz.newInstance();
+            Field[] fields = instance.getClass().getDeclaredFields();
+            for (Field field : fields) {
+                int modifiers = field.getModifiers();
+                if (Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers)) {
+                    continue;
+                }
+                boolean accessible = field.isAccessible();
+                field.setAccessible(true);
+                Class<?> type = field.getType();
+                if (type == Date.class) {
+                    if (!StringUtils.isEmpty(map.get(field.getName()))) {
+                        field.set(instance, new Date(Long.valueOf(map.get(field.getName()))));
+                    }
+                } else if (type == Long.class) {
+                    if (!StringUtils.isEmpty(map.get(field.getName()))) {
+                        field.set(instance, Long.valueOf(map.get(field.getName())));
+                    }
+                } else if (type == Integer.class) {
+                    if (!StringUtils.isEmpty(map.get(field.getName()))) {
+                        field.set(instance, Integer.valueOf(map.get(field.getName())));
+                    }
+                } else if (type == Double.class) {
+                    if (!StringUtils.isEmpty(map.get(field.getName()))) {
+                        field.set(instance, Double.valueOf(map.get(field.getName())));
+                    }
+                } else if (type == String.class) {
+                    if (!StringUtils.isEmpty(map.get(field.getName()))) {
+                        field.set(instance, map.get(field.getName()));
+                    }
+                }
+                field.setAccessible(accessible);
+            }
+            return instance;
+        } catch (IllegalAccessException e) {
+            throw new NotSupportYetException(
+                    "map to " + clazz.toString() + " failed:" + e.getMessage(), e);
+        } catch (InstantiationException e) {
+            throw new NotSupportYetException(
+                    "map to " + clazz.toString() + " failed:" + e.getMessage(), e);
+        }
+    }
+
+
+    /**
+     * object to map
+     *
+     * @param object the object
+     * @return the map
+     */
+    public static Map<String, String> objectToMap(Object object) {
+        if (object == null) {
+            return null;
+        }
+        Map<String, String> map = new HashMap<>(16);
+        Field[] fields = object.getClass().getDeclaredFields();
+        try {
+            for (Field field : fields) {
+                boolean accessible = field.isAccessible();
+                field.setAccessible(true);
+                if (field.getType() == Date.class) {
+                    Date date = (Date) field.get(object);
+                    if (date != null) {
+                        map.put(field.getName(), String.valueOf(date.getTime()));
+                    }
+                } else {
+                    map.put(field.getName(),
+                            field.get(object) == null ? "" : field.get(object).toString());
+                }
+                field.setAccessible(accessible);
+            }
+        } catch (IllegalAccessException e) {
+            throw new NotSupportYetException(
+                    "object " + object.getClass().toString() + " to map failed:" + e.getMessage());
+        }
+        return map;
+    }
+
+}

+ 107 - 0
common/src/main/java/io/seata/common/util/BlobUtils.java

@@ -0,0 +1,107 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import io.seata.common.Constants;
+import io.seata.common.exception.ShouldNeverHappenException;
+
+import javax.sql.rowset.serial.SerialBlob;
+import java.sql.Blob;
+
+/**
+ * The type Blob utils.
+ *
+ * @author slievrly
+ * @author Geng Zhang
+ */
+public class BlobUtils {
+
+    private BlobUtils() {
+
+    }
+
+    /**
+     * String 2 blob blob.
+     *
+     * @param str the str
+     * @return the blob
+     */
+    public static Blob string2blob(String str) {
+        if (str == null) {
+            return null;
+        }
+
+        try {
+            return new SerialBlob(str.getBytes(Constants.DEFAULT_CHARSET));
+        } catch (Exception e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    /**
+     * Blob 2 string string.
+     *
+     * @param blob the blob
+     * @return the string
+     */
+    public static String blob2string(Blob blob) {
+        if (blob == null) {
+            return null;
+        }
+
+        try {
+            return new String(blob.getBytes((long) 1, (int) blob.length()), Constants.DEFAULT_CHARSET);
+        } catch (Exception e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    /**
+     * Byte array to blob
+     *
+     * @param bytes the byte array
+     * @return the blob
+     */
+    public static Blob bytes2Blob(byte[] bytes) {
+        if (bytes == null) {
+            return null;
+        }
+
+        try {
+            return new SerialBlob(bytes);
+        } catch (Exception e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    /**
+     * Blob to byte array.
+     *
+     * @param blob the blob
+     * @return the byte array
+     */
+    public static byte[] blob2Bytes(Blob blob) {
+        if (blob == null) {
+            return null;
+        }
+
+        try {
+            return blob.getBytes((long) 1, (int) blob.length());
+        } catch (Exception e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+}

+ 333 - 0
common/src/main/java/io/seata/common/util/CollectionUtils.java

@@ -0,0 +1,333 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+
+/**
+ * The type Collection utils.
+ *
+ * @author zhangsen
+ * @author Geng Zhang
+ */
+public class CollectionUtils {
+
+    private CollectionUtils() {
+    }
+
+    /**
+     * Is empty boolean.
+     *
+     * @param col the col
+     * @return the boolean
+     */
+    public static boolean isEmpty(Collection<?> col) {
+        return !isNotEmpty(col);
+    }
+
+    /**
+     * Is not empty boolean.
+     *
+     * @param col the col
+     * @return the boolean
+     */
+    public static boolean isNotEmpty(Collection<?> col) {
+        return col != null && !col.isEmpty();
+    }
+
+    /**
+     * Is empty boolean.
+     *
+     * @param array the array
+     * @return the boolean
+     */
+    public static boolean isEmpty(Object[] array) {
+        return !isNotEmpty(array);
+    }
+
+    /**
+     * Is not empty boolean.
+     *
+     * @param array the array
+     * @return the boolean
+     */
+    public static boolean isNotEmpty(Object[] array) {
+        return array != null && array.length > 0;
+    }
+
+    /**
+     * Is empty boolean.
+     *
+     * @param map the map
+     * @return the boolean
+     */
+    public static boolean isEmpty(Map<?, ?> map) {
+        return !isNotEmpty(map);
+    }
+
+    /**
+     * Is not empty boolean.
+     *
+     * @param map the map
+     * @return the boolean
+     */
+    public static boolean isNotEmpty(Map<?, ?> map) {
+        return map != null && !map.isEmpty();
+    }
+
+    /**
+     * Collection To string.
+     *
+     * @param col the col
+     * @return the string
+     */
+    public static String toString(final Collection<?> col) {
+        if (col == null) {
+            return "null";
+        }
+        if (col.isEmpty()) {
+            return "[]";
+        }
+
+        return CycleDependencyHandler.wrap(col, o -> {
+            StringBuilder sb = new StringBuilder(32);
+            sb.append("[");
+            for (Object obj : col) {
+                if (sb.length() > 1) {
+                    sb.append(", ");
+                }
+                if (obj == col) {
+                    sb.append("(this ").append(obj.getClass().getSimpleName()).append(")");
+                } else {
+                    sb.append(StringUtils.toString(obj));
+                }
+            }
+            sb.append("]");
+            return sb.toString();
+        });
+    }
+
+    /**
+     * Map to string.
+     *
+     * @param map the map
+     * @return the string
+     */
+    public static String toString(final Map<?, ?> map) {
+        if (map == null) {
+            return "null";
+        }
+        if (map.isEmpty()) {
+            return "{}";
+        }
+
+        return CycleDependencyHandler.wrap(map, o -> {
+            StringBuilder sb = new StringBuilder(32);
+            sb.append("{");
+            map.forEach((key, value) -> {
+                if (sb.length() > 1) {
+                    sb.append(", ");
+                }
+                if (key == map) {
+                    sb.append("(this ").append(map.getClass().getSimpleName()).append(")");
+                } else {
+                    sb.append(StringUtils.toString(key));
+                }
+                sb.append("->");
+                if (value == map) {
+                    sb.append("(this ").append(map.getClass().getSimpleName()).append(")");
+                } else {
+                    sb.append(StringUtils.toString(value));
+                }
+            });
+            sb.append("}");
+            return sb.toString();
+        });
+    }
+
+    /**
+     * To string map
+     *
+     * @param param map
+     * @return the string map
+     */
+    public static Map<String, String> toStringMap(Map<String, Object> param) {
+        Map<String, String> covertMap = new HashMap<>();
+        if (CollectionUtils.isNotEmpty(param)) {
+            param.forEach((key, value) -> {
+                if (value != null) {
+                    if (value instanceof CharSequence || value instanceof Character) {
+                        covertMap.put(key, value.toString());
+                    } else {
+                        covertMap.put(key, StringUtils.toString(value));
+                    }
+                }
+            });
+        }
+        return covertMap;
+    }
+
+    /**
+     * Is size equals boolean.
+     *
+     * @param col0 the col 0
+     * @param col1 the col 1
+     * @return the boolean
+     */
+    public static boolean isSizeEquals(Collection<?> col0, Collection<?> col1) {
+        if (col0 == null) {
+            return col1 == null;
+        } else {
+            if (col1 == null) {
+                return false;
+            } else {
+                return col0.size() == col1.size();
+            }
+        }
+    }
+
+    private static final String KV_SPLIT = "=";
+
+    private static final String PAIR_SPLIT = "&";
+
+    /**
+     * Encode map to string
+     *
+     * @param map origin map
+     * @return String string
+     */
+    public static String encodeMap(Map<String, String> map) {
+        if (map == null) {
+            return null;
+        }
+        if (map.isEmpty()) {
+            return StringUtils.EMPTY;
+        }
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<String, String> entry : map.entrySet()) {
+            sb.append(entry.getKey()).append(KV_SPLIT).append(entry.getValue()).append(PAIR_SPLIT);
+        }
+        return sb.substring(0, sb.length() - 1);
+    }
+
+    /**
+     * Decode string to map
+     *
+     * @param data data
+     * @return map map
+     */
+    public static Map<String, String> decodeMap(String data) {
+        if (data == null) {
+            return null;
+        }
+        Map<String, String> map = new HashMap<>();
+        if (StringUtils.isBlank(data)) {
+            return map;
+        }
+        String[] kvPairs = data.split(PAIR_SPLIT);
+        if (kvPairs.length == 0) {
+            return map;
+        }
+        for (String kvPair : kvPairs) {
+            if (StringUtils.isNullOrEmpty(kvPair)) {
+                continue;
+            }
+            String[] kvs = kvPair.split(KV_SPLIT);
+            if (kvs.length != 2) {
+                continue;
+            }
+            map.put(kvs[0], kvs[1]);
+        }
+        return map;
+    }
+
+    /**
+     * Compute if absent.
+     * Use this method if you are frequently using the same key,
+     * because the get method has no lock.
+     *
+     * @param map             the map
+     * @param key             the key
+     * @param mappingFunction the mapping function
+     * @param <K>             the type of key
+     * @param <V>             the type of value
+     * @return the value
+     */
+    public static <K, V> V computeIfAbsent(Map<K, V> map, K key, Function<? super K, ? extends V> mappingFunction) {
+        V value = map.get(key);
+        if (value != null) {
+            return value;
+        }
+        return map.computeIfAbsent(key, mappingFunction);
+    }
+
+    /**
+     * To upper list.
+     *
+     * @param sourceList the source list
+     * @return the list
+     */
+    public static List<String> toUpperList(List<String> sourceList) {
+        if (isEmpty(sourceList)) {
+            return sourceList;
+        }
+        List<String> destList = new ArrayList<>(sourceList.size());
+        for (String element : sourceList) {
+            if (element != null) {
+                destList.add(element.toUpperCase());
+            } else {
+                destList.add(null);
+            }
+        }
+        return destList;
+    }
+
+    /**
+     * Get the last item.
+     * <p>
+     * 'IndexOutOfBoundsException' may be thrown, because the `list.size()` and `list.get(size - 1)` are not atomic.
+     * This method can avoid the 'IndexOutOfBoundsException' cause by concurrency.
+     * </p>
+     *
+     * @param list the list
+     * @param <T>  the type of item
+     * @return the last item
+     */
+    public static <T> T getLast(List<T> list) {
+        if (isEmpty(list)) {
+            return null;
+        }
+
+        int size;
+        while (true) {
+            size = list.size();
+            if (size == 0) {
+                return null;
+            }
+
+            try {
+                return list.get(size - 1);
+            } catch (IndexOutOfBoundsException ex) {
+                // catch the exception and continue to retry
+            }
+        }
+    }
+}

+ 93 - 0
common/src/main/java/io/seata/common/util/CompressUtil.java

@@ -0,0 +1,93 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+/**
+ * The type Compress util.
+ */
+public class CompressUtil {
+
+    /**
+     * Compress byte [ ].
+     *
+     * @param src the src
+     * @return the byte [ ]
+     * @throws IOException the io exception
+     */
+    public static byte[] compress(final byte[] src) throws IOException {
+        byte[] result;
+        ByteArrayOutputStream bos = new ByteArrayOutputStream(src.length);
+        GZIPOutputStream gos = new GZIPOutputStream(bos);
+        try {
+            gos.write(src);
+            gos.finish();
+            result = bos.toByteArray();
+        } finally {
+            IOUtil.close(bos, gos);
+        }
+        return result;
+    }
+
+    /**
+     * Uncompress byte [ ].
+     *
+     * @param src the src
+     * @return the byte [ ]
+     * @throws IOException the io exception
+     */
+    public static byte[] uncompress(final byte[] src) throws IOException {
+        byte[] result;
+        byte[] uncompressData = new byte[src.length];
+        ByteArrayInputStream bis = new ByteArrayInputStream(src);
+        GZIPInputStream iis = new GZIPInputStream(bis);
+        ByteArrayOutputStream bos = new ByteArrayOutputStream(src.length);
+
+        try {
+            while (true) {
+                int len = iis.read(uncompressData, 0, uncompressData.length);
+                if (len <= 0) {
+                    break;
+                }
+                bos.write(uncompressData, 0, len);
+            }
+            bos.flush();
+            result = bos.toByteArray();
+        } finally {
+            IOUtil.close(bis, iis, bos);
+        }
+        return result;
+    }
+
+    /**
+     * Is compress data boolean.
+     *
+     * @param bytes the bytes
+     * @return the boolean
+     */
+    public static boolean isCompressData(byte[] bytes) {
+        if (bytes != null && bytes.length > 2) {
+            int header = ((bytes[0] & 0xff)) | (bytes[1] & 0xff) << 8;
+            return GZIPInputStream.GZIP_MAGIC == header;
+        }
+        return false;
+    }
+}

+ 138 - 0
common/src/main/java/io/seata/common/util/ConfigTools.java

@@ -0,0 +1,138 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import javax.crypto.Cipher;
+import java.nio.charset.StandardCharsets;
+import java.security.*;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Scanner;
+
+/**
+ * @author funkye
+ */
+public class ConfigTools {
+
+    // generate key pair
+    public static KeyPair getKeyPair() throws Exception {
+        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
+        keyPairGenerator.initialize(2048);
+        KeyPair keyPair = keyPairGenerator.generateKeyPair();
+        return keyPair;
+    }
+
+    // obtain the public key (Base64 encoding)
+    public static String getPublicKey(KeyPair keyPair) {
+        PublicKey publicKey = keyPair.getPublic();
+        byte[] bytes = publicKey.getEncoded();
+        return byte2Base64(bytes);
+    }
+
+    // obtain the private key (Base64 encoding)
+    public static String getPrivateKey(KeyPair keyPair) {
+        PrivateKey privateKey = keyPair.getPrivate();
+        byte[] bytes = privateKey.getEncoded();
+        return byte2Base64(bytes);
+    }
+
+    // convert Base64 encoded public key to PublicKey object
+    public static PublicKey string2PublicKey(String pubStr) throws Exception {
+        byte[] keyBytes = base642Byte(pubStr);
+        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+        PublicKey publicKey = keyFactory.generatePublic(keySpec);
+        return publicKey;
+    }
+
+    // convert Base64 encoded private key to PrivateKey object
+    public static PrivateKey string2PrivateKey(String priStr) throws Exception {
+        byte[] keyBytes = base642Byte(priStr);
+        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
+        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
+        PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
+        return privateKey;
+    }
+
+    // public key encryption
+    public static String publicEncrypt(String content, String pubStr) throws Exception {
+        PublicKey publicKey = string2PublicKey(pubStr);
+        Cipher cipher = Cipher.getInstance("RSA");
+        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
+        byte[] bytes = cipher.doFinal(content.getBytes());
+        return byte2Base64(bytes);
+    }
+
+    // public key decryption
+    public static String publicDecrypt(String content, String pubStr) throws Exception {
+        PublicKey publicKey = string2PublicKey(pubStr);
+        Cipher cipher = Cipher.getInstance("RSA");
+        cipher.init(Cipher.DECRYPT_MODE, publicKey);
+        byte[] bytes = cipher.doFinal(base642Byte(content));
+        return new String(bytes, StandardCharsets.UTF_8);
+    }
+
+    // private key encryption
+    public static String privateEncrypt(String content, String priStr) throws Exception {
+        PrivateKey privateKey = string2PrivateKey(priStr);
+        Cipher cipher = Cipher.getInstance("RSA");
+        cipher.init(Cipher.ENCRYPT_MODE, privateKey);
+        byte[] bytes = cipher.doFinal(content.getBytes());
+        return byte2Base64(bytes);
+    }
+
+    // private key decryption
+    public static String privateDecrypt(String content, String priStr) throws Exception {
+        PrivateKey privateKey = string2PrivateKey(priStr);
+        Cipher cipher = Cipher.getInstance("RSA");
+        cipher.init(Cipher.DECRYPT_MODE, privateKey);
+        byte[] bytes = cipher.doFinal(base642Byte(content));
+        return new String(bytes, StandardCharsets.UTF_8);
+    }
+
+    // byte array to Base64 encoding
+    public static String byte2Base64(byte[] bytes) {
+        return new String(Base64.getEncoder().encode(bytes), StandardCharsets.UTF_8);
+    }
+
+    // Base64 encoding to byte array
+    public static byte[] base642Byte(String base64Key) {
+        return Base64.getDecoder().decode(base64Key);
+    }
+
+    public static void main(String[] args) throws Exception {
+        Scanner scan = new Scanner(System.in);
+        KeyPair keyPair = getKeyPair();
+        String publicKeyStr = ConfigTools.getPublicKey(keyPair);
+        String privateKeyStr = ConfigTools.getPrivateKey(keyPair);
+        System.out.println("publicKeyStr:\n" + publicKeyStr);
+        System.out.println("privateKeyStr:\n" + privateKeyStr);
+        System.out.println(
+            "after the key is generated, please keep your key pair properly, if you need to encrypt, please enter your database password");
+        System.out.println("input 'q' exit");
+        while (scan.hasNextLine()) {
+            String password = scan.nextLine();
+            if (StringUtils.isNotBlank(password) && !"q".equalsIgnoreCase(password)) {
+                String byte2Base64 = ConfigTools.privateEncrypt(password, privateKeyStr);
+                System.out.println("encryption completed: \n" + byte2Base64);
+            }
+            break;
+        }
+        scan.close();
+    }
+
+}

+ 107 - 0
common/src/main/java/io/seata/common/util/CycleDependencyHandler.java

@@ -0,0 +1,107 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.function.Function;
+
+/**
+ * The type CycleDependency handler.
+ *
+ * @author wang.liang
+ */
+public class CycleDependencyHandler {
+
+    private static final ThreadLocal<Set<Object>> OBJECT_SET_LOCAL = new ThreadLocal<>();
+
+    public static boolean isStarting() {
+        return OBJECT_SET_LOCAL.get() != null;
+    }
+
+    public static void start() {
+        OBJECT_SET_LOCAL.set(new HashSet<>(8));
+    }
+
+    public static void end() {
+        OBJECT_SET_LOCAL.remove();
+    }
+
+    public static void addObject(Object obj) {
+        if (obj == null) {
+            return;
+        }
+
+        // get object set
+        Set<Object> objectSet = OBJECT_SET_LOCAL.get();
+
+        // add to object set
+        objectSet.add(getUniqueSubstituteObject(obj));
+    }
+
+    public static boolean containsObject(Object obj) {
+        if (obj == null) {
+            return false;
+        }
+
+        // get object set
+        Set<Object> objectSet = OBJECT_SET_LOCAL.get();
+        if (objectSet.isEmpty()) {
+            return false;
+        }
+
+        return objectSet.contains(getUniqueSubstituteObject(obj));
+    }
+
+    public static <O> String wrap(O obj, Function<O, String> function) {
+        boolean isStarting = isStarting();
+        try {
+            if (!isStarting) {
+                start();
+            } else {
+                if (containsObject(obj)) {
+                    return toRefString(obj);
+                }
+            }
+
+            // add object
+            addObject(obj);
+
+            // do function
+            return function.apply(obj);
+        } finally {
+            if (!isStarting) {
+                end();
+            }
+        }
+    }
+
+    public static String toRefString(Object obj) {
+        return "(ref " + obj.getClass().getSimpleName() + ")";
+    }
+
+    /**
+     * get Unique Substitute Object.
+     * Avoid `obj.hashCode()` throwing `StackOverflowError` during cycle dependency.
+     *
+     * @param obj the object
+     * @return the substitute object
+     */
+    private static Object getUniqueSubstituteObject(Object obj) {
+        // TODO: HELP-WANTED: Optimize this method to ensure uniqueness
+        return System.identityHashCode(obj);
+    }
+}

+ 89 - 0
common/src/main/java/io/seata/common/util/DurationUtil.java

@@ -0,0 +1,89 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.time.Duration;
+import java.time.format.DateTimeParseException;
+import java.util.regex.Pattern;
+
+/**
+ * @author XCXCXCXCX
+ */
+public class DurationUtil {
+
+    public static final Duration DEFAULT_DURATION = Duration.ofMillis(-1);
+
+    public static final String DAY_UNIT = "d";
+    public static final String HOUR_UNIT = "h";
+    public static final String MINUTE_UNIT = "m";
+    public static final String SECOND_UNIT = "s";
+    public static final String MILLIS_SECOND_UNIT = "ms";
+
+    private static final Pattern SIMPLE = Pattern.compile("^([\\+\\-]?\\d+)([a-zA-Z]{1,2})$");
+    private static final Pattern ISO8601 = Pattern.compile("^[\\+\\-]?P.*$");
+
+    public static Duration parse(String str) {
+        if (StringUtils.isBlank(str)) {
+            return DEFAULT_DURATION;
+        }
+
+        if (SIMPLE.matcher(str).matches()) {
+            if (str.contains(MILLIS_SECOND_UNIT)) {
+                long value = doParse(MILLIS_SECOND_UNIT, str);
+                return Duration.ofMillis(value);
+            } else if (str.contains(DAY_UNIT)) {
+                long value = doParse(DAY_UNIT, str);
+                return Duration.ofDays(value);
+            } else if (str.contains(HOUR_UNIT)) {
+                long value = doParse(HOUR_UNIT, str);
+                return Duration.ofHours(value);
+            } else if (str.contains(MINUTE_UNIT)) {
+                long value = doParse(MINUTE_UNIT, str);
+                return Duration.ofMinutes(value);
+            } else if (str.contains(SECOND_UNIT)) {
+                long value = doParse(SECOND_UNIT, str);
+                return Duration.ofSeconds(value);
+            } else {
+                throw new UnsupportedOperationException("\"" + str + "\" can't parse to Duration");
+            }
+        }
+
+        try {
+            if (ISO8601.matcher(str).matches()) {
+                return Duration.parse(str);
+            }
+        } catch (DateTimeParseException e) {
+            throw new UnsupportedOperationException("\"" + str + "\" can't parse to Duration", e);
+        }
+
+        try {
+            int millis = Integer.parseInt(str);
+            return Duration.ofMillis(millis);
+        } catch (Exception e) {
+            throw new UnsupportedOperationException("\"" + str + "\" can't parse to Duration", e);
+        }
+    }
+
+    private static long doParse(String unit, String str) {
+        str = str.replace(unit, "");
+        try {
+            return Long.parseLong(str);
+        } catch (NumberFormatException e) {
+            throw new UnsupportedOperationException("\"" + str + "\" can't parse to Duration", e);
+        }
+    }
+
+}

+ 48 - 0
common/src/main/java/io/seata/common/util/IOUtil.java

@@ -0,0 +1,48 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+/**
+ * @author jsbxyyx
+ */
+public class IOUtil {
+
+    /**
+     * close Closeable
+     * @param closeables the closeables
+     */
+    public static void close(AutoCloseable... closeables) {
+        if (CollectionUtils.isNotEmpty(closeables)) {
+            for (AutoCloseable closeable : closeables) {
+                close(closeable);
+            }
+        }
+    }
+
+    /**
+     * close Closeable
+     * @param closeable the closeable
+     */
+    public static void close(AutoCloseable closeable) {
+        if (closeable != null) {
+            try {
+                closeable.close();
+            } catch (Exception ignore) {
+            }
+        }
+    }
+
+}

+ 187 - 0
common/src/main/java/io/seata/common/util/IdWorker.java

@@ -0,0 +1,187 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.net.NetworkInterface;
+import java.util.Enumeration;
+import java.util.Random;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author funkye
+ * @author selfishlover
+ */
+public class IdWorker {
+
+    /**
+     * Start time cut (2020-05-03)
+     */
+    private final long twepoch = 1588435200000L;
+
+    /**
+     * The number of bits occupied by workerId
+     */
+    private final int workerIdBits = 10;
+
+    /**
+     * The number of bits occupied by timestamp
+     */
+    private final int timestampBits = 41;
+
+    /**
+     * The number of bits occupied by sequence
+     */
+    private final int sequenceBits = 12;
+
+    /**
+     * Maximum supported machine id, the result is 1023
+     */
+    private final int maxWorkerId = ~(-1 << workerIdBits);
+
+    /**
+     * business meaning: machine ID (0 ~ 1023)
+     * actual layout in memory:
+     * highest 1 bit: 0
+     * middle 10 bit: workerId
+     * lowest 53 bit: all 0
+     */
+    private long workerId;
+
+    /**
+     * timestamp and sequence mix in one Long
+     * highest 11 bit: not used
+     * middle  41 bit: timestamp
+     * lowest  12 bit: sequence
+     */
+    private AtomicLong timestampAndSequence;
+
+    /**
+     * mask that help to extract timestamp and sequence from a long
+     */
+    private final long timestampAndSequenceMask = ~(-1L << (timestampBits + sequenceBits));
+
+    /**
+     * instantiate an IdWorker using given workerId
+     * @param workerId if null, then will auto assign one
+     */
+    public IdWorker(Long workerId) {
+        initTimestampAndSequence();
+        initWorkerId(workerId);
+    }
+
+    /**
+     * init first timestamp and sequence immediately
+     */
+    private void initTimestampAndSequence() {
+        long timestamp = getNewestTimestamp();
+        long timestampWithSequence = timestamp << sequenceBits;
+        this.timestampAndSequence = new AtomicLong(timestampWithSequence);
+    }
+
+    /**
+     * init workerId
+     * @param workerId if null, then auto generate one
+     */
+    private void initWorkerId(Long workerId) {
+        if (workerId == null) {
+            workerId = generateWorkerId();
+        }
+        if (workerId > maxWorkerId || workerId < 0) {
+            String message = String.format("worker Id can't be greater than %d or less than 0", maxWorkerId);
+            throw new IllegalArgumentException(message);
+        }
+        this.workerId = workerId << (timestampBits + sequenceBits);
+    }
+
+    /**
+     * get next UUID(base on snowflake algorithm), which look like:
+     * highest 1 bit: always 0
+     * next   10 bit: workerId
+     * next   41 bit: timestamp
+     * lowest 12 bit: sequence
+     * @return UUID
+     */
+    public long nextId() {
+        waitIfNecessary();
+        long next = timestampAndSequence.incrementAndGet();
+        long timestampWithSequence = next & timestampAndSequenceMask;
+        return workerId | timestampWithSequence;
+    }
+
+    /**
+     * block current thread if the QPS of acquiring UUID is too high
+     * that current sequence space is exhausted
+     */
+    private void waitIfNecessary() {
+        long currentWithSequence = timestampAndSequence.get();
+        long current = currentWithSequence >>> sequenceBits;
+        long newest = getNewestTimestamp();
+        if (current >= newest) {
+            try {
+                Thread.sleep(5);
+            } catch (InterruptedException ignore) {
+                // don't care
+            }
+        }
+    }
+
+    /**
+     * get newest timestamp relative to twepoch
+     */
+    private long getNewestTimestamp() {
+        return System.currentTimeMillis() - twepoch;
+    }
+
+    /**
+     * auto generate workerId, try using mac first, if failed, then randomly generate one
+     * @return workerId
+     */
+    private long generateWorkerId() {
+        try {
+            return generateWorkerIdBaseOnMac();
+        } catch (Exception e) {
+            return generateRandomWorkerId();
+        }
+    }
+
+    /**
+     * use lowest 10 bit of available MAC as workerId
+     * @return workerId
+     * @throws Exception when there is no available mac found
+     */
+    private long generateWorkerIdBaseOnMac() throws Exception {
+        Enumeration<NetworkInterface> all = NetworkInterface.getNetworkInterfaces();
+        while (all.hasMoreElements()) {
+            NetworkInterface networkInterface = all.nextElement();
+            boolean isLoopback = networkInterface.isLoopback();
+            boolean isVirtual = networkInterface.isVirtual();
+            if (isLoopback || isVirtual) {
+                continue;
+            }
+            byte[] mac = networkInterface.getHardwareAddress();
+            return ((mac[4] & 0B11) << 8) | (mac[5] & 0xFF);
+        }
+        throw new RuntimeException("no available mac found");
+    }
+
+    /**
+     * randomly generate one as workerId
+     * @return workerId
+     */
+    private long generateRandomWorkerId() {
+        return new Random().nextInt(maxWorkerId + 1);
+    }
+}

+ 35 - 0
common/src/main/java/io/seata/common/util/LambdaUtils.java

@@ -0,0 +1,35 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+/**
+ * The type Lambda util.
+ *
+ * @author zjinlei
+ */
+public class LambdaUtils {
+
+    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
+        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
+        return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE) == null;
+    }
+
+}

+ 213 - 0
common/src/main/java/io/seata/common/util/LowerCaseLinkHashMap.java

@@ -0,0 +1,213 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+public class LowerCaseLinkHashMap<V> implements Map<String, V> {
+
+    private final LinkedHashMap<String, V> targetMap;
+
+    private final LinkedHashMap<String, String> lowerKeyToOriginMap;
+
+    public LowerCaseLinkHashMap() {
+        targetMap = new LinkedHashMap<>(16, 1.001f);
+        lowerKeyToOriginMap = new LinkedHashMap<>(16, 1.001f);
+    }
+
+    public LowerCaseLinkHashMap(Integer initialCapacity, float loadFactor) {
+        targetMap = new LinkedHashMap<>(initialCapacity, loadFactor);
+        lowerKeyToOriginMap = new LinkedHashMap<>(initialCapacity, loadFactor);
+    }
+
+    public LowerCaseLinkHashMap(Map<String, V> map) {
+        targetMap = new LinkedHashMap<>(16, 1.001f);
+        lowerKeyToOriginMap = new LinkedHashMap<>(16, 1.001f);
+
+        putAll(map);
+    }
+
+    @Override
+    public int size() {
+        return targetMap.size();
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return targetMap.isEmpty();
+    }
+
+    @Override
+    public boolean containsKey(Object o) {
+        if (o instanceof String) {
+            return targetMap.containsKey(((String) o).toLowerCase());
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean containsValue(Object o) {
+        return targetMap.containsKey(o);
+    }
+
+    @Override
+    public V get(Object o) {
+        if (o instanceof String) {
+            return targetMap.get(((String) o).toLowerCase());
+        }
+
+        return null;
+    }
+
+    @Override
+    public V put(String s, V v) {
+        lowerKeyToOriginMap.put(s.toLowerCase(), s);
+        return targetMap.put(s.toLowerCase(), v);
+    }
+
+    @Override
+    public V remove(Object o) {
+        if (o instanceof String) {
+            lowerKeyToOriginMap.remove(((String) o).toLowerCase());
+            return targetMap.remove(((String) o).toLowerCase());
+        }
+
+        return null;
+    }
+
+    @Override
+    public void putAll(Map<? extends String, ? extends V> map) {
+        map.forEach((k, v) -> lowerKeyToOriginMap.put(k.toLowerCase(), k));
+        map.forEach((k, v) -> targetMap.put(k.toLowerCase(), v));
+    }
+
+    @Override
+    public void clear() {
+        targetMap.clear();
+        lowerKeyToOriginMap.clear();
+    }
+
+    @Override
+    public Set<String> keySet() {
+        return new HashSet<>(lowerKeyToOriginMap.values());
+    }
+
+    @Override
+    public Collection<V> values() {
+        return targetMap.values();
+    }
+
+    @Override
+    public Set<Entry<String, V>> entrySet() {
+        return targetMap.entrySet();
+    }
+
+    @Override
+    public V getOrDefault(Object key, V defaultValue) {
+        if (key instanceof String) {
+            return Map.super.getOrDefault(((String) key).toLowerCase(), defaultValue);
+        }
+
+        return defaultValue;
+    }
+
+    @Override
+    public void replaceAll(BiFunction<? super String, ? super V, ? extends V> function) {
+        Map.super.replaceAll(function);
+    }
+
+    @Override
+    public V putIfAbsent(String key, V value) {
+        return Map.super.putIfAbsent(key.toLowerCase(), value);
+    }
+
+    @Override
+    public boolean remove(Object key, Object value) {
+        if (key instanceof String) {
+            return Map.super.remove(((String) key).toLowerCase(), value);
+        }
+
+        return false;
+    }
+
+    @Override
+    public boolean replace(String key, V oldValue, V newValue) {
+        return Map.super.replace(key.toLowerCase(), oldValue, newValue);
+    }
+
+    @Override
+    public V replace(String key, V value) {
+        return Map.super.replace(key.toLowerCase(), value);
+    }
+
+    @Override
+    public V computeIfAbsent(String key, Function<? super String, ? extends V> mappingFunction) {
+        return Map.super.computeIfAbsent(key.toLowerCase(), mappingFunction);
+    }
+
+    @Override
+    public V computeIfPresent(String key, BiFunction<? super String, ? super V, ? extends V> remappingFunction) {
+        return Map.super.computeIfPresent(key.toLowerCase(), remappingFunction);
+    }
+
+    @Override
+    public V compute(String key, BiFunction<? super String, ? super V, ? extends V> remappingFunction) {
+        return Map.super.compute(key.toLowerCase(), remappingFunction);
+    }
+
+    @Override
+    public V merge(String key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+        return Map.super.merge(key.toLowerCase(), value, remappingFunction);
+    }
+
+    @Override
+    protected LowerCaseLinkHashMap<V> clone() throws CloneNotSupportedException {
+        return new LowerCaseLinkHashMap<>(this);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        LowerCaseLinkHashMap<?> that = (LowerCaseLinkHashMap<?>) o;
+        return Objects.equals(targetMap, that.targetMap);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(targetMap);
+    }
+
+    @Override
+    public String toString() {
+        return targetMap.toString();
+    }
+
+}

+ 105 - 0
common/src/main/java/io/seata/common/util/MapUtil.java

@@ -0,0 +1,105 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Map Util
+ *
+ * @author zhixing
+ */
+public class MapUtil {
+
+    /**
+     * obj convert to Map
+     *
+     * @param object
+     * @return Map<String,Object>
+     */
+    public static Map<String, Object> asMap(Object object) {
+        // YAML can have numbers as keys
+        Map<String, Object> result = new LinkedHashMap<>();
+        if (!(object instanceof Map)) {
+            // A document can be a text literal
+            result.put("document", object);
+            return result;
+        }
+
+        Map<Object, Object> map = (Map<Object, Object>) object;
+        for (Map.Entry<Object, Object> entry : map.entrySet()) {
+            Object value = entry.getValue();
+            if (value instanceof Map) {
+                value = asMap(value);
+            }
+            Object key = entry.getKey();
+            if (key instanceof CharSequence) {
+                result.put(key.toString(), value);
+            } else {
+                // It has to be a map key in this case
+                result.put("[" + key.toString() + "]", value);
+            }
+        }
+        return result;
+    }
+    /**
+     * get flattened Map
+     *
+     * @param source
+     * @return Map<String,Object>
+     */
+    public static Map<String, Object> getFlattenedMap(Map<String, Object> source) {
+        Map<String, Object> result = new LinkedHashMap<>();
+        buildFlattenedMap(result, source, null);
+        return result;
+    }
+
+    private static void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, String path) {
+        for (Map.Entry<String, Object> entry : source.entrySet()) {
+            String key = entry.getKey();
+            if (StringUtils.isNotBlank(path)) {
+                if (key.startsWith("[")) {
+                    key = path + key;
+                } else {
+                    key = path + '.' + key;
+                }
+            }
+            Object value = entry.getValue();
+            if (value instanceof String) {
+                result.put(key, value);
+            } else if (value instanceof Map) {
+                // Need a compound key
+                @SuppressWarnings("unchecked")
+                Map<String, Object> map = (Map<String, Object>) value;
+                buildFlattenedMap(result, map, key);
+            } else if (value instanceof Collection) {
+                // Need a compound key
+                @SuppressWarnings("unchecked")
+                Collection<Object> collection = (Collection<Object>) value;
+                int count = 0;
+                for (Object object : collection) {
+                    buildFlattenedMap(result,
+                            Collections.singletonMap("[" + (count++) + "]", object), key);
+                }
+            } else {
+                result.put(key, value != null ? value : "");
+            }
+        }
+    }
+}

+ 267 - 0
common/src/main/java/io/seata/common/util/NetUtil.java

@@ -0,0 +1,267 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.NetworkInterface;
+import java.net.SocketAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The type Net util.
+ *
+ * @author slievrly
+ */
+public class NetUtil {
+    private static final Logger LOGGER = LoggerFactory.getLogger(NetUtil.class);
+    private static final String LOCALHOST = "127.0.0.1";
+
+    private static final String ANY_HOST = "0.0.0.0";
+
+    private static volatile InetAddress LOCAL_ADDRESS = null;
+
+    private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
+
+    /**
+     * To string address string.
+     *
+     * @param address the address
+     * @return the string
+     */
+    public static String toStringAddress(SocketAddress address) {
+        if (address == null) {
+            return StringUtils.EMPTY;
+        }
+        return toStringAddress((InetSocketAddress) address);
+    }
+
+    /**
+     * To ip address string.
+     *
+     * @param address the address
+     * @return the string
+     */
+    public static String toIpAddress(SocketAddress address) {
+        InetSocketAddress inetSocketAddress = (InetSocketAddress) address;
+        return inetSocketAddress.getAddress().getHostAddress();
+    }
+
+    /**
+     * To string address string.
+     *
+     * @param address the address
+     * @return the string
+     */
+    public static String toStringAddress(InetSocketAddress address) {
+        return address.getAddress().getHostAddress() + ":" + address.getPort();
+    }
+
+    /**
+     * To inet socket address inet socket address.
+     *
+     * @param address the address
+     * @return the inet socket address
+     */
+    public static InetSocketAddress toInetSocketAddress(String address) {
+        int i = address.indexOf(':');
+        String host;
+        int port;
+        if (i > -1) {
+            host = address.substring(0, i);
+            port = Integer.parseInt(address.substring(i + 1));
+        } else {
+            host = address;
+            port = 0;
+        }
+        return new InetSocketAddress(host, port);
+    }
+
+    /**
+     * To long long.
+     *
+     * @param address the address
+     * @return the long
+     */
+    public static long toLong(String address) {
+        InetSocketAddress ad = toInetSocketAddress(address);
+        String[] ip = ad.getAddress().getHostAddress().split("\\.");
+        long r = 0;
+        r = r | (Long.parseLong(ip[0]) << 40);
+        r = r | (Long.parseLong(ip[1]) << 32);
+        r = r | (Long.parseLong(ip[2]) << 24);
+        r = r | (Long.parseLong(ip[3]) << 16);
+        r = r | ad.getPort();
+        return r;
+    }
+
+    /**
+     * Gets local ip.
+     *
+     * @return the local ip
+     */
+    public static String getLocalIp(String... preferredNetworks) {
+        InetAddress address = getLocalAddress(preferredNetworks);
+        return address == null ? LOCALHOST : address.getHostAddress();
+    }
+
+    /**
+     * Gets local host.
+     *
+     * @return the local host
+     */
+    public static String getLocalHost() {
+        InetAddress address = getLocalAddress();
+        return address == null ? "localhost" : address.getHostName();
+    }
+
+    /**
+     * Gets local address.
+     * not support ipv6
+     * if match the preferredNetworks rule return the first
+     * if all not match preferredNetworks rule return the first valid ip
+     * @return the local address
+     */
+    public static InetAddress getLocalAddress(String... preferredNetworks) {
+        if (LOCAL_ADDRESS != null) {
+            return LOCAL_ADDRESS;
+        }
+        InetAddress localAddress = getLocalAddress0(preferredNetworks);
+        LOCAL_ADDRESS = localAddress;
+        return localAddress;
+    }
+
+    private static InetAddress getLocalAddress0(String... preferredNetworks) {
+        InetAddress localAddress = null;
+        try {
+            Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
+            if (interfaces != null) {
+                while (interfaces.hasMoreElements()) {
+                    try {
+                        NetworkInterface network = interfaces.nextElement();
+                        if (network.isUp()) {
+                            Enumeration<InetAddress> addresses = network.getInetAddresses();
+                            while (addresses.hasMoreElements()) {
+                                try {
+                                    InetAddress address = addresses.nextElement();
+                                    if (isValidAddress(address)) {
+                                        if (null == localAddress) {
+                                            localAddress = address;
+                                        }
+                                        //check preferredNetworks
+                                        if (preferredNetworks.length > 0) {
+                                            String ip = address.getHostAddress();
+                                            for (String regex : preferredNetworks) {
+                                                if (StringUtils.isBlank(regex)) {
+                                                    continue;
+                                                }
+                                                if (ip.matches(regex) || ip.startsWith(regex)) {
+                                                    return address;
+                                                }
+                                            }
+                                        } else {
+                                            return address;
+                                        }
+                                    }
+                                } catch (Throwable e) {
+                                    LOGGER.warn("Failed to retrieving ip address, {}", e.getMessage(), e);
+                                }
+                            }
+                        }
+                    } catch (Throwable e) {
+                        LOGGER.warn("Failed to retrieving ip address, {}", e.getMessage(), e);
+                    }
+                }
+            }
+        } catch (Throwable e) {
+            LOGGER.warn("Failed to retrieving ip address, {}", e.getMessage(), e);
+        }
+        if (localAddress == null) {
+            LOGGER.error("Could not get local host ip address, will use 127.0.0.1 instead.");
+        } else {
+            LOGGER.error("Could not match ip by preferredNetworks:{}, will use default first ip {} instead.", Arrays.toString(preferredNetworks), localAddress.getHostAddress());
+        }
+        return localAddress;
+    }
+
+    /**
+     * Valid address.
+     *
+     * @param address the address
+     */
+    public static void validAddress(InetSocketAddress address) {
+        if (address.getHostName() == null || 0 == address.getPort()) {
+            throw new IllegalArgumentException("invalid address:" + address);
+        }
+    }
+
+    /**
+     * is valid address
+     *
+     * @param address
+     * @return true if the given address is valid
+     */
+    private static boolean isValidAddress(InetAddress address) {
+        if (address == null || address.isLoopbackAddress()) {
+            return false;
+        }
+        return isValidIp(address.getHostAddress(), false);
+    }
+
+    /**
+     * is valid IP
+     *
+     * @param ip
+     * @param validLocalAndAny Are 127.0.0.1 and 0.0.0.0 valid IPs?
+     * @return true if the given IP is valid
+     */
+    public static boolean isValidIp(String ip, boolean validLocalAndAny) {
+        if (ip == null) {
+            return false;
+        }
+        ip = convertIpIfNecessary(ip);
+        if (validLocalAndAny) {
+            return IP_PATTERN.matcher(ip).matches();
+        } else {
+            return !ANY_HOST.equals(ip) && !LOCALHOST.equals(ip) && IP_PATTERN.matcher(ip).matches();
+        }
+
+    }
+
+    /**
+     * convert ip if necessary
+     *
+     * @param ip
+     * @return java.lang.String
+     */
+    private static String convertIpIfNecessary(String ip) {
+        if (IP_PATTERN.matcher(ip).matches()) {
+            return ip;
+        } else {
+            try {
+                return InetAddress.getByName(ip).getHostAddress();
+            } catch (UnknownHostException e) {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+}

+ 63 - 0
common/src/main/java/io/seata/common/util/NumberUtils.java

@@ -0,0 +1,63 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+/**
+ * Number utility
+ *
+ * @author helloworlde
+ */
+public class NumberUtils {
+
+    /**
+     * <p>Convert a <code>String</code> to an <code>int</code>, returning a
+     * default value if the conversion fails.</p>
+     *
+     * <p>If the string is <code>null</code>, the default value is returned.</p>
+     *
+     * @param str          the string to convert, may be null
+     * @param defaultValue the default value
+     * @return the int represented by the string, or the default if conversion fails
+     */
+    public static int toInt(final String str, final int defaultValue) {
+        if (str == null) {
+            return defaultValue;
+        }
+        try {
+            return Integer.parseInt(str);
+        } catch (NumberFormatException nfe) {
+            return defaultValue;
+        }
+    }
+
+    public static Long toLong(String str, final Long defaultValue) {
+        if (str == null) {
+            return defaultValue;
+        }
+        try {
+            return Long.valueOf(str);
+        } catch (NumberFormatException nfe) {
+            return defaultValue;
+        }
+    }
+
+    public static Long toLong(String str) {
+        if (StringUtils.isNotBlank(str)) {
+            return Long.valueOf(str);
+        }
+        return null;
+    }
+}

+ 160 - 0
common/src/main/java/io/seata/common/util/PageUtil.java

@@ -0,0 +1,160 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.List;
+
+import io.seata.common.exception.NotSupportYetException;
+
+/**
+ * db page util
+ *
+ * @author lvekee 734843455@qq.com
+ */
+public class PageUtil {
+    /**
+     * The constant MIN_PAGE_NUM
+     */
+    public static final int MIN_PAGE_NUM = 1;
+    /**
+     * The constant MAX_PAGE_NUM
+     */
+    public static final int MAX_PAGE_NUM = 999;
+    /**
+     * The constant MIN_PAGE_SIZE
+     */
+    public static final int MIN_PAGE_SIZE = 1;
+    /**
+     * The constant MAX_PAGE_SIZE
+     */
+    public static final int MAX_PAGE_SIZE = 100;
+    /**
+     * The constant SOURCE_SQL_PLACE_HOLD
+     */
+    private static final String SOURCE_SQL_PLACE_HOLD = " #sourcesql# ";
+    /**
+     * The constant LIMIT_PLACE_HOLD
+     */
+    private static final String LIMIT_PLACE_HOLD = " #limit# ";
+    /**
+     * The constant OFFSET_PLACE_HOLD
+     */
+    private static final String OFFSET_PLACE_HOLD = " #offset# ";
+    /**
+     * The constant START_PLACE_HOLD
+     */
+    private static final String START_PLACE_HOLD = " #start# ";
+    /**
+     * The constant END_PLACE_HOLD
+     */
+    private static final String END_PLACE_HOLD = " #end# ";
+    /**
+     * The constant LIMIT_TEMPLAGE.
+     */
+    private static final String LIMIT_TEMPLATE = SOURCE_SQL_PLACE_HOLD + " limit " + LIMIT_PLACE_HOLD + " offset "
+            + OFFSET_PLACE_HOLD;
+    /**
+     * The constant ORACLE_PAGE_TEMPLATE.
+     */
+    private static final String ORACLE_PAGE_TEMPLATE = "select * from ( select ROWNUM rn, temp.* from ("
+            + SOURCE_SQL_PLACE_HOLD + ") temp ) where rn between " + START_PLACE_HOLD + " and " + END_PLACE_HOLD;
+
+    /**
+     * check page parm
+     *
+     * @param pageNum the page num
+     * @param pageSize the page size
+     */
+    public static void checkParam(int pageNum, int pageSize) {
+        if (!(pageNum >= MIN_PAGE_NUM && pageNum <= MAX_PAGE_NUM)) {
+            throw new IllegalArgumentException("pageNum range not in [" + MIN_PAGE_NUM + "-" + MAX_PAGE_NUM + "]");
+        }
+        if (!(pageSize >= MIN_PAGE_SIZE && pageSize <= MAX_PAGE_SIZE)) {
+            throw new IllegalArgumentException("pageSize range not in [" + MIN_PAGE_SIZE + "-" + MAX_PAGE_SIZE + "]");
+        }
+    }
+
+    /**
+     * get pagesql
+     *
+     * @param sourceSql the source sql
+     * @param dbType the db type
+     * @param pageNum the page num
+     * @param pageSize the page size
+     * @return the page sql
+     */
+    public static String pageSql(String sourceSql, String dbType, int pageNum, int pageSize) {
+        switch (dbType) {
+            case "mysql":
+            case "h2":
+            case "postgresql":
+            case "oceanbase":
+                return LIMIT_TEMPLATE.replace(SOURCE_SQL_PLACE_HOLD, sourceSql)
+                        .replace(LIMIT_PLACE_HOLD, String.valueOf(pageSize))
+                        .replace(OFFSET_PLACE_HOLD, String.valueOf((pageNum - 1) * pageSize));
+            case "oracle":
+                return ORACLE_PAGE_TEMPLATE.replace(SOURCE_SQL_PLACE_HOLD, sourceSql)
+                        .replace(START_PLACE_HOLD, String.valueOf(pageSize * (pageNum - 1) + 1))
+                        .replace(END_PLACE_HOLD, String.valueOf(pageSize * pageNum));
+            default:
+                throw new NotSupportYetException("PageUtil not support this dbType:" + dbType);
+        }
+    }
+
+    /**
+     * get countsql
+     *
+     * @param sourceSql the source sql
+     * @param dbType the db type
+     * @return the count sql
+     */
+    public static String countSql(String sourceSql, String dbType) {
+        switch (dbType) {
+            case "mysql":
+            case "h2":
+            case "oceanbase":
+            case "oracle":
+                return sourceSql.replaceAll("(?i)(?<=select)(.*)(?=from)", " count(1) ");
+            case "postgresql":
+                int lastIndexOfOrderBy = sourceSql.toLowerCase().lastIndexOf("order by");
+                if (lastIndexOfOrderBy != -1) {
+                    return sourceSql.substring(0, lastIndexOfOrderBy).replaceAll("(?i)(?<=select)(.*)(?=from)", " count(1) ");
+                }
+                return sourceSql.replaceAll("(?i)(?<=select)(.*)(?=from)", " count(1) ");
+            default:
+                throw new NotSupportYetException("PageUtil not support this dbType:" + dbType);
+        }
+    }
+
+    /**
+     * set sqlParamList in preparedStatement
+     * @param ps the prepared statement
+     * @param sqlParamList the sql param list
+     * @throws SQLException the sql exception
+     */
+    public static void setObject(PreparedStatement ps, List<Object> sqlParamList) throws SQLException {
+        for (int i = 0; i < sqlParamList.size(); i++) {
+            if (sqlParamList.get(i) instanceof Date) {
+                ps.setDate(i + 1, new java.sql.Date(((Date) sqlParamList.get(i)).getTime()));
+            } else {
+                ps.setObject(i + 1, sqlParamList.get(i));
+            }
+        }
+    }
+}

+ 731 - 0
common/src/main/java/io/seata/common/util/ReflectionUtil.java

@@ -0,0 +1,731 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Proxy;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Reflection tools
+ *
+ * @author zhangsen
+ * @author wang.liang
+ */
+public final class ReflectionUtil {
+
+    private ReflectionUtil() {
+    }
+
+
+    //region Constants
+
+    /**
+     * The constant EMPTY_FIELD_ARRAY
+     */
+    public static final Field[] EMPTY_FIELD_ARRAY = new Field[0];
+
+    /**
+     * The constant EMPTY_CLASS_ARRAY
+     */
+    public static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[0];
+
+    /**
+     * The constant EMPTY_ARGS
+     */
+    public static final Object[] EMPTY_ARGS = new Object[0];
+
+    /**
+     * The cache CLASS_FIELDS_CACHE
+     */
+    private static final Map<Class<?>, Field[]> CLASS_FIELDS_CACHE = new ConcurrentHashMap<>();
+
+    /**
+     * The cache FIELD_CACHE: Class -> fieldName -> Field
+     */
+    private static final Map<Class<?>, Map<String, Field>> FIELD_CACHE = new ConcurrentHashMap<>();
+
+    /**
+     * The cache METHOD_CACHE: Class -> methodName|paramClassName1,paramClassName2,...,paramClassNameN -> Method
+     */
+    private static final Map<Class<?>, Map<String, Method>> METHOD_CACHE = new ConcurrentHashMap<>();
+
+    //endregion
+
+
+    //region Class
+
+    /**
+     * Gets class by name.
+     *
+     * @param className the class name
+     * @return the class by name
+     * @throws ClassNotFoundException the class not found exception
+     */
+    public static Class<?> getClassByName(String className) throws ClassNotFoundException {
+        return Class.forName(className, true, Thread.currentThread().getContextClassLoader());
+    }
+
+    //endregion
+
+
+    //region Interface
+
+    /**
+     * get all interface of the clazz
+     *
+     * @param clazz the clazz
+     * @return set
+     */
+    public static Set<Class<?>> getInterfaces(Class<?> clazz) {
+        if (clazz.isInterface()) {
+            return Collections.singleton(clazz);
+        }
+        Set<Class<?>> interfaces = new LinkedHashSet<>();
+        while (clazz != null) {
+            Class<?>[] ifcs = clazz.getInterfaces();
+            for (Class<?> ifc : ifcs) {
+                interfaces.addAll(getInterfaces(ifc));
+            }
+            clazz = clazz.getSuperclass();
+        }
+        return interfaces;
+    }
+
+    //endregion
+
+
+    //region Field
+
+    /**
+     * Gets all fields, excluding static or synthetic fields
+     *
+     * @param targetClazz the target class
+     */
+    public static Field[] getAllFields(final Class<?> targetClazz) {
+        if (targetClazz == Object.class || targetClazz.isInterface()) {
+            return EMPTY_FIELD_ARRAY;
+        }
+
+        // get from the cache
+        Field[] fields = CLASS_FIELDS_CACHE.get(targetClazz);
+        if (fields != null) {
+            return fields;
+        }
+
+        // load current class declared fields
+        fields = targetClazz.getDeclaredFields();
+        final LinkedList<Field> fieldList = new LinkedList<>(Arrays.asList(fields));
+
+        // remove the static or synthetic fields
+        fieldList.removeIf(f -> Modifier.isStatic(f.getModifiers()) || f.isSynthetic());
+
+        // load super class all fields, and add to the field list
+        Field[] superFields = getAllFields(targetClazz.getSuperclass());
+        if (CollectionUtils.isNotEmpty(superFields)) {
+            fieldList.addAll(Arrays.asList(superFields));
+        }
+
+        // list to array
+        Field[] resultFields;
+        if (!fieldList.isEmpty()) {
+            resultFields = fieldList.toArray(new Field[0]);
+        } else {
+            // reuse the EMPTY_FIELD_ARRAY
+            resultFields = EMPTY_FIELD_ARRAY;
+        }
+
+        // set cache
+        CLASS_FIELDS_CACHE.put(targetClazz, resultFields);
+
+        return resultFields;
+    }
+
+    /**
+     * get Field
+     *
+     * @param clazz     the class
+     * @param fieldName the field name
+     * @return the field
+     * @throws NoSuchFieldException if the field named {@code fieldName} does not exist
+     * @throws SecurityException    the security exception
+     */
+    public static Field getField(final Class<?> clazz, final String fieldName) throws NoSuchFieldException, SecurityException {
+        Map<String, Field> fieldMap = CollectionUtils.computeIfAbsent(FIELD_CACHE, clazz, k -> new ConcurrentHashMap<>());
+        Field field = CollectionUtils.computeIfAbsent(fieldMap, fieldName, k -> {
+            Class<?> cl = clazz;
+            while (cl != null && cl != Object.class && !cl.isInterface()) {
+                try {
+                    return cl.getDeclaredField(fieldName);
+                } catch (NoSuchFieldException e) {
+                    cl = cl.getSuperclass();
+                }
+            }
+            return null;
+        });
+
+        if (field == null) {
+            throw new NoSuchFieldException("field not found: " + clazz.getName() + ", field: " + fieldName);
+        }
+
+        if (!field.isAccessible()) {
+            field.setAccessible(true);
+        }
+
+        return field;
+    }
+
+    /**
+     * get field value
+     *
+     * @param target the target
+     * @param field  the field of the target
+     * @param <T>    the field type
+     * @return field value
+     * @throws IllegalArgumentException if {@code target} is {@code null}
+     * @throws SecurityException        the security exception
+     * @throws ClassCastException       if the type of the variable receiving the field value is not equals to the field type
+     */
+    public static <T> T getFieldValue(Object target, Field field)
+            throws IllegalArgumentException, SecurityException {
+        if (target == null) {
+            throw new IllegalArgumentException("target must be not null");
+        }
+
+        while (true) {
+            if (!field.isAccessible()) {
+                field.setAccessible(true);
+            }
+            try {
+                return (T)field.get(target);
+            } catch (IllegalAccessException ignore) {
+                // avoid other threads executing `field.setAccessible(false)`
+            }
+        }
+    }
+
+    /**
+     * get field value
+     *
+     * @param target    the target
+     * @param fieldName the field name
+     * @param <T>       the field type
+     * @return field value
+     * @throws IllegalArgumentException if {@code target} is {@code null}
+     * @throws NoSuchFieldException     if the field named {@code fieldName} does not exist
+     * @throws SecurityException        the security exception
+     * @throws ClassCastException       if the type of the variable receiving the field value is not equals to the field type
+     */
+    public static <T> T getFieldValue(Object target, String fieldName)
+            throws IllegalArgumentException, NoSuchFieldException, SecurityException {
+        if (target == null) {
+            throw new IllegalArgumentException("target must be not null");
+        }
+
+        // get field
+        Field field = getField(target.getClass(), fieldName);
+
+        // get field value
+        return getFieldValue(target, field);
+    }
+
+    /**
+     * set field value
+     *
+     * @param target     the target
+     * @param field      the field of the target
+     * @param fieldValue the field value
+     * @throws IllegalArgumentException if {@code target} is {@code null}
+     * @throws SecurityException        the security exception
+     */
+    public static void setFieldValue(Object target, Field field, Object fieldValue)
+            throws IllegalArgumentException, SecurityException {
+        if (target == null) {
+            throw new IllegalArgumentException("target must be not null");
+        }
+
+        while (true) {
+            if (!field.isAccessible()) {
+                field.setAccessible(true);
+            }
+            try {
+                field.set(target, fieldValue);
+                return;
+            } catch (IllegalAccessException ignore) {
+                // avoid other threads executing `field.setAccessible(false)`
+            }
+        }
+    }
+
+    /**
+     * get field value
+     *
+     * @param target     the target
+     * @param fieldName  the field name
+     * @param fieldValue the field value
+     * @throws IllegalArgumentException if {@code target} is {@code null}
+     * @throws NoSuchFieldException     if the field named {@code fieldName} does not exist
+     * @throws SecurityException        the security exception
+     */
+    public static void setFieldValue(Object target, String fieldName, Object fieldValue)
+            throws IllegalArgumentException, NoSuchFieldException, SecurityException {
+        if (target == null) {
+            throw new IllegalArgumentException("target must be not null");
+        }
+
+        // get field
+        Field field = getField(target.getClass(), fieldName);
+
+        // set new value
+        setFieldValue(target, field, fieldValue);
+    }
+
+    /**
+     * modify `static` or `static final` field value
+     * <p>
+     * In java17, this method cannot be used for final fields.
+     *
+     * @param staticField the static field
+     * @param newValue    the new value
+     * @throws IllegalArgumentException if {@code staticField} is {@code null} or not a static field
+     * @throws NoSuchFieldException     if the class of the staticField has no `modifiers` field
+     * @throws IllegalAccessException   the illegal access exception
+     */
+    public static void modifyStaticFinalField(Field staticField, Object newValue)
+            throws NoSuchFieldException, IllegalAccessException {
+        if (staticField == null) {
+            throw new IllegalArgumentException("staticField must be not null");
+        }
+
+        // check is static field
+        if (!Modifier.isStatic(staticField.getModifiers())) {
+            throw new IllegalArgumentException("the `" + fieldToString(staticField) + "` is not a static field, cannot modify value.");
+        }
+
+        // remove the `final` keyword from the field
+        if (Modifier.isFinal(staticField.getModifiers())) {
+            // In java17, can't get the field `modifiers` from class `java.lang.reflect.Field`.
+            Field modifiers = staticField.getClass().getDeclaredField("modifiers");
+            modifiers.setAccessible(true);
+            modifiers.setInt(staticField, staticField.getModifiers() & ~Modifier.FINAL);
+        }
+
+        // set new value
+        staticField.setAccessible(true);
+        staticField.set(staticField.getDeclaringClass(), newValue);
+    }
+
+    /**
+     * modify `static` or `static final` field value
+     *
+     * @param targetClass     the target class
+     * @param staticFieldName the static field name
+     * @param newValue        the new value
+     * @throws IllegalArgumentException if {@code targetClass} is {@code null}
+     * @throws NullPointerException     if {@code staticFieldName} is {@code null}
+     * @throws NoSuchFieldException     if the field named {@code modifyFieldName} does not exist
+     * @throws IllegalAccessException   the illegal access exception
+     */
+    public static void modifyStaticFinalField(Class<?> targetClass, String staticFieldName, Object newValue)
+            throws NoSuchFieldException, IllegalAccessException {
+        if (targetClass == null) {
+            throw new IllegalArgumentException("targetClass must be not null");
+        }
+
+        // get field
+        Field field = targetClass.getDeclaredField(staticFieldName);
+
+        // modify static final field value
+        modifyStaticFinalField(field, newValue);
+    }
+
+    //endregion
+
+
+    //region Method
+
+    /**
+     * get method.
+     * If you want to get the public method, please use {@link Class#getMethod(String, Class[])}.
+     *
+     * @param clazz          the class
+     * @param methodName     the method name
+     * @param parameterTypes the parameter types
+     * @return the method
+     * @throws IllegalArgumentException if {@code clazz} is {@code null}
+     * @throws NullPointerException     if {@code methodName} is {@code null}
+     * @throws NoSuchMethodException    if the method named {@code methodName} does not exist
+     * @throws SecurityException        the security exception
+     */
+    public static Method getMethod(final Class<?> clazz, final String methodName, final Class<?>... parameterTypes)
+            throws NoSuchMethodException, SecurityException {
+        if (clazz == null) {
+            throw new IllegalArgumentException("clazz must be not null");
+        }
+
+        Map<String, Method> methodMap = CollectionUtils.computeIfAbsent(METHOD_CACHE, clazz, k -> new ConcurrentHashMap<>());
+
+        String cacheKey = generateMethodCacheKey(methodName, parameterTypes);
+        Method method = CollectionUtils.computeIfAbsent(methodMap, cacheKey, k -> {
+            Class<?> cl = clazz;
+            while (cl != null) {
+                try {
+                    return cl.getDeclaredMethod(methodName, parameterTypes);
+                } catch (NoSuchMethodException e) {
+                    cl = cl.getSuperclass();
+                }
+            }
+            return null;
+        });
+
+        if (method == null) {
+            throw new NoSuchMethodException("method not found: " + methodToString(clazz, methodName, parameterTypes));
+        }
+
+        if (!method.isAccessible()) {
+            method.setAccessible(true);
+        }
+
+        return method;
+    }
+
+    private static String generateMethodCacheKey(String methodName, Class<?>[] parameterTypes) {
+        StringBuilder key = new StringBuilder(methodName);
+        if (parameterTypes != null && parameterTypes.length > 0) {
+            key.append("|");
+            for (Class<?> parameterType : parameterTypes) {
+                key.append(parameterType.getName()).append(",");
+            }
+        }
+        return key.toString();
+    }
+
+    /**
+     * get method.
+     * If you want to get the public method, please use {@link Class#getMethod(String, Class[])}.
+     *
+     * @param clazz      the class
+     * @param methodName the method name
+     * @return the method
+     * @throws IllegalArgumentException if {@code clazz} is {@code null}
+     * @throws NullPointerException     if {@code methodName} is {@code null}
+     * @throws NoSuchMethodException    if the method named {@code methodName} does not exist
+     * @throws SecurityException        the security exception
+     */
+    public static Method getMethod(final Class<?> clazz, final String methodName)
+            throws NoSuchMethodException, SecurityException {
+        return getMethod(clazz, methodName, EMPTY_CLASS_ARRAY);
+    }
+
+    /**
+     * invoke Method
+     *
+     * @param target the target
+     * @param method the method
+     * @param args   the args
+     * @return the result of the underlying method
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws IllegalArgumentException  the illegal argument exception
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeMethod(Object target, Method method, Object... args)
+            throws InvocationTargetException, IllegalArgumentException, SecurityException {
+        while (true) {
+            if (!method.isAccessible()) {
+                method.setAccessible(true);
+            }
+            try {
+                return method.invoke(target, args);
+            } catch (IllegalAccessException ignore) {
+                // avoid other threads executing `method.setAccessible(false)`
+            }
+        }
+    }
+
+    /**
+     * invoke Method
+     *
+     * @param target the target
+     * @param method the method
+     * @return the result of the underlying method
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws IllegalArgumentException  the illegal argument exception
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeMethod(Object target, Method method)
+            throws InvocationTargetException, IllegalArgumentException, SecurityException {
+        return invokeMethod(target, method, EMPTY_ARGS);
+    }
+
+    /**
+     * invoke Method
+     *
+     * @param target         the target
+     * @param methodName     the method name
+     * @param parameterTypes the parameter types
+     * @param args           the args
+     * @return the result of the underlying method
+     * @throws IllegalArgumentException  if {@code target} is {@code null}
+     * @throws NullPointerException      if {@code methodName} is {@code null}
+     * @throws NoSuchMethodException     if the method named {@code methodName} does not exist
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeMethod(Object target, String methodName, Class<?>[] parameterTypes, Object... args)
+            throws NoSuchMethodException, InvocationTargetException, IllegalArgumentException, SecurityException {
+        if (target == null) {
+            throw new IllegalArgumentException("target must be not null");
+        }
+
+        // get method
+        Method method = getMethod(target.getClass(), methodName, parameterTypes);
+
+        // invoke method
+        return invokeMethod(target, method, args);
+    }
+
+    /**
+     * invoke Method
+     *
+     * @param target     the target
+     * @param methodName the method name
+     * @return the result of the underlying method
+     * @throws NoSuchMethodException     the no such method exception
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws IllegalArgumentException  the illegal argument exception
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeMethod(Object target, String methodName)
+            throws NoSuchMethodException, InvocationTargetException, IllegalArgumentException, SecurityException {
+        return invokeMethod(target, methodName, EMPTY_CLASS_ARRAY, EMPTY_ARGS);
+    }
+
+    /**
+     * invoke static Method
+     *
+     * @param staticMethod the static method
+     * @param args         the args
+     * @return the result of the static method
+     * @throws IllegalArgumentException  if {@code staticMethod} is {@code null} or not a static method
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeStaticMethod(Method staticMethod, Object... args)
+            throws IllegalArgumentException, InvocationTargetException, SecurityException {
+        if (staticMethod == null) {
+            throw new IllegalArgumentException("staticMethod must be not null");
+        }
+
+        if (!Modifier.isStatic(staticMethod.getModifiers())) {
+            throw new IllegalArgumentException("`" + methodToString(staticMethod) + "` is not a static method");
+        }
+
+        return invokeMethod(null, staticMethod, args);
+    }
+
+    /**
+     * invoke static Method
+     *
+     * @param staticMethod the static method
+     * @return the result of the static method
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws IllegalArgumentException  the illegal argument exception
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeStaticMethod(Method staticMethod)
+            throws InvocationTargetException, IllegalArgumentException, SecurityException {
+        return invokeStaticMethod(staticMethod, EMPTY_ARGS);
+    }
+
+    /**
+     * invoke static Method
+     *
+     * @param targetClass      the target class
+     * @param staticMethodName the static method name
+     * @param parameterTypes   the parameter types
+     * @param args             the args
+     * @return the result of the static method
+     * @throws IllegalArgumentException  if {@code targetClass} is {@code null}
+     * @throws NullPointerException      if {@code methodName} is {@code null}
+     * @throws NoSuchMethodException     the no such method exception
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeStaticMethod(Class<?> targetClass, String staticMethodName,
+                                            Class<?>[] parameterTypes, Object... args)
+            throws IllegalArgumentException, NoSuchMethodException, InvocationTargetException, SecurityException {
+        if (targetClass == null) {
+            throw new IllegalArgumentException("targetClass must be not null");
+        }
+
+        // get method
+        Method staticMethod = getMethod(targetClass, staticMethodName, parameterTypes);
+        if (!Modifier.isStatic(staticMethod.getModifiers())) {
+            throw new NoSuchMethodException("static method not found: "
+                    + methodToString(targetClass, staticMethodName, parameterTypes));
+        }
+
+        return invokeStaticMethod(staticMethod, args);
+    }
+
+    /**
+     * invoke static Method
+     *
+     * @param targetClass      the target class
+     * @param staticMethodName the static method name
+     * @return the result of the static method
+     * @throws IllegalArgumentException  if {@code targetClass} is {@code null}
+     * @throws NullPointerException      if {@code methodName} is {@code null}
+     * @throws NoSuchMethodException     the no such method exception
+     * @throws InvocationTargetException if the underlying method throws an exception.
+     * @throws SecurityException         the security exception
+     */
+    public static Object invokeStaticMethod(Class<?> targetClass, String staticMethodName)
+            throws IllegalArgumentException, NoSuchMethodException, SecurityException, InvocationTargetException {
+        return invokeStaticMethod(targetClass, staticMethodName, EMPTY_CLASS_ARRAY, EMPTY_ARGS);
+    }
+
+    //endregion
+
+
+    //region Annotation
+
+    /**
+     * get annotation values
+     *
+     * @param annotation the annotation
+     * @throws NoSuchFieldException the no such field exception
+     */
+    public static Map<String, Object> getAnnotationValues(Annotation annotation) throws NoSuchFieldException {
+        InvocationHandler h = Proxy.getInvocationHandler(annotation);
+        return (Map<String, Object>)getFieldValue(h, "memberValues");
+    }
+
+    //endregion
+
+
+    //region toString
+
+    /**
+     * class to string
+     *
+     * @param clazz the class
+     * @return the string
+     */
+    public static String classToString(Class<?> clazz) {
+        return "Class<" + clazz.getSimpleName() + ">";
+    }
+
+    /**
+     * field to string
+     *
+     * @param clazz     the clazz
+     * @param fieldName the field name
+     * @param fieldType the field type
+     * @return the string
+     */
+    public static String fieldToString(Class<?> clazz, String fieldName, Class<?> fieldType) {
+        return "Field<" + clazz.getSimpleName() + ".(" + fieldType.getSimpleName() + " " + fieldName + ")>";
+    }
+
+    /**
+     * field to string
+     *
+     * @param field the field
+     * @return the string
+     */
+    public static String fieldToString(Field field) {
+        return fieldToString(field.getDeclaringClass(), field.getName(), field.getType());
+    }
+
+    /**
+     * method to string
+     *
+     * @param clazz          the clazz
+     * @param methodName     the method name
+     * @param parameterTypes the parameter types
+     * @return the string
+     */
+    public static String methodToString(Class<?> clazz, String methodName, Class<?>... parameterTypes) {
+        return "Method<" + clazz.getSimpleName() + "." + methodName + parameterTypesToString(parameterTypes) + ">";
+    }
+
+    /**
+     * method to string
+     *
+     * @param method the method
+     * @return the string
+     */
+    public static String methodToString(Method method) {
+        String methodStr = method.getDeclaringClass().getSimpleName() + "." + method.getName()
+                + parameterTypesToString(method.getParameterTypes());
+        if (Modifier.isStatic(method.getModifiers())) {
+            methodStr = "static " + methodStr;
+        }
+        return "Method<" + methodStr + ">";
+    }
+
+    /**
+     * annotatio to string
+     *
+     * @param annotation the annotation
+     * @return the string
+     */
+    public static String annotationToString(Annotation annotation) {
+        if (annotation == null) {
+            return "null";
+        }
+
+        String annoStr = annotation.toString();
+        String annoValueStr = annoStr.substring(annoStr.indexOf('('));
+        return "@" + annotation.annotationType().getSimpleName() + annoValueStr;
+    }
+
+    /**
+     * parameter types to string
+     *
+     * @param parameterTypes the parameter types
+     * @return the string
+     */
+    public static String parameterTypesToString(Class<?>[] parameterTypes) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("(");
+        if (parameterTypes != null) {
+            for (int i = 0; i < parameterTypes.length; i++) {
+                if (i > 0) {
+                    sb.append(", ");
+                }
+                Class<?> c = parameterTypes[i];
+                sb.append((c == null) ? "null" : c.getSimpleName());
+            }
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+
+    //endregion
+}

+ 60 - 0
common/src/main/java/io/seata/common/util/SizeUtil.java

@@ -0,0 +1,60 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+/**
+ * @author chd
+ */
+public class SizeUtil {
+    private static final long RADIX = 1024;
+    /**
+     * case size to byte length
+     * example:
+     *   2k => 2 * 1024
+     *   2m => 2 * 1024 * 1024
+     *   2g => 2 * 1024 * 1024 * 1024
+     *   2t => 2 * 1024 * 1024 * 1024 * 1024
+     * @param size the string size with unit
+     * @return the byte length
+     */
+    public static long size2Long(String size) {
+        if (null == size || size.length() <= 1) {
+            throw new IllegalArgumentException("could not convert '" + size + "' to byte length");
+        }
+
+        String size2Lower = size.toLowerCase();
+        char unit = size2Lower.charAt(size.length() - 1);
+        long number;
+        try {
+            number = NumberUtils.toLong(size2Lower.substring(0, size.length() - 1));
+        } catch (NumberFormatException | NullPointerException ex) {
+            throw new IllegalArgumentException("could not convert '" + size + "' to byte length");
+        }
+
+        switch (unit) {
+            case 'k':
+                return number * RADIX;
+            case 'm':
+                return number * RADIX * RADIX;
+            case 'g':
+                return number * RADIX * RADIX * RADIX;
+            case 't':
+                return number * RADIX * RADIX * RADIX * RADIX;
+            default:
+                throw new IllegalArgumentException("could not convert '" + size + "' to byte length");
+        }
+    }
+}

+ 107 - 0
common/src/main/java/io/seata/common/util/StringFormatUtils.java

@@ -0,0 +1,107 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+/**
+ * @author xingfudeshi@gmail.com
+ */
+public class StringFormatUtils {
+    private static final char MINUS = '-';
+    private static final char UNDERLINE = '_';
+    public static final char DOT = '.';
+
+    /**
+     * camelTo underline format
+     *
+     * @param param
+     * @return formatted string
+     */
+    public static String camelToUnderline(String param) {
+        if (param == null || "".equals(param.trim())) {
+            return "";
+        }
+        int len = param.length();
+        StringBuilder sb = new StringBuilder(len);
+        for (int i = 0; i < len; i++) {
+            char c = param.charAt(i);
+            if (Character.isUpperCase(c)) {
+                sb.append(UNDERLINE);
+                sb.append(Character.toLowerCase(c));
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * underline to camel
+     *
+     * @param param
+     * @return formatted string
+     */
+    public static String underlineToCamel(String param) {
+        return formatCamel(param, UNDERLINE);
+    }
+
+    /**
+     * minus to camel
+     *
+     * @param param
+     * @return formatted string
+     */
+    public static String minusToCamel(String param) {
+        return formatCamel(param, MINUS);
+    }
+
+    /**
+     * dot to camel
+     *
+     * @param param
+     * @return formatted string
+     */
+    public static String dotToCamel(String param) {
+        return formatCamel(param, DOT);
+    }
+
+    /**
+     * format camel
+     *
+     * @param param
+     * @param sign
+     * @return formatted string
+     */
+    private static String formatCamel(String param, char sign) {
+        if (param == null || "".equals(param.trim())) {
+            return "";
+        }
+        int len = param.length();
+        StringBuilder sb = new StringBuilder(len);
+        for (int i = 0; i < len; i++) {
+            char c = param.charAt(i);
+            if (c == sign) {
+                if (++i < len) {
+                    sb.append(Character.toUpperCase(param.charAt(i)));
+                }
+            } else {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
+
+
+}

+ 352 - 0
common/src/main/java/io/seata/common/util/StringUtils.java

@@ -0,0 +1,352 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import io.seata.common.Constants;
+import io.seata.common.exception.ShouldNeverHappenException;
+
+/**
+ * The type String utils.
+ *
+ * @author slievrly
+ * @author Geng Zhang
+ */
+public class StringUtils {
+
+    private static final Pattern CAMEL_PATTERN = Pattern.compile("[A-Z]");
+    private static final Pattern LINE_PATTERN = Pattern.compile("-(\\w)");
+
+    private StringUtils() {
+    }
+
+    /**
+     * empty string
+     */
+    public static final String EMPTY = "";
+
+    /**
+     * Space string
+     */
+    public static final String SPACE = " ";
+
+    /**
+     * Is empty boolean.
+     *
+     * @param str the str
+     * @return the boolean
+     */
+    public static boolean isNullOrEmpty(String str) {
+        return (str == null) || (str.isEmpty());
+    }
+
+    /**
+     * Is blank string ?
+     *
+     * @param str the str
+     * @return boolean boolean
+     */
+    public static boolean isBlank(String str) {
+        int length;
+
+        if ((str == null) || ((length = str.length()) == 0)) {
+            return true;
+        }
+        for (int i = 0; i < length; i++) {
+            if (!Character.isWhitespace(str.charAt(i))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Is Not blank string ?
+     *
+     * @param str the str
+     * @return boolean boolean
+     */
+    public static boolean isNotBlank(String str) {
+        return !isBlank(str);
+    }
+
+    /**
+     * Equals boolean.
+     *
+     * @param a the a
+     * @param b the b
+     * @return boolean
+     */
+    public static boolean equals(String a, String b) {
+        if (a == null) {
+            return b == null;
+        }
+        return a.equals(b);
+    }
+
+    /**
+     * Equals ignore case boolean.
+     *
+     * @param a the a
+     * @param b the b
+     * @return the boolean
+     */
+    public static boolean equalsIgnoreCase(String a, String b) {
+        if (a == null) {
+            return b == null;
+        }
+        return a.equalsIgnoreCase(b);
+    }
+
+    /**
+     * Input stream 2 string string.
+     *
+     * @param is the is
+     * @return the string
+     */
+    public static String inputStream2String(InputStream is) {
+        if (is == null) {
+            return null;
+        }
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            int i;
+            while ((i = is.read()) != -1) {
+                baos.write(i);
+            }
+            return baos.toString(Constants.DEFAULT_CHARSET_NAME);
+        } catch (Exception e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    /**
+     * Input stream to byte array
+     *
+     * @param is the is
+     * @return the byte array
+     */
+    public static byte[] inputStream2Bytes(InputStream is) {
+        if (is == null) {
+            return null;
+        }
+        try {
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            int i;
+            while ((i = is.read()) != -1) {
+                baos.write(i);
+            }
+            return baos.toByteArray();
+        } catch (Exception e) {
+            throw new ShouldNeverHappenException(e);
+        }
+    }
+
+    /**
+     * Object.toString()
+     *
+     * @param obj the obj
+     * @return string string
+     */
+    @SuppressWarnings("deprecation")
+    public static String toString(final Object obj) {
+        if (obj == null) {
+            return "null";
+        }
+
+        //region Convert simple types to String directly
+
+        if (obj instanceof CharSequence) {
+            return "\"" + obj + "\"";
+        }
+        if (obj instanceof Character) {
+            return "'" + obj + "'";
+        }
+        if (obj instanceof Date) {
+            Date date = (Date)obj;
+            long time = date.getTime();
+            String dateFormat;
+            if (date.getHours() == 0 && date.getMinutes() == 0 && date.getSeconds() == 0 && time % 1000 == 0) {
+                dateFormat = "yyyy-MM-dd";
+            } else if (time % (60 * 1000) == 0) {
+                dateFormat = "yyyy-MM-dd HH:mm";
+            } else if (time % 1000 == 0) {
+                dateFormat = "yyyy-MM-dd HH:mm:ss";
+            } else {
+                dateFormat = "yyyy-MM-dd HH:mm:ss.SSS";
+            }
+            return new SimpleDateFormat(dateFormat).format(obj);
+        }
+        if (obj instanceof Enum) {
+            return obj.getClass().getSimpleName() + "." + ((Enum)obj).name();
+        }
+        if (obj instanceof Class) {
+            return ReflectionUtil.classToString((Class<?>)obj);
+        }
+        if (obj instanceof Field) {
+            return ReflectionUtil.fieldToString((Field)obj);
+        }
+        if (obj instanceof Method) {
+            return ReflectionUtil.methodToString((Method)obj);
+        }
+        if (obj instanceof Annotation) {
+            return ReflectionUtil.annotationToString((Annotation)obj);
+        }
+
+        //endregion
+
+        //region Convert the Collection and Map
+
+        if (obj instanceof Collection) {
+            return CollectionUtils.toString((Collection<?>)obj);
+        }
+        if (obj.getClass().isArray()) {
+            return ArrayUtils.toString(obj);
+        }
+        if (obj instanceof Map) {
+            return CollectionUtils.toString((Map<?, ?>)obj);
+        }
+
+        //endregion
+
+        //the jdk classes
+        if (obj.getClass().getClassLoader() == null) {
+            return obj.toString();
+        }
+
+        return CycleDependencyHandler.wrap(obj, o -> {
+            StringBuilder sb = new StringBuilder(32);
+
+            // handle the anonymous class
+            String classSimpleName;
+            if (obj.getClass().isAnonymousClass()) {
+                if (!obj.getClass().getSuperclass().equals(Object.class)) {
+                    classSimpleName = obj.getClass().getSuperclass().getSimpleName();
+                } else {
+                    classSimpleName = obj.getClass().getInterfaces()[0].getSimpleName();
+                }
+                // Connect a '$', different from ordinary class
+                classSimpleName += "$";
+            } else {
+                classSimpleName = obj.getClass().getSimpleName();
+            }
+
+            sb.append(classSimpleName).append("(");
+            final int initialLength = sb.length();
+
+            // Gets all fields, excluding static or synthetic fields
+            Field[] fields = ReflectionUtil.getAllFields(obj.getClass());
+            for (Field field : fields) {
+                field.setAccessible(true);
+
+                if (sb.length() > initialLength) {
+                    sb.append(", ");
+                }
+                sb.append(field.getName());
+                sb.append("=");
+                try {
+                    Object f = field.get(obj);
+                    if (f == obj) {
+                        sb.append("(this ").append(f.getClass().getSimpleName()).append(")");
+                    } else {
+                        sb.append(toString(f));
+                    }
+                } catch (Exception ignore) {
+                }
+            }
+
+            sb.append(")");
+            return sb.toString();
+        });
+    }
+
+    /**
+     * Trim string to null if empty("").
+     *
+     * @param str the String to be trimmed, may be null
+     * @return the trimmed String
+     */
+    public static String trimToNull(final String str) {
+        final String ts = trim(str);
+        return isEmpty(ts) ? null : ts;
+    }
+
+    /**
+     * Trim string, or null if string is null.
+     *
+     * @param str the String to be trimmed, may be null
+     * @return the trimmed string, {@code null} if null String input
+     */
+    public static String trim(final String str) {
+        return str == null ? null : str.trim();
+    }
+
+    /**
+     * Checks if a CharSequence is empty ("") or null.
+     *
+     * @param cs the CharSequence to check, may be null
+     * @return {@code true} if the CharSequence is empty or null
+     */
+    public static boolean isEmpty(final CharSequence cs) {
+        return cs == null || cs.length() == 0;
+    }
+
+    /**
+     * Checks if a CharSequence is not empty ("") and not null.
+     *
+     * @param cs the CharSequence to check, may be null
+     * @return {@code true} if the CharSequence is not empty and not null
+     */
+    public static boolean isNotEmpty(final CharSequence cs) {
+        return !isEmpty(cs);
+    }
+
+    /**
+     * hump to Line or line to hump, only spring environment use
+     * 
+     * @param str str
+     * @return string string
+     */
+    public static String hump2Line(String str) {
+        Matcher matcher = CAMEL_PATTERN.matcher(str);
+        StringBuffer sb = new StringBuffer();
+        if (matcher.find()) {
+            matcher.appendReplacement(sb, "-" + matcher.group(0).toLowerCase());
+            while (matcher.find()) {
+                matcher.appendReplacement(sb, "-" + matcher.group(0).toLowerCase());
+            }
+        } else {
+            matcher = LINE_PATTERN.matcher(str);
+            while (matcher.find()) {
+                matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
+            }
+        }
+        matcher.appendTail(sb);
+        return sb.toString();
+    }
+
+}

+ 62 - 0
common/src/test/java/io/seata/common/BranchDO.java

@@ -0,0 +1,62 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common;
+
+import java.util.Date;
+
+/**
+ * The branch do for test
+ * @author wangzhongxiang
+ */
+public class BranchDO {
+    private String xid;
+    private Long transactionId;
+    private Integer status;
+    private Double test;
+    private Date gmtCreate;
+
+    public String getXid() {
+        return xid;
+    }
+
+    public Long getTransactionId() {
+        return transactionId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public Double getTest() {
+        return test;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public BranchDO() {
+    }
+
+    public BranchDO(String xid, Long transactionId, Integer status, Double test,
+            Date gmtCreate) {
+        this.xid = xid;
+        this.transactionId = transactionId;
+        this.status = status;
+        this.test = test;
+        this.gmtCreate = gmtCreate;
+    }
+}

+ 79 - 0
common/src/test/java/io/seata/common/XIDTest.java

@@ -0,0 +1,79 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common;
+
+import java.util.Random;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The type Xid test.
+ *
+ * @author Otis.z
+ */
+public class XIDTest {
+
+    /**
+     * Test set ip address.
+     */
+    @Test
+    public void testSetIpAddress() {
+        XID.setIpAddress("127.0.0.1");
+        assertThat(XID.getIpAddress()).isEqualTo("127.0.0.1");
+    }
+
+    /**
+     * Test set port.
+     */
+    @Test
+    public void testSetPort() {
+        XID.setPort(8080);
+        assertThat(XID.getPort()).isEqualTo(8080);
+    }
+
+    /**
+     * Test generate xid.
+     */
+    @Test
+    public void testGenerateXID() {
+        long tranId = new Random().nextLong();
+        XID.setPort(8080);
+        XID.setIpAddress("127.0.0.1");
+        assertThat(XID.generateXID(tranId)).isEqualTo(XID.getIpAddress() + ":" + XID.getPort() + ":" + tranId);
+    }
+
+    /**
+     * Test get transaction id.
+     */
+    @Test
+    public void testGetTransactionId() {
+        assertThat(XID.getTransactionId(null)).isEqualTo(-1);
+        assertThat(XID.getTransactionId("127.0.0.1:8080:8577662204289747564")).isEqualTo(8577662204289747564L);
+    }
+
+    /**
+     * Test get ipAddress:port
+     */
+    @Test
+    public void testGetIpAddressAndPort() {
+        XID.setPort(8080);
+        XID.setIpAddress("127.0.0.1");
+        Assertions.assertEquals("127.0.0.1:8080",XID.getIpAddressAndPort());
+    }
+}

+ 58 - 0
common/src/test/java/io/seata/common/exception/DataAccessExceptionTest.java

@@ -0,0 +1,58 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The dataAccess exception.
+ *
+ * @author lzf971107
+ */
+public class DataAccessExceptionTest {
+
+    @Test
+    public void testConstructorWithFrameworkErrorCode() {
+        exceptionAsserts(new DataAccessException(FrameworkErrorCode.UnknownAppError));
+    }
+
+    @Test
+    public void testConstructorWithMessage() {
+        exceptionAsserts(new DataAccessException(FrameworkErrorCode.UnknownAppError.getErrMessage()));
+    }
+
+    @Test
+    public void testConstructorWithMessageAndFrameworkErrorCode() {
+        exceptionAsserts(new DataAccessException(FrameworkErrorCode.UnknownAppError.getErrMessage(), FrameworkErrorCode.UnknownAppError));
+    }
+
+    @Test
+    public void testConstructorWithCauseExceptionMessageAndFrameworkErrorCode() {
+        exceptionAsserts(new DataAccessException(new Throwable(), FrameworkErrorCode.UnknownAppError.getErrMessage(), FrameworkErrorCode.UnknownAppError));
+    }
+
+    @Test
+    public void testConstructorWithThrowable() {
+        exceptionAsserts(new DataAccessException(new Throwable(FrameworkErrorCode.UnknownAppError.getErrMessage())));
+    }
+
+    private static void exceptionAsserts(DataAccessException exception) {
+        assertThat(exception).isInstanceOf(DataAccessException.class).hasMessage(FrameworkErrorCode.UnknownAppError.getErrMessage());
+        assertThat(exception.getErrcode()).isEqualTo(FrameworkErrorCode.UnknownAppError);
+    }
+}

+ 47 - 0
common/src/test/java/io/seata/common/exception/EurekaRegistryExceptionTest.java

@@ -0,0 +1,47 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The eurekaRegistry exception.
+ *
+ * @author lzf971107
+ */
+public class EurekaRegistryExceptionTest {
+
+    @Test
+    public void testConstructorWithMessage() {
+        exceptionAsserts(new EurekaRegistryException(FrameworkErrorCode.UnknownAppError.getErrMessage()));
+    }
+
+    @Test
+    public void testConstructorWithMessageAndThrowable() {
+        exceptionAsserts(new EurekaRegistryException(FrameworkErrorCode.UnknownAppError.getErrMessage(), new Throwable()));
+    }
+
+    @Test
+    public void testConstructorWithThrowable() {
+        assertThat(new EurekaRegistryException(new Throwable(FrameworkErrorCode.UnknownAppError.getErrMessage()))).isInstanceOf(EurekaRegistryException.class).hasMessage("java.lang.Throwable: " + FrameworkErrorCode.UnknownAppError.getErrMessage());
+    }
+
+    private static void exceptionAsserts(EurekaRegistryException exception) {
+        assertThat(exception).isInstanceOf(EurekaRegistryException.class).hasMessage(FrameworkErrorCode.UnknownAppError.getErrMessage());
+    }
+}

+ 153 - 0
common/src/test/java/io/seata/common/exception/FrameworkExceptionTest.java

@@ -0,0 +1,153 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+import java.sql.SQLException;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The type Framework exception test.
+ *
+ * @author Otis.z
+ */
+public class FrameworkExceptionTest {
+
+    private Message message = new Message();
+
+    /**
+     * Test get errcode.
+     */
+    @Test
+    public void testGetErrcode() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print4();
+        });
+        assertThat(throwable).hasMessage(FrameworkErrorCode.UnknownAppError.getErrMessage());
+        assertThat(((FrameworkException)throwable).getErrcode()).isEqualTo(FrameworkErrorCode.UnknownAppError);
+    }
+
+    /**
+     * Test nested exception.
+     */
+    @Test
+    public void testNestedException() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print();
+        });
+        assertThat(throwable).hasMessage("");
+    }
+
+    /**
+     * Test nested exception 1.
+     */
+    @Test
+    public void testNestedException1() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print1();
+        });
+        assertThat(throwable).hasMessage("nestedException");
+    }
+
+    /**
+     * Test nested exception 2.
+     */
+    @Test
+    public void testNestedException2() {
+        Throwable throwable = Assertions.assertThrows(SQLException.class, () -> {
+            message.print2();
+        });
+        assertThat(throwable).hasMessageContaining("Message");
+    }
+
+    /**
+     * Test nested exception 3.
+     */
+    @Test
+    public void testNestedException3() {
+        Throwable throwable = Assertions.assertThrows(SQLException.class, () -> {
+            message.print3();
+        });
+        assertThat(throwable).hasMessageContaining("Message");
+    }
+
+    /**
+     * Test nested exception 5.
+     */
+    @Test
+    public void testNestedException5() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print5();
+        });
+        assertThat(throwable).hasMessage(FrameworkErrorCode.ExceptionCaught.getErrMessage());
+    }
+
+    /**
+     * Test nested exception 6.
+     */
+    @Test
+    public void testNestedException6() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print6();
+        });
+        assertThat(throwable).hasMessage("frameworkException");
+    }
+
+    /**
+     * Test nested exception 7.
+     */
+    @Test
+    public void testNestedException7() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print7();
+        });
+        assertThat(throwable).hasMessage("frameworkException");
+    }
+
+    /**
+     * Test nested exception 8.
+     */
+    @Test
+    public void testNestedException8() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print8();
+        });
+        assertThat(throwable).hasMessage("throw");
+    }
+
+    /**
+     * Test nested exception 9.
+     */
+    @Test
+    public void testNestedException9() {
+        Throwable throwable = Assertions.assertThrows(FrameworkException.class, () -> {
+            message.print9();
+        });
+        assertThat(throwable).hasMessage("frameworkExceptionMsg");
+    }
+
+    private static void exceptionAsserts(FrameworkException exception, String expectMessage) {
+        if (expectMessage == null) {
+            expectMessage = FrameworkErrorCode.UnknownAppError.getErrMessage();
+        }
+        assertThat(exception).isInstanceOf(FrameworkException.class).hasMessage(expectMessage);
+        assertThat(exception.getErrcode()).isEqualTo(FrameworkErrorCode.UnknownAppError);
+    }
+
+}

+ 103 - 0
common/src/test/java/io/seata/common/exception/Message.java

@@ -0,0 +1,103 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+import java.sql.SQLException;
+
+/**
+ * The type Message.
+ *
+ * @author Otis.z
+ * @since 2019 /3/1
+ */
+public class Message {
+
+    /**
+     * Print.
+     */
+    public void print() {
+        throw FrameworkException.nestedException(new Throwable(Message.class.getSimpleName()));
+    }
+
+    /**
+     * Print 1.
+     */
+    public void print1() {
+        throw FrameworkException.nestedException("nestedException", new Throwable(Message.class.getSimpleName()));
+    }
+
+    /**
+     * Print 2.
+     *
+     * @throws SQLException the sql exception
+     */
+    public void print2() throws SQLException {
+        throw FrameworkException.nestedSQLException("nestedException", new Throwable(Message.class.getSimpleName()));
+    }
+
+    /**
+     * Print 3.
+     *
+     * @throws SQLException the sql exception
+     */
+    public void print3() throws SQLException {
+        throw FrameworkException.nestedSQLException(new Throwable(Message.class.getSimpleName()));
+    }
+
+    /**
+     * Print 4.
+     */
+    public void print4() {
+        throw new FrameworkException();
+    }
+
+    /**
+     * Print 5.
+     */
+    public void print5() {
+        throw new FrameworkException(FrameworkErrorCode.ExceptionCaught);
+    }
+
+    /**
+     * Print 6.
+     */
+    public void print6() {
+        throw new FrameworkException("frameworkException", FrameworkErrorCode.InitSeataClientError);
+    }
+
+    /**
+     * Print 7.
+     */
+    public void print7() {
+        throw new FrameworkException(new Throwable("throw"), "frameworkException",
+            FrameworkErrorCode.ChannelIsNotWritable);
+    }
+
+    /**
+     * Print 8.
+     */
+    public void print8() {
+        throw new FrameworkException(new Throwable("throw"));
+    }
+
+    /**
+     * Print 9.
+     */
+    public void print9() {
+        throw new FrameworkException(new Throwable(), "frameworkExceptionMsg");
+    }
+
+}

+ 52 - 0
common/src/test/java/io/seata/common/exception/NotSupportYetExceptionTest.java

@@ -0,0 +1,52 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The notSupportYet exception.
+ *
+ * @author lzf971107
+ */
+public class NotSupportYetExceptionTest {
+
+    @Test
+    public void testConstructorWithNoParameters() {
+        assertThat(new NotSupportYetException()).isInstanceOf(NotSupportYetException.class);
+    }
+
+    @Test
+    public void testConstructorWithMessage() {
+        exceptionAsserts(new NotSupportYetException(FrameworkErrorCode.UnknownAppError.getErrMessage()));
+    }
+
+    @Test
+    public void testConstructorWithMessageAndThrowable() {
+        exceptionAsserts(new NotSupportYetException(FrameworkErrorCode.UnknownAppError.getErrMessage(), new Throwable()));
+    }
+
+    @Test
+    public void testConstructorWithThrowable() {
+        assertThat(new NotSupportYetException(new Throwable(FrameworkErrorCode.UnknownAppError.getErrMessage()))).isInstanceOf(NotSupportYetException.class).hasMessage("java.lang.Throwable: " + FrameworkErrorCode.UnknownAppError.getErrMessage());
+    }
+
+    private static void exceptionAsserts(NotSupportYetException exception) {
+        assertThat(exception).isInstanceOf(NotSupportYetException.class).hasMessage(FrameworkErrorCode.UnknownAppError.getErrMessage());
+    }
+}

+ 52 - 0
common/src/test/java/io/seata/common/exception/ShouldNeverHappenExceptionTest.java

@@ -0,0 +1,52 @@
+/*
+ *  Copyright 1999-2019 Seata.io Group.
+ *
+ *  Licensed 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.
+ */
+package io.seata.common.exception;
+
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The shouldNeverHappen exception.
+ *
+ * @author lzf971107
+ */
+public class ShouldNeverHappenExceptionTest {
+
+    @Test
+    public void testConstructorWithNoParameters() {
+        assertThat(new ShouldNeverHappenException("mock exception")).isInstanceOf(ShouldNeverHappenException.class);
+    }
+
+    @Test
+    public void testConstructorWithMessage() {
+        exceptionAsserts(new ShouldNeverHappenException(FrameworkErrorCode.UnknownAppError.getErrMessage()));
+    }
+
+    @Test
+    public void testConstructorWithMessageAndThrowable() {
+        exceptionAsserts(new ShouldNeverHappenException(FrameworkErrorCode.UnknownAppError.getErrMessage(), new Throwable()));
+    }
+
+    @Test
+    public void testConstructorWithThrowable() {
+        assertThat(new ShouldNeverHappenException(new Throwable(FrameworkErrorCode.UnknownAppError.getErrMessage()))).isInstanceOf(ShouldNeverHappenException.class).hasMessage("java.lang.Throwable: " + FrameworkErrorCode.UnknownAppError.getErrMessage());
+    }
+
+    private static void exceptionAsserts(ShouldNeverHappenException exception) {
+        assertThat(exception).isInstanceOf(ShouldNeverHappenException.class).hasMessage(FrameworkErrorCode.UnknownAppError.getErrMessage());
+    }
+}

Some files were not shown because too many files changed in this diff