Triple rest basic example (#1177)

diff --git a/.editorconfig b/.editorconfig
index 4b2c27d..a4397db 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -27,20 +27,50 @@
 trim_trailing_whitespace = true
 
 [*.java]
-ij_continuation_indent_size = 8
-ij_java_class_count_to_use_import_on_demand = 999
-ij_java_names_count_to_use_import_on_demand = 999
+ij_java_continuation_indent_size = 8
+ij_java_keep_control_statement_in_one_line = false
 ij_java_for_brace_force = always
 ij_java_if_brace_force = always
-ij_java_keep_blank_lines_before_right_brace = 1
+ij_java_keep_first_column_comment = false
+ij_java_keep_line_breaks = false
+ij_java_keep_simple_blocks_in_one_line = true
+ij_java_keep_simple_classes_in_one_line = true
+ij_java_keep_simple_lambdas_in_one_line = true
+ij_java_keep_simple_methods_in_one_line = true
 ij_java_keep_blank_lines_in_code = 1
 ij_java_keep_blank_lines_in_declarations = 1
-ij_any_blank_lines_before_class_end = 1
+ij_java_blank_lines_after_class_header = 1
+ij_java_class_count_to_use_import_on_demand = 999
+ij_java_names_count_to_use_import_on_demand = 999
+ij_java_imports_layout = org.apache.dubbo.**, |, javax.**, |, java.**, |, *, |, $*
 ij_java_insert_inner_class_imports = true
+ij_java_space_before_array_initializer_left_brace = true
+ij_java_method_parameters_new_line_after_left_paren = true
+ij_java_wrap_comments = false
+ij_java_wrap_long_lines = false
+ij_java_enum_constants_wrap = split_into_lines
+ij_java_method_call_chain_wrap = on_every_item
+ij_java_method_parameters_wrap = on_every_item
+ij_java_extends_list_wrap = normal
+ij_java_extends_keyword_wrap = normal
+ij_java_binary_operation_wrap = normal
+ij_java_binary_operation_sign_on_next_line = true
 
 [*.json]
 tab_width = 2
+indent_size = 2
+
+[*.{yml,yaml}]
+tab_width = 2
+indent_size = 2
 
 [*.xml]
 ij_xml_attribute_wrap = off
-ij_xml_keep_blank_lines = 1
\ No newline at end of file
+ij_xml_text_wrap = off
+ij_xml_keep_blank_lines = 1
+
+[pom.xml]
+indent_size = 2
+
+[*.md]
+ij_markdown_wrap_text_if_long = false
\ No newline at end of file
diff --git a/.licenserc.yaml b/.licenserc.yaml
index dd98fe8..a51a263 100644
--- a/.licenserc.yaml
+++ b/.licenserc.yaml
@@ -59,7 +59,7 @@
     - '.repository/'
     - 'compiler/**'
     - '.gitmodules'
-    - '**/.mvn/*'
+    - '**/.mvn/**'
     - 'mvnw'
     - 'mvnw.cmd'
     - 'LICENSE'
diff --git a/2-advanced/dubbo-samples-triple-http3/README.md b/2-advanced/dubbo-samples-triple-http3/README.md
new file mode 100644
index 0000000..d910901
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/README.md
@@ -0,0 +1,102 @@
+# Dubbo Triple HTTP/3 Example
+
+This example shows how to enable HTTP/3 support for triple protocol.
+
+## Benefits
+
+1. Improved Performance: HTTP/3 uses QUIC, reducing latency and enhancing connection speeds. This results in faster request-response cycles and better performance, particularly in high-latency scenarios.
+2. Enhanced Reliability: With connection migration and multiplexing, HTTP/3 prevents head-of-line blocking, ensuring stable connections even in varying network conditions.
+3. Resilience in Weak Networks: HTTP/3 is more resilient in environments with high packet loss or fluctuating bandwidth, maintaining connection quality and performance where older protocols might struggle.
+4. Better Security: HTTP/3, built on QUIC, integrates encryption by default, offering enhanced security and reducing the attack surface compared to traditional HTTP/2 implementations.
+5. Efficient Resource Usage: By minimizing the need for multiple connections and reducing handshake overhead, HTTP/3 optimizes resource utilization, lowering CPU and memory consumption on both client and server sides.
+
+## How to run
+
+Step into 'dubbo-samples-triple-http3' directory
+then, run the following command to start application:
+
+```shell
+mvn spring-boot:run
+```
+
+## Testing using curl
+
+Note that curl needs to upgrade to a new version which supports HTTP/3
+
+See: https://curl.se/docs/http3.html
+
+Run the following command to see server works as expected:
+
+```shell
+# Passing parameter via query string
+curl --http3 -vk 'https://localhost:50052/org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world'
+
+# Expected output:
+#* QUIC cipher selection: TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256
+#* Skipped certificate verification
+#* Connected to localhost (127.0.0.1) port 50052
+#* using HTTP/3
+#* [HTTP/3] [0] OPENED stream for https://localhost:50052/org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world
+#* [HTTP/3] [0] [:method: GET]
+#* [HTTP/3] [0] [:scheme: https]
+#* [HTTP/3] [0] [:authority: localhost:50052]
+#* [HTTP/3] [0] [:path: /org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world]
+#* [HTTP/3] [0] [user-agent: curl/8.7.1]
+#* [HTTP/3] [0] [accept: */*]
+#> GET /org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world HTTP/3
+#> Host: localhost:50052
+#> User-Agent: curl/8.7.1
+#> Accept: */*
+#>
+#* Request completely sent off
+#< HTTP/3 200
+#< content-type: application/json
+#<
+#"Hello world"
+```
+
+## How to enable HTTP/3 support for triple
+
+### Add maven dependencies
+
+```xml
+
+<dependencys>
+    <dependency>
+        <groupId>io.netty.incubator</groupId>
+        <artifactId>netty-incubator-codec-http3</artifactId>
+        <version>0.0.28.Final</version>
+    </dependency>
+    <!-- To support self-signed certificates, if the certificate is configured that does not require -->
+    <dependency>
+        <groupId>org.bouncycastle</groupId>
+        <artifactId>bcpkix-jdk15on</artifactId>
+        <version>1.70</version>
+    </dependency>
+</dependencys>
+```
+
+### Add the following configuration to `application.yml` to enable HTTP/3
+
+```yaml
+dubbo:
+    protocol:
+        triple:
+            http3:
+                enabled: true
+```
+
+### Disable client negotiation
+
+Since HTTP/3 is based on the QUIC protocol(UDP), it may be blocked by firewall or gateway. Therefore, HTTP/3 negotiation is enabled by default.
+The connection is first established via HTTP/2, and if successful and the provider return a [Alt-Svc](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Alt-Svc) header indicating HTTP/3 support,
+the client will automatically switch to HTTP/3. If you want to skip negotiation, you can disable the negotiation feature through configuration, though it is recommended not to disable it.
+
+```yaml
+dubbo:
+    protocol:
+        triple:
+            http3:
+                enabled: true
+                negotiate: false
+```
diff --git a/2-advanced/dubbo-samples-triple-http3/case-configuration.yml b/2-advanced/dubbo-samples-triple-http3/case-configuration.yml
new file mode 100644
index 0000000..5545ed9
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/case-configuration.yml
@@ -0,0 +1,58 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+services:
+  nacos:
+    image: nacos/nacos-server:${nacos-server.version:2.0.0}
+    environment:
+      - PREFER_HOST_MODE=hostname
+      - MODE=standalone
+      - NACOS_AUTH_ENABLE=true
+      - JVM_XMS=512m
+      - JVM_XMX=512m
+      - JVM_XMN=256m
+
+  provider:
+    type: app
+    basedir: .
+    mainClass: org.apache.dubbo.demo.ProviderApplication
+    systemProps:
+      - nacos.address=nacos
+      - nacos.port=8848
+    waitPortsBeforeRun:
+      - nacos:8848
+    checkPorts:
+      - 50052
+    checkLog: "dubbo service started"
+    depends_on:
+      - nacos
+
+  test:
+    type: test
+    basedir: .
+    tests:
+      - "**/*IT.class"
+    systemProps:
+      - nacos.address=nacos
+      - nacos.port=8848
+      - dubbo.address=provider
+    waitPortsBeforeRun:
+      - nacos:8848
+      - provider:50052
+    depends_on:
+      - nacos
+      - provider
+
diff --git a/2-advanced/dubbo-samples-triple-http3/case-versions.conf b/2-advanced/dubbo-samples-triple-http3/case-versions.conf
new file mode 100644
index 0000000..f2f919d
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/case-versions.conf
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Supported component versions of the test case
+
+# Spring app
+dubbo.version=3.3.*
+spring.version=6.*
+java.version= [>= 17]
diff --git a/2-advanced/dubbo-samples-triple-http3/pom.xml b/2-advanced/dubbo-samples-triple-http3/pom.xml
new file mode 100644
index 0000000..d2a43c0
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/pom.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<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>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>31</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.apache.dubbo</groupId>
+    <artifactId>dubbo-samples-triple-http3</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <name>Dubbo Samples Triple HTTP/3</name>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <!--<dubbo.version>3.3.0-beta.5</dubbo.version>-->
+        <dubbo.version>3.3.0-beta.6-SNAPSHOT</dubbo.version>
+        <spring-boot.version>3.2.3</spring-boot.version>
+
+        <maven_os_plugin_version>1.7.1</maven_os_plugin_version>
+        <maven_protobuf_plugin_version>0.6.1</maven_protobuf_plugin_version>
+        <protobuf-protoc_version>3.22.3</protobuf-protoc_version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-bom</artifactId>
+                <version>${dubbo.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter</artifactId>
+                <version>${spring-boot.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <artifactId>spring-boot-starter-logging</artifactId>
+                        <groupId>org.springframework.boot</groupId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
+          <exclusions>
+            <exclusion>
+              <artifactId>nacos-log4j2-adapter</artifactId>
+              <groupId>com.alibaba.nacos</groupId>
+            </exclusion>
+          </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.netty.incubator</groupId>
+            <artifactId>netty-incubator-codec-http3</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcpkix-jdk15on</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <compilerArg>-proc:none</compilerArg>
+                    </compilerArgs>
+                    <parameters>true</parameters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+                <version>${maven_os_plugin_version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>detect</goal>
+                        </goals>
+                        <phase>initialize</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <version>${maven_protobuf_plugin_version}</version>
+                <configuration>
+                    <!--suppress UnresolvedMavenProperty -->
+                    <protocArtifact>com.google.protobuf:protoc:${protobuf-protoc_version}:exe:${os.detected.classifier}</protocArtifact>
+                    <pluginId>triple-java</pluginId>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>apache.snapshots.https</id>
+            <name>Apache Development Snapshot Repository</name>
+            <url>https://repository.apache.org/content/repositories/snapshots</url>
+            <layout>default</layout>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>daily</updatePolicy>
+            </snapshots>
+        </repository>
+    </repositories>
+</project>
diff --git a/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterService.java b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterService.java
new file mode 100644
index 0000000..debbc19
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterService.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.demo.pb.HelloReply;
+import org.apache.dubbo.demo.pb.HelloRequest;
+
+import java.util.concurrent.CompletableFuture;
+
+public interface GreeterService {
+
+    /**
+     * Sends a greeting
+     */
+    HelloReply sayHello(HelloRequest request);
+
+    /**
+     * Sends a greeting asynchronously
+     */
+    CompletableFuture<String> sayHelloAsync(String request);
+
+    /**
+     * Sends a greeting with server streaming
+     */
+    void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver);
+
+    /**
+     * Sends greetings with bi streaming
+     */
+    StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver);
+}
diff --git a/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterServiceImpl.java b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterServiceImpl.java
new file mode 100644
index 0000000..61e998c
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterServiceImpl.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.apache.dubbo.demo.pb.HelloReply;
+import org.apache.dubbo.demo.pb.HelloRequest;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DubboService
+public class GreeterServiceImpl implements GreeterService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GreeterServiceImpl.class);
+
+    @Override
+    public HelloReply sayHello(HelloRequest request) {
+        LOGGER.info("Received sayHello request: {}", request.getName());
+        return toReply("Hello " + request.getName());
+    }
+
+    @Override
+    public CompletableFuture<String> sayHelloAsync(String request) {
+        LOGGER.info("Received sayHelloAsync request: {}", request);
+        return CompletableFuture.supplyAsync(() -> "Hello " + request);
+    }
+
+    @Override
+    public void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloServerStream request");
+        for (int i = 1; i < 6; i++) {
+            LOGGER.info("sayHelloServerStream onNext: {} {} times", request.getName(), i);
+            responseObserver.onNext(toReply("Hello " + request.getName()));
+        }
+        LOGGER.info("sayHelloServerStream onCompleted");
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloBiStream request");
+        return new StreamObserver<>() {
+            @Override
+            public void onNext(HelloRequest request) {
+                LOGGER.info("sayHelloBiStream onNext: {}", request.getName());
+                responseObserver.onNext(toReply("Hello " + request.getName()));
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                LOGGER.error("sayHelloBiStream onError", throwable);
+            }
+
+            @Override
+            public void onCompleted() {
+                LOGGER.info("sayHelloBiStream onCompleted");
+                responseObserver.onCompleted();
+            }
+        };
+    }
+
+    private static HelloReply toReply(String message) {
+        return HelloReply.newBuilder().setMessage(message).build();
+    }
+}
diff --git a/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterWrapperService.java b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterWrapperService.java
new file mode 100644
index 0000000..958ff94
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterWrapperService.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+
+import java.util.concurrent.CompletableFuture;
+
+public interface GreeterWrapperService {
+
+    /**
+     * Sends a greeting
+     */
+    HelloReply sayHello(HelloRequest request);
+
+    /**
+     * Sends a greeting asynchronously
+     */
+    CompletableFuture<String> sayHelloAsync(String request);
+
+    /**
+     * Sends a greeting with server streaming
+     */
+    void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver);
+
+    /**
+     * Sends greetings with bi streaming
+     */
+    StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver);
+}
diff --git a/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterWrapperServiceImpl.java b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterWrapperServiceImpl.java
new file mode 100644
index 0000000..ecd99da
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/GreeterWrapperServiceImpl.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboService;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DubboService
+public class GreeterWrapperServiceImpl implements GreeterWrapperService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GreeterWrapperServiceImpl.class);
+
+    @Override
+    public HelloReply sayHello(HelloRequest request) {
+        LOGGER.info("Received sayHello request: {}", request.getName());
+        return toReply("Hello " + request.getName());
+    }
+
+    @Override
+    public CompletableFuture<String> sayHelloAsync(String name) {
+        LOGGER.info("Received sayHelloAsync request: {}", name);
+        return CompletableFuture.supplyAsync(() -> "Hello " + name);
+    }
+
+    @Override
+    public void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloServerStream request");
+        for (int i = 1; i < 6; i++) {
+            LOGGER.info("sayHelloServerStream onNext: {} {} times", request.getName(), i);
+            responseObserver.onNext(toReply("Hello " + request.getName()));
+        }
+        LOGGER.info("sayHelloServerStream onCompleted");
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloBiStream request");
+        return new StreamObserver<>() {
+            @Override
+            public void onNext(HelloRequest request) {
+                LOGGER.info("sayHelloBiStream onNext: {}", request.getName());
+                responseObserver.onNext(toReply("Hello " + request.getName()));
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                LOGGER.error("sayHelloBiStream onError", throwable);
+            }
+
+            @Override
+            public void onCompleted() {
+                LOGGER.info("sayHelloBiStream onCompleted");
+                responseObserver.onCompleted();
+            }
+        };
+    }
+
+    private static HelloReply toReply(String message) {
+        HelloReply reply = new HelloReply();
+        reply.setMessage(message);
+        return reply;
+    }
+
+}
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/HelloReply.java
similarity index 65%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/HelloReply.java
index 1a58d84..c958ab7 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/HelloReply.java
@@ -14,18 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.dubbo.demo;
 
-package org.apache.dubbo.rest.demo.test;
+import java.io.Serial;
+import java.io.Serializable;
 
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+public class HelloReply implements Serializable {
 
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    private String message;
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/HelloRequest.java
similarity index 65%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/HelloRequest.java
index 1a58d84..0a45faa 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/HelloRequest.java
@@ -14,18 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.dubbo.demo;
 
-package org.apache.dubbo.rest.demo.test;
+import java.io.Serial;
+import java.io.Serializable;
 
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+public class HelloRequest implements Serializable {
 
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/ProviderApplication.java
similarity index 85%
rename from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
rename to 2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/ProviderApplication.java
index 1a58d84..f3d81ce 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/java/org/apache/dubbo/demo/ProviderApplication.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.dubbo.rest.demo.test;
+package org.apache.dubbo.demo;
 
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 @EnableDubbo
-public class ConsumerApplication {
+public class ProviderApplication {
 
     public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+        SpringApplication.run(ProviderApplication.class, args);
+        System.out.println("dubbo service started");
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-http3/src/main/proto/helloworld.proto b/2-advanced/dubbo-samples-triple-http3/src/main/proto/helloworld.proto
new file mode 100644
index 0000000..eaa831b
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/proto/helloworld.proto
@@ -0,0 +1,29 @@
+// 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.
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "org.apache.dubbo.demo.pb";
+option java_outer_classname = "HelloWorldProto";
+option objc_class_prefix = "HLW";
+
+package helloworld;
+
+// The request message containing the user's name.
+message HelloRequest {
+    string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+    string message = 1;
+}
diff --git a/2-advanced/dubbo-samples-triple-http3/src/main/resources/application.yml b/2-advanced/dubbo-samples-triple-http3/src/main/resources/application.yml
new file mode 100644
index 0000000..1278036
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/resources/application.yml
@@ -0,0 +1,36 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spring:
+  application:
+    name: dubbo-springboot-triple-http3
+dubbo:
+  application:
+    name: ${spring.application.name}
+    qos-enable: false
+    enable-file-cache: false
+  protocol:
+    name: tri
+    port: 50052
+    triple:
+      verbose: true
+      http3:
+        enabled: true
+        negotiation: false
+  registry:
+    address: nacos://${nacos.address:127.0.0.1}:8848
+    username: nacos
+    password: nacos
diff --git a/2-advanced/dubbo-samples-triple-http3/src/main/resources/log4j2.xml b/2-advanced/dubbo-samples-triple-http3/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..f21b6cb
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/main/resources/log4j2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="%style{%d{HH:mm:ss.SSS}}{Magenta} %style{|-}{White}%highlight{%-5p} [%t] %style{%40.40c}{Cyan}:%style{%-3L}{Blue} %style{-|}{White} %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect)}" disableAnsi="false" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+        <Logger name="org.apache.dubbo.rpc.protocol.tri" level="debug"/>
+        <Logger name="org.apache.dubbo.remoting.http12" level="debug"/>
+        <Logger name="org.apache.dubbo.config" level="warn"/>
+    </Loggers>
+</Configuration>
diff --git a/2-advanced/dubbo-samples-triple-http3/src/test/java/org/apache/dubbo/demo/ConsumerIT.java b/2-advanced/dubbo-samples-triple-http3/src/test/java/org/apache/dubbo/demo/ConsumerIT.java
new file mode 100644
index 0000000..f3bd098
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/test/java/org/apache/dubbo/demo/ConsumerIT.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.demo.pb.HelloReply;
+import org.apache.dubbo.demo.pb.HelloRequest;
+import org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@SpringBootTest(classes = {DubboAutoConfiguration.class})
+@RunWith(SpringRunner.class)
+public class ConsumerIT {
+
+    @DubboReference
+    private GreeterService greeterService;
+
+    private static org.apache.dubbo.demo.pb.HelloRequest buildRequest(String name) {
+        return HelloRequest.newBuilder().setName(name).build();
+    }
+
+    @Test
+    public void sayHello() {
+        HelloReply reply = greeterService.sayHello(buildRequest("world"));
+        Assert.assertEquals("Hello world", reply.getMessage());
+    }
+
+    @Test
+    public void sayHelloAsync() throws Exception {
+        String reply = greeterService.sayHelloAsync("world").get(1, TimeUnit.SECONDS);
+        Assert.assertEquals("Hello world", reply);
+    }
+
+    @Test
+    public void sayHelloServerStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> responseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello stream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        greeterService.sayHelloServerStream(buildRequest("stream"), responseObserver);
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+
+    @Test
+    public void sayHelloBiStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> biResponseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello biStream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        StreamObserver<HelloRequest> biRequestObserver = greeterService.sayHelloBiStream(biResponseObserver);
+        for (int i = 0; i < 5; i++) {
+            biRequestObserver.onNext(buildRequest("biStream"));
+        }
+        biRequestObserver.onCompleted();
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+}
diff --git a/2-advanced/dubbo-samples-triple-http3/src/test/java/org/apache/dubbo/demo/WrapperConsumerIT.java b/2-advanced/dubbo-samples-triple-http3/src/test/java/org/apache/dubbo/demo/WrapperConsumerIT.java
new file mode 100644
index 0000000..7c28724
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-http3/src/test/java/org/apache/dubbo/demo/WrapperConsumerIT.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@SpringBootTest(classes = {DubboAutoConfiguration.class})
+@RunWith(SpringRunner.class)
+public class WrapperConsumerIT {
+
+    @DubboReference
+    private GreeterWrapperService greeterService;
+
+    private static HelloRequest buildRequest(String name) {
+        HelloRequest request = new HelloRequest();
+        request.setName(name);
+        return request;
+    }
+
+    @Test
+    public void sayHello() {
+        HelloReply reply = greeterService.sayHello(buildRequest("world"));
+        Assert.assertEquals("Hello world", reply.getMessage());
+    }
+
+    @Test
+    public void sayHelloAsync() throws Exception {
+        String reply = greeterService.sayHelloAsync("world").get(1, TimeUnit.SECONDS);
+        Assert.assertEquals("Hello world", reply);
+    }
+
+    @Test
+    public void sayHelloServerStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> responseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello stream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        greeterService.sayHelloServerStream(buildRequest("stream"), responseObserver);
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+
+    @Test
+    public void sayHelloBiStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> biResponseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello biStream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        StreamObserver<HelloRequest> biRequestObserver = greeterService.sayHelloBiStream(biResponseObserver);
+        for (int i = 0; i < 5; i++) {
+            biRequestObserver.onNext(buildRequest("biStream"));
+        }
+        biRequestObserver.onCompleted();
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+}
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/README.md b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/README.md
new file mode 100644
index 0000000..27e95ea
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/README.md
@@ -0,0 +1,32 @@
+# Dubbo Triple Rest Basic Example
+
+This example shows how to export rest API using the built-in annotation in triple protocol.
+
+## How to run
+
+Step into 'dubbo-samples-triple-rest-basic' directory
+then, run the following command to start application:
+
+```shell
+mvn spring-boot:run
+```
+
+Run the following command to see server works as expected:
+
+```shell
+# Passing parameter via query string
+curl -i 'http://localhost:50052/org.apache.dubbo.rest.demo.DemoService/hello?name=world'
+# Expected output: "Hello world"
+# With double quotes because the default output content-type is 'application/json'
+
+# Passing parameter via body
+curl -i -H 'content-type: application/json' -d '{"title":"Mr","name":"Yang"}' 'http://localhost:50052/org.apache.dubbo.rest.demo.DemoService/helloUser'
+# Expected output: "Hello Mr. Yang"
+
+# Multiple ways to pass parameters
+curl -i -H "c: 3" -d 'name=Yang' "http://localhost:50052/org.apache.dubbo.rest.demo.DemoService/hi.txt?title=Mr"
+# Expected output: Hello Mr. Yang, 3
+# No double quotes because we specify the output content-type is 'text/plain' by suffixing '.txt'
+```
+
+Or, you can visit the following link by using web browser: `http://localhost:50052/demo/hello?name=world`
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/case-configuration.yml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/case-configuration.yml
new file mode 100644
index 0000000..e981c8c
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/case-configuration.yml
@@ -0,0 +1,36 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+services:
+  provider:
+    type: app
+    basedir: .
+    mainClass: org.apache.dubbo.rest.demo.BasicRestApplication
+    checkPorts:
+      - 50052
+    checkLog: "dubbo service started"
+
+  test:
+    type: test
+    basedir: .
+    tests:
+      - "**/*IT.class"
+    systemProps:
+      - dubbo.address=provider
+    waitPortsBeforeRun:
+      - provider:50052
+    depends_on:
+      - provider
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/case-versions.conf b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/case-versions.conf
new file mode 100644
index 0000000..f2f919d
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/case-versions.conf
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Supported component versions of the test case
+
+# Spring app
+dubbo.version=3.3.*
+spring.version=6.*
+java.version= [>= 17]
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/pom.xml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/pom.xml
new file mode 100644
index 0000000..8f65e62
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/pom.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<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>
+  <parent>
+    <artifactId>dubbo-samples-triple-rest</artifactId>
+    <groupId>org.apache.dubbo</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>dubbo-samples-triple-rest-basic</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.dubbo</groupId>
+      <artifactId>dubbo-spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-log4j2</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-web</artifactId>
+      <version>6.1.5</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/BasicRestApplication.java
similarity index 84%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/BasicRestApplication.java
index 1a58d84..0545fc0 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/BasicRestApplication.java
@@ -15,17 +15,19 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.rest.demo.test;
+package org.apache.dubbo.rest.demo;
 
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 @EnableDubbo
-public class ConsumerApplication {
+public class BasicRestApplication {
 
     public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+        SpringApplication.run(BasicRestApplication.class, args);
+        System.out.println("dubbo service started");
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
similarity index 61%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
index 1a58d84..65feeb1 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
@@ -15,17 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.rest.demo.test;
+package org.apache.dubbo.rest.demo;
 
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.apache.dubbo.remoting.http12.HttpMethods;
+import org.apache.dubbo.remoting.http12.rest.Mapping;
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.apache.dubbo.remoting.http12.rest.ParamType;
 
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
+public interface DemoService {
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
-    }
+    String hello(String name);
+
+    @Mapping(path = "/hi", method = HttpMethods.POST)
+    String hello(User user, @Param(value = "c", type = ParamType.Header) int count);
+
+    @Mapping
+    String helloUser(User user);
+
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
similarity index 60%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
index 1a58d84..21e9b03 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
@@ -15,17 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.rest.demo.test;
+package org.apache.dubbo.rest.demo;
 
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.apache.dubbo.config.annotation.DubboService;
 
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
+@DubboService
+public class DemoServiceImpl implements DemoService {
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    @Override
+    public String hello(String name) {
+        return "Hello " + name;
+    }
+
+    @Override
+    public String hello(User user, int count) {
+        return "Hello " + user.getTitle() + ". " + user.getName() + ", " + count;
+    }
+
+    @Override
+    public String helloUser(User user) {
+        return "Hello " + user.getTitle() + ". " + user.getName();
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/User.java
similarity index 66%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/User.java
index 1a58d84..b2bd538 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/java/org/apache/dubbo/rest/demo/User.java
@@ -15,17 +15,27 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.rest.demo.test;
+package org.apache.dubbo.rest.demo;
 
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+public class User {
 
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
+    private String title;
+    private String name;
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    public String getTitle() {
+        return title;
     }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/resources/application.yml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/resources/application.yml
new file mode 100644
index 0000000..791aa81
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/resources/application.yml
@@ -0,0 +1,28 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spring:
+  application:
+    name: dubbo-springboot-triple-rest-basic
+dubbo:
+  application:
+    name: ${spring.application.name}
+    qos-enable: false
+  protocol:
+    name: tri
+    port: 50052
+    triple:
+      verbose: true
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/resources/log4j2.xml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..f21b6cb
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/main/resources/log4j2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="%style{%d{HH:mm:ss.SSS}}{Magenta} %style{|-}{White}%highlight{%-5p} [%t] %style{%40.40c}{Cyan}:%style{%-3L}{Blue} %style{-|}{White} %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect)}" disableAnsi="false" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+        <Logger name="org.apache.dubbo.rpc.protocol.tri" level="debug"/>
+        <Logger name="org.apache.dubbo.remoting.http12" level="debug"/>
+        <Logger name="org.apache.dubbo.config" level="warn"/>
+    </Loggers>
+</Configuration>
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerIT.java
new file mode 100644
index 0000000..002c5b1
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-basic/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerIT.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.rest.demo.test;
+
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.apache.dubbo.rest.demo.DemoService;
+import org.apache.dubbo.rest.demo.User;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.http.MediaType;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestClient;
+
+@EnableDubbo
+@RunWith(SpringRunner.class)
+public class ConsumerIT {
+
+    private static final String HOST = System.getProperty("dubbo.address", "localhost");
+    private final RestClient restClient = RestClient.create();
+
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
+    private DemoService demoService;
+
+    private static String toUri(String path) {
+        return "http://" + HOST + ":50052/org.apache.dubbo.rest.demo.DemoService" + path;
+    }
+
+    @Test
+    public void helloWithRpc() {
+        String result = demoService.hello("world");
+        Assert.assertEquals("Hello world", result);
+    }
+
+    @Test
+    public void helloWithRest() {
+        String result = restClient.get().uri(toUri("/hello?name=world")).retrieve().body(String.class);
+        Assert.assertEquals("\"Hello world\"", result);
+    }
+
+    @Test
+    public void helloWithRestAdvance() {
+        MultiValueMap<String, String> data = new LinkedMultiValueMap<>();
+        data.add("name", "Yang");
+
+        String result = restClient.post()
+                .uri(toUri("/hi.txt?title=Mr"))
+                .body(data)
+                .header("c", "3")
+                .retrieve()
+                .body(String.class);
+        Assert.assertEquals("Hello Mr. Yang, 3", result);
+    }
+
+    @Test
+    public void helloWithBody() {
+        User user = new User();
+        user.setTitle("Mr");
+        user.setName("Yang");
+
+        String result = restClient.post()
+                .uri(toUri("/helloUser"))
+                .contentType(MediaType.APPLICATION_JSON)
+                .body(user)
+                .retrieve()
+                .body(String.class);
+        Assert.assertEquals("\"Hello Mr. Yang\"", result);
+    }
+}
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/README.md b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/README.md
index 71b9706..2a6f94a 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/README.md
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/README.md
@@ -1,34 +1,23 @@
 # Dubbo Triple Rest JAX-RS Example
 
-This example shows how to use Spring Web annotation to add rest-style access to triple protocol.
+This example shows how to export rest API using the jaxrs annotation in triple protocol.
 
-# How to run
+## How to run
 
-## Start Zookeeper
-This example replies on Zookeeper(3.8.0+) as service discovery registry center, so you need to run the Zookeeper server first, there are two ways to do so:
-1. [Download zookeeper binary and start it directly](https://dubbo-next.staged.apache.org/zh-cn/overview/reference/integrations/zookeeper/#本地下载)
-2. [Start zookeeper using docker](https://dubbo-next.staged.apache.org/zh-cn/overview/reference/integrations/zookeeper/#docker)
-
-## Install dependencies
-Step into 'dubbo-samples-triple-rest' directory, run the following command:
-
-```shell
-$ mvn clean install
-```
-
-## Start provider
 Step into 'dubbo-samples-triple-rest-jaxrs' directory
-
 then, run the following command to start application:
+
 ```shell
-$ mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.rest.demo.JaxrsRestApplication"
+mvn spring-boot:run
 ```
 
 Run the following command to see server works as expected:
+
 ```shell
-curl \
-    --header "Content-Type: application/json" \
-    'http://localhost:50052/demo/hello?name=world'
+# Passing parameter via query string
+curl 'http://localhost:50052/demo/hello?name=world'
+# Expected output: "Hello world"
+# With double quotes because the default output content-type is 'application/json'
 ```
 
 Or, you can visit the following link by using web browser: `http://localhost:50052/demo/hello?name=world`
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-configuration.yml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-configuration.yml
index 00f3ea3..22ee2df 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-configuration.yml
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-configuration.yml
@@ -15,30 +15,13 @@
 # limitations under the License.
 
 services:
-  nacos:
-    image: nacos/nacos-server:${nacos-server.version:2.0.0}
-    environment:
-      - PREFER_HOST_MODE=hostname
-      - MODE=standalone
-      - NACOS_AUTH_ENABLE=true
-      - JVM_XMS=512m
-      - JVM_XMX=512m
-      - JVM_XMN=256m
-
-  jaxrs-provider:
+  provider:
     type: app
     basedir: .
     mainClass: org.apache.dubbo.rest.demo.JaxrsRestApplication
-    systemProps:
-      - nacos.address=nacos
-      - nacos.port=8848
-    waitPortsBeforeRun:
-      - nacos:8848
     checkPorts:
       - 50052
-    checkLog: "Current Spring Boot Application is await..."
-    depends_on:
-      - nacos
+    checkLog: "dubbo service started"
 
   test:
     type: test
@@ -46,12 +29,8 @@
     tests:
       - "**/*IT.class"
     systemProps:
-      - nacos.address=nacos
-      - nacos.port=8848
-      - dubbo.address=jaxrs-provider
+      - dubbo.address=provider
     waitPortsBeforeRun:
-      - nacos:8848
-      - jaxrs-provider:50052
+      - provider:50052
     depends_on:
-      - nacos
-      - jaxrs-provider
+      - provider
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-versions.conf b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-versions.conf
index 82aeb45..f2f919d 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-versions.conf
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/case-versions.conf
@@ -1,21 +1,19 @@
 #
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-#   Licensed to the Apache Software Foundation (ASF) under one or more
-#   contributor license agreements.  See the NOTICE file distributed with
-#   this work for additional information regarding copyright ownership.
-#   The ASF licenses this file to You under the Apache License, Version 2.0
-#   (the "License"); you may not use this file except in compliance with
-#   the License.  You may obtain a copy of the License at
+#     http://www.apache.org/licenses/LICENSE-2.0
 #
-#       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.
 #
-#   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.
-#
-
 
 # Supported component versions of the test case
 
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/pom.xml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/pom.xml
index b3e17ff..ac71c90 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/pom.xml
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/pom.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -14,110 +15,82 @@
   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>
-        <artifactId>dubbo-samples-triple-rest</artifactId>
-        <groupId>org.apache.dubbo</groupId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
+<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>
+  <parent>
+    <artifactId>dubbo-samples-triple-rest</artifactId>
+    <groupId>org.apache.dubbo</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
 
-    <artifactId>dubbo-samples-triple-rest-jaxrs</artifactId>
+  <artifactId>dubbo-samples-triple-rest-jaxrs</artifactId>
 
-    <dependencies>
-        <!-- dubbo -->
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-spring-boot-starter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
-            <version>3.3.0-beta.2</version>
-        </dependency>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.dubbo</groupId>
+      <artifactId>dubbo-spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-log4j2</artifactId>
+    </dependency>
 
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jaxrs</artifactId>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.httpcomponents</groupId>
-                    <artifactId>httpclient</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
+    <dependency>
+      <groupId>javax.ws.rs</groupId>
+      <artifactId>javax.ws.rs-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.jboss.resteasy</groupId>
+      <artifactId>resteasy-jaxrs</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>javax.xml.bind</groupId>
+      <artifactId>jaxb-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.glassfish.jaxb</groupId>
+      <artifactId>jaxb-runtime</artifactId>
+    </dependency>
 
-        <dependency>
-            <groupId>com.sun.xml.bind</groupId>
-            <artifactId>jaxb-impl</artifactId>
-            <version>2.3.1</version>
-        </dependency>
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jackson-provider</artifactId>
-            <scope>provided</scope>
-        </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-web</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.datatype</groupId>
+      <artifactId>jackson-datatype-jsr310</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
 
-        <dependency>
-            <groupId>org.jboss.resteasy</groupId>
-            <artifactId>resteasy-jaxb-provider</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <version>2.1.1</version>
-        </dependency>
-
-        <!-- spring boot starter -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-log4j2</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <!-- For client-side test purpose, not necessary -->
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-web</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.fasterxml.jackson.datatype</groupId>
-            <artifactId>jackson-datatype-jsr310</artifactId>
-            <version>2.12.5</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <version>3.8.1</version>
-                <configuration>
-                    <compilerArgs>
-                        <arg>-parameters</arg>
-                    </compilerArgs>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
index 30a33d2..2882c27 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
@@ -32,20 +32,17 @@
 
     @GET
     @Path("/hello")
-    @Produces(MediaType.TEXT_PLAIN)
-    String hello(@QueryParam("a") Integer a, @QueryParam("name") String name);
+    String hello(@QueryParam("name") String name);
 
     @GET
     @Path("/findUserById")
     int findUserById(@QueryParam("id") Integer id);
 
-
     @POST
     @Path("/form")
     @Consumes({MediaType.APPLICATION_FORM_URLENCODED})
     Long testFormBody(@FormParam("number") Long number);
 
-
     @DELETE
     @Path("/deleteUserById/{uid}")
     @Produces(MediaType.TEXT_PLAIN)
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
index 9f83708..142eabc 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/DemoServiceImpl.java
@@ -22,8 +22,8 @@
 public class DemoServiceImpl implements DemoService {
 
     @Override
-    public String hello(Integer a, String name) {
-        return "Hello " + name + a;
+    public String hello(String name) {
+        return "Hello " + name;
     }
 
     @Override
@@ -31,7 +31,6 @@
         return id;
     }
 
-
     @Override
     public Long testFormBody(Long number) {
         return number;
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/JaxrsRestApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/JaxrsRestApplication.java
index a4430cc..224fd67 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/JaxrsRestApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/JaxrsRestApplication.java
@@ -17,15 +17,17 @@
 
 package org.apache.dubbo.rest.demo;
 
-
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 @EnableDubbo
 public class JaxrsRestApplication {
+
     public static void main(String[] args) {
         SpringApplication.run(JaxrsRestApplication.class, args);
+        System.out.println("dubbo service started");
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamReqServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamReqServiceImpl.java
index c8628ad..1909bdb 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamReqServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamReqServiceImpl.java
@@ -25,12 +25,14 @@
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.UriInfo;
+
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 @DubboService
 public class ComplexParamReqServiceImpl implements ComplexParamRequestService {
+
     @Override
     public List<User> list(List<User> users) {
         return users;
@@ -81,7 +83,6 @@
         return person.getName();
     }
 
-
     @Override
     public Person testXml(Person person) {
         return person;
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamRequestService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamRequestService.java
index 80f3315..7c7d5cb 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamRequestService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/complex/ComplexParamRequestService.java
@@ -17,7 +17,6 @@
 
 package org.apache.dubbo.rest.demo.complex;
 
-
 import org.apache.dubbo.rest.demo.pojo.Person;
 import org.apache.dubbo.rest.demo.pojo.User;
 
@@ -34,11 +33,14 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.UriInfo;
+
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 @Path("/complex")
 public interface ComplexParamRequestService {
+
     @POST
     @Path("/list")
     List<User> list(List<User> list);
@@ -55,36 +57,31 @@
     @Path("/stringMap")
     Map<String, User> stringMap(Map<String, User> userMap);
 
-
     @GET
     @Path("/testMapParam")
     @Produces({MediaType.APPLICATION_JSON})
-    @Consumes({MediaType.APPLICATION_JSON})
     List<String> testMapParam(@QueryParam("map") Map<String, String> map);
 
     @GET
     @Path("/testMapHeader")
-    @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.TEXT_PLAIN)
     String testMapHeader(@HeaderParam("headers") String headerMap);
 
-
     @POST
     @Path("/xml")
-    @Consumes(MediaType.TEXT_XML)
-    @Produces(MediaType.APPLICATION_XML)
     Person testXml(Person person);
 
-
     @GET
     @Path("/cookie")
     @Produces(MediaType.TEXT_PLAIN)
     String testCookie(@Context Cookie cookie);
+
     @POST
     @Path("/testMapForm")
     @Produces({MediaType.APPLICATION_JSON})
     @Consumes({MediaType.APPLICATION_FORM_URLENCODED})
-    List<String> testMapForm(MultivaluedMap<String,String> params);
+    List<String> testMapForm(MultivaluedMap<String, String> params);
+
     @GET
     @Path("/httpHeader")
     String testHeader(@Context HttpHeaders headers);
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ExceptionMapperServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ExceptionMapperServiceImpl.java
index ee21ff0..bbd7082 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ExceptionMapperServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ExceptionMapperServiceImpl.java
@@ -21,8 +21,9 @@
 
 import static org.apache.dubbo.rpc.protocol.tri.rest.RestConstants.EXTENSION_KEY;
 
-@DubboService(parameters = {EXTENSION_KEY,"org.apache.dubbo.rest.demo.expansion.exception.ResteasyExceptionMapper"})
-public class ExceptionMapperServiceImpl implements ExceptionMapperService{
+@DubboService(parameters = {EXTENSION_KEY, "org.apache.dubbo.rest.demo.expansion.exception.ResteasyExceptionMapper"})
+public class ExceptionMapperServiceImpl implements ExceptionMapperService {
+
     @Override
     public String testException() {
         throw new RuntimeException();
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ResteasyExceptionMapper.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ResteasyExceptionMapper.java
index 0f35710..aacf0b9 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ResteasyExceptionMapper.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/exception/ResteasyExceptionMapper.java
@@ -21,6 +21,7 @@
 import javax.ws.rs.ext.ExceptionMapper;
 
 public class ResteasyExceptionMapper implements ExceptionMapper<RuntimeException> {
+
     @Override
     public Response toResponse(RuntimeException exception) {
         return Response.status(200).entity("test-exception").build();
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java
index e64c1de..d0a48b7 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java
@@ -18,7 +18,6 @@
 package org.apache.dubbo.rest.demo.expansion.filter;
 
 import javax.ws.rs.GET;
-import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java
index 09e8c70..f1ba53d 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java
@@ -21,11 +21,12 @@
 
 import static org.apache.dubbo.rpc.protocol.tri.rest.RestConstants.EXTENSION_KEY;
 
-@DubboService(parameters = {EXTENSION_KEY,"org.apache.dubbo.rest.demo.expansion.filter.TraceFilter"})
-public class FilterServiceImpl implements FilterService{
+@DubboService(parameters = {EXTENSION_KEY, "org.apache.dubbo.rest.demo.expansion.filter.TraceFilter"})
+public class FilterServiceImpl implements FilterService {
+
     @Override
     public String testFilter(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/TraceFilter.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/TraceFilter.java
index 88466c3..0e9e49e 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/TraceFilter.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/TraceFilter.java
@@ -17,28 +17,26 @@
 
 package org.apache.dubbo.rest.demo.expansion.filter;
 
-import jakarta.annotation.Priority;
-
 import javax.ws.rs.Priorities;
 import javax.ws.rs.container.ContainerRequestContext;
 import javax.ws.rs.container.ContainerRequestFilter;
 import javax.ws.rs.container.ContainerResponseContext;
 import javax.ws.rs.container.ContainerResponseFilter;
-import java.io.IOException;
+
+import jakarta.annotation.Priority;
 
 @Priority(Priorities.USER)
 public class TraceFilter implements ContainerRequestFilter, ContainerResponseFilter {
 
     @Override
-    public void filter(ContainerRequestContext requestContext) throws IOException {
+    public void filter(ContainerRequestContext requestContext) {
         System.out.println("Request filter invoked: " + requestContext.getUriInfo().getAbsolutePath());
     }
 
     @Override
     public void filter(
-            ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext)
-            throws IOException {
-        String entity = (String)containerResponseContext.getEntity();
+            ContainerRequestContext containerRequestContext, ContainerResponseContext containerResponseContext) {
+        String entity = (String) containerResponseContext.getEntity();
         containerResponseContext.setEntity(entity + "response-filter");
         System.out.println("Response filter invoked.");
     }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/DynamicTraceInterceptor.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/DynamicTraceInterceptor.java
index 17a674c..3b5125a 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/DynamicTraceInterceptor.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/DynamicTraceInterceptor.java
@@ -17,36 +17,33 @@
 
 package org.apache.dubbo.rest.demo.expansion.intercept;
 
-import jakarta.annotation.Priority;
-
 import javax.ws.rs.Priorities;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.ext.ReaderInterceptor;
 import javax.ws.rs.ext.ReaderInterceptorContext;
 import javax.ws.rs.ext.WriterInterceptor;
 import javax.ws.rs.ext.WriterInterceptorContext;
+
 import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
 import java.nio.charset.StandardCharsets;
 
+import jakarta.annotation.Priority;
+
 @Priority(Priorities.USER)
 public class DynamicTraceInterceptor implements ReaderInterceptor, WriterInterceptor {
 
     public DynamicTraceInterceptor() {}
 
     @Override
-    public Object aroundReadFrom(ReaderInterceptorContext readerInterceptorContext)
-            throws IOException, WebApplicationException {
+    public Object aroundReadFrom(ReaderInterceptorContext readerInterceptorContext) throws IOException, WebApplicationException {
         System.out.println("Dynamic reader interceptor invoked");
         return readerInterceptorContext.proceed();
     }
 
     @Override
-    public void aroundWriteTo(WriterInterceptorContext writerInterceptorContext)
-            throws IOException, WebApplicationException {
+    public void aroundWriteTo(WriterInterceptorContext writerInterceptorContext) throws IOException, WebApplicationException {
         System.out.println("Dynamic writer interceptor invoked");
-        String entity = (String)writerInterceptorContext.getEntity();
+        String entity = (String) writerInterceptorContext.getEntity();
         writerInterceptorContext.getOutputStream().write(entity.getBytes(StandardCharsets.UTF_8));
         writerInterceptorContext.getOutputStream().write("intercept".getBytes(StandardCharsets.UTF_8));
         writerInterceptorContext.proceed();
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/InterceptorServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/InterceptorServiceImpl.java
index cb0ebfe..737814c 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/InterceptorServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/expansion/intercept/InterceptorServiceImpl.java
@@ -21,11 +21,12 @@
 
 import static org.apache.dubbo.rpc.protocol.tri.rest.RestConstants.EXTENSION_KEY;
 
-@DubboService(parameters = {EXTENSION_KEY,"org.apache.dubbo.rest.demo.expansion.intercept.DynamicTraceInterceptor"})
-public class InterceptorServiceImpl implements InterceptorService{
+@DubboService(parameters = {EXTENSION_KEY, "org.apache.dubbo.rest.demo.expansion.intercept.DynamicTraceInterceptor"})
+public class InterceptorServiceImpl implements InterceptorService {
+
     @Override
     public String testIntercept(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/Person.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/Person.java
index 66a863a..881df00 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/Person.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/Person.java
@@ -17,11 +17,13 @@
 package org.apache.dubbo.rest.demo.pojo;
 
 import javax.xml.bind.annotation.XmlRootElement;
+
 import java.io.Serializable;
 import java.util.Objects;
 
 @XmlRootElement
 public class Person implements Serializable {
+
     private String name;
 
     public Person(String name) {
@@ -41,8 +43,8 @@
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+        if (this == o) {return true;}
+        if (o == null || getClass() != o.getClass()) {return false;}
         Person person = (Person) o;
         return Objects.equals(name, person.name);
     }
@@ -54,9 +56,7 @@
 
     @Override
     public String toString() {
-        return "Person{" +
-                "name='" + name + '\'' +
-                '}';
+        return "Person{" + "name='" + name + '\'' + '}';
     }
 
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java
index 2ccf1e2..f8498d9 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java
@@ -19,8 +19,8 @@
 import java.io.Serializable;
 import java.util.Objects;
 
-
 public class User implements Serializable {
+
     private Long id;
 
     private String name;
@@ -64,7 +64,7 @@
         User user = new User();
         user.setAge(18);
         user.setName("dubbo");
-        user.setId(404l);
+        user.setId(404L);
         return user;
     }
 
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestService.java
index 2523c35..c83c64f 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestService.java
@@ -19,6 +19,7 @@
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.QueryParam;
+
 import java.time.ZonedDateTime;
 
 @Path("/abnormal")
@@ -40,8 +41,8 @@
     @Path("/pathRepeat")
     String testPathRepeat1();
 
-//    @GET
-//    @Path("/pathRepeat")
+    //    @GET
+    //    @Path("/pathRepeat")
     String testPathRepeat2();
 
     @GET
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestServiceImpl.java
index 9167275..2234c4b 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/AbnormalRequestServiceImpl.java
@@ -17,11 +17,14 @@
 package org.apache.dubbo.rest.demo.routine;
 
 import org.apache.dubbo.config.annotation.DubboService;
+
 import javax.ws.rs.core.Application;
+
 import java.time.ZonedDateTime;
 
 @DubboService
-public class AbnormalRequestServiceImpl extends Application implements AbnormalRequestService{
+public class AbnormalRequestServiceImpl extends Application implements AbnormalRequestService {
+
     @Override
     public String testNotFound() {
         return null;
@@ -37,7 +40,6 @@
         return date;
     }
 
-
     @Override
     public String testPathRepeat1() {
         return "path repeat1";
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestService.java
index 274bbea..46c86c5 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestService.java
@@ -17,7 +17,6 @@
  */
 package org.apache.dubbo.rest.demo.routine;
 
-
 import org.apache.dubbo.rest.demo.pojo.Color;
 
 import javax.ws.rs.GET;
@@ -25,6 +24,7 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.Instant;
@@ -35,8 +35,10 @@
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Optional;
+
 @Path("/")
 public interface BasicParamRequestService {
+
     @GET
     @Path("/primitiveInt")
     int primitiveInt(@QueryParam("a") int a, @QueryParam("b") int b);
@@ -51,7 +53,7 @@
 
     @GET
     @Path("/primitiveDouble")
-    double primitiveDouble(@QueryParam("a") double a,@QueryParam("b") double b);
+    double primitiveDouble(@QueryParam("a") double a, @QueryParam("b") double b);
 
     @GET
     @Path("/primitiveShort")
@@ -69,7 +71,6 @@
     @Path("/primitiveFloat")
     double primitiveFloat(@QueryParam("a") float a, @QueryParam("b") float b);
 
-
     @GET
     @Path("/wrapperInt")
     Integer wrapperInt(@QueryParam("a") Integer a, @QueryParam("b") Integer b);
@@ -84,7 +85,7 @@
 
     @GET
     @Path("/wrapperDouble")
-    Double wrapperDouble(@QueryParam("a") Double a,@QueryParam("b") Double b);
+    Double wrapperDouble(@QueryParam("a") Double a, @QueryParam("b") Double b);
 
     @GET
     @Path("/wrapperShort")
@@ -98,14 +99,13 @@
     @Path("/wrapperBoolean")
     Boolean wrapperBoolean(@QueryParam("a") Boolean a, @QueryParam("b") Boolean b);
 
-
     @GET
     @Path("/intArray")
-    int[] intArray(@QueryParam("array") int[] aray);
+    int[] intArray(@QueryParam("array") int[] array);
 
     @GET
     @Path("/longArray")
-    long[] longArray(@QueryParam("array") long[] aray);
+    long[] longArray(@QueryParam("array") long[] array);
 
     @GET
     @Path("/bigInt")
@@ -127,7 +127,6 @@
     @Path("/Instant")
     Instant date(@QueryParam("instant") Instant instant);
 
-
     @GET
     @Path("/localDate")
     LocalDate date(@QueryParam("localDate") LocalDate localDate);
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestServiceImpl.java
index cda9ea6..dd39179 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/BasicParamRequestServiceImpl.java
@@ -32,7 +32,7 @@
 import java.util.Optional;
 
 @DubboService
-public class BasicParamRequestServiceImpl implements BasicParamRequestService{
+public class BasicParamRequestServiceImpl implements BasicParamRequestService {
 
     @Override
     public int primitiveInt(int a, int b) {
@@ -49,7 +49,6 @@
         return (byte) (a + b);
     }
 
-
     @Override
     public double primitiveDouble(double a, double b) {
         return a + b;
@@ -57,12 +56,12 @@
 
     @Override
     public short primitiveShort(short a, short b) {
-        return (short) (a+b);
+        return (short) (a + b);
     }
 
     @Override
     public char primitiveChar(char a, char b) {
-        return (char)(a + b);
+        return (char) (a + b);
     }
 
     @Override
@@ -97,12 +96,12 @@
 
     @Override
     public Short wrapperShort(Short a, Short b) {
-        return (short)(a + b);
+        return (short) (a + b);
     }
 
     @Override
     public Character wrapperChar(Character a, Character b) {
-        return (char)(a+b);
+        return (char) (a + b);
     }
 
     @Override
@@ -110,15 +109,14 @@
         return a & b;
     }
 
-
     @Override
-    public int[] intArray(int[] aray) {
-        return aray;
+    public int[] intArray(int[] array) {
+        return array;
     }
 
     @Override
-    public long[] longArray(long[] aray) {
-        return aray;
+    public long[] longArray(long[] array) {
+        return array;
     }
 
     @Override
@@ -187,5 +185,4 @@
         return color;
     }
 
-
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestService.java
index 3eaff86..8f8ba7d 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestService.java
@@ -26,44 +26,43 @@
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
-
-
+import javax.ws.rs.core.MediaType;
 
 @Path("/HttpRequestMethod")
 public interface HttpMethodRequestService {
+
     @POST
     @Path("/sayPost")
-    @Produces({javax.ws.rs.core.MediaType.TEXT_PLAIN})
+    @Produces({MediaType.TEXT_PLAIN})
     String sayHelloPost(String hello);
 
     @DELETE
     @Path("/sayDelete")
-    @Produces({javax.ws.rs.core.MediaType.TEXT_PLAIN})
+    @Produces({MediaType.TEXT_PLAIN})
     String sayHelloDelete(@QueryParam("name") String hello);
 
     @HEAD
     @Path("/sayHead")
-    @Produces({javax.ws.rs.core.MediaType.TEXT_PLAIN})
+    @Produces({MediaType.TEXT_PLAIN})
     String sayHelloHead(@QueryParam("name") String hello);
 
-
     @GET
     @Path("/sayGet")
-    @Produces({javax.ws.rs.core.MediaType.TEXT_PLAIN})
+    @Produces({MediaType.TEXT_PLAIN})
     String sayHelloGet(@QueryParam("name") String hello);
 
     @PUT
     @Path("/sayPut")
-    @Produces({javax.ws.rs.core.MediaType.TEXT_PLAIN})
+    @Produces({MediaType.TEXT_PLAIN})
     String sayHelloPut(@QueryParam("name") String hello);
 
     @PATCH
     @Path("/sayPatch")
-    @Produces({javax.ws.rs.core.MediaType.TEXT_PLAIN})
+    @Produces({MediaType.TEXT_PLAIN})
     String sayHelloPatch(@QueryParam("name") String hello);
 
     @OPTIONS
     @Path("/sayOptions")
-    @Produces({javax.ws.rs.core.MediaType.TEXT_PLAIN})
+    @Produces({MediaType.TEXT_PLAIN})
     String sayHelloOptions(@QueryParam("name") String hello);
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestServiceImpl.java
index 0ad7404..3346956 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/HttpMethodRequestServiceImpl.java
@@ -20,7 +20,8 @@
 import org.apache.dubbo.config.annotation.DubboService;
 
 @DubboService
-public class HttpMethodRequestServiceImpl implements HttpMethodRequestService{
+public class HttpMethodRequestServiceImpl implements HttpMethodRequestService {
+
     @Override
     public String sayHelloPost(String name) {
         return "Hello " + name;
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestService.java
index f85c38a..7646932 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestService.java
@@ -16,11 +16,10 @@
  */
 package org.apache.dubbo.rest.demo.routine;
 
-import org.springframework.web.bind.annotation.PathVariable;
-
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 
@@ -47,28 +46,25 @@
 
     @GET
     @Path("/library/{isbn}/{type}")
-    String testPathParamTwo (@PathVariable("isbn") String isbn,@PathVariable("type") String type);
+    String testPathParamTwo(@PathParam("isbn") String isbn, @PathParam("type") String type);
 
     @GET
     @Path("/foo{name}-{zip}bar")
-    String testPathParam(@PathVariable("name") String name,@PathVariable("zip") String zip);
+    String testPathParam(@PathParam("name") String name, @PathParam("zip") String zip);
 
     @GET
     @Path("{var:\\d+}/stuff")
-    int testPathInt(@PathVariable("var") int i);
+    int testPathInt(@PathParam("var") int i);
 
     @GET
     @Path("/{var:.*}/stuff")
-    String testPathAny(@PathVariable("var") String name);
-
+    String testPathAny(@PathParam("var") String name);
 
     @GET
     @Path("/consumeAj")
-    @Consumes("application/json")
     @Produces("text/plain")
     String testConsumesAJ(@QueryParam("name") String name);
 
-
     @GET
     @Path("/consumeAll")
     @Consumes("*/*")
@@ -80,11 +76,9 @@
     @Produces("application/json")
     String testProducesAJ(@QueryParam("name") String name);
 
-
     @GET
     @Path("/producesAll")
     @Produces("*/*")
     String testProducesAll(@QueryParam("name") String name);
 
-
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestServiceImpl.java
index 56e1274..b11f23f 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/MappingRequestServiceImpl.java
@@ -18,41 +18,42 @@
 
 import org.apache.dubbo.config.annotation.DubboService;
 
-import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
 
 @DubboService
 @Path("/mapping")
-public class MappingRequestServiceImpl implements MappingRequestService{
+public class MappingRequestServiceImpl implements MappingRequestService {
+
     @Override
     public String testInterface(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
+
     @Override
     public String testPathZero(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
     @Override
     public String testPathTwo(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
     @Override
     public String testPathOne(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
+
     @Override
     public String testPathParamTwo(String isbn, String type) {
-        return isbn+type;
+        return isbn + type;
     }
 
     @Override
     public String testPathParam(String name, String zip) {
-        return name+zip;
+        return name + zip;
     }
 
     @Override
@@ -62,39 +63,34 @@
 
     @Override
     public String testPathAny(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
-
     @Override
     public String testConsumesAJ(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
-
     @Override
     public String testConsumesAll(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
     @Override
     public String testProducesAJ(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
-
     @Override
     public String testProducesAll(String name) {
-        return "Hello "+name;
+        return "Hello " + name;
     }
 
     @GET
     @Path("/servicePath")
-    @Consumes(MediaType.TEXT_PLAIN)
     @Override
-    public String testService(@QueryParam("name") String name){
-        return "Hello "+name;
+    public String testService(@QueryParam("name") String name) {
+        return "Hello " + name;
     }
 
-
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestService.java
index 97738dd..4ad0c39 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestService.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
+
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.List;
@@ -52,15 +53,13 @@
     @Path("/queryList")
     List<String> sayQueryList(@QueryParam("name") List<String> values);
 
-
     @GET
     @Path("/queryMap")
-    Map<String,String> sayQueryMap(@QueryParam("name") Map<String,String> value);
+    Map<String, String> sayQueryMap(@QueryParam("name") Map<String, String> value);
 
     @GET
     @Path("/queryStringMap")
-    Map<String,List<String>> sayQueryStringMap(@QueryParam("name") Map<String,List<String>> value);
-
+    Map<String, List<String>> sayQueryStringMap(@QueryParam("name") Map<String, List<String>> value);
 
     @GET
     @Path("/noAnnoParam")
@@ -71,14 +70,14 @@
     @Path("/noAnnoListParam")
     List<String> sayNoAnnoListParam(List<String> value);
 
-
     @GET
     @Path("/noAnnoStringMapParam")
-    Map<String,String> sayNoAnnoStringMapParam(Map<String,String> value);
+    Map<String, String> sayNoAnnoStringMapParam(Map<String, String> value);
 
     @GET
     @Path("/noAnnoArrayParam")
     String[] sayNoAnnoArrayParam(String[] value);
+
     @POST
     @Path("/form")
     @Produces(MediaType.TEXT_PLAIN)
@@ -93,37 +92,36 @@
     @Path("/header")
     String sayHeader(@HeaderParam("name") String name);
 
-
     @GET
     @Path("/header/map")
     @Produces(MediaType.TEXT_PLAIN)
-    String sayHeader(@HeaderParam("name") Map<String,String> value);
-
+    String sayHeader(@HeaderParam("name") Map<String, String> value);
 
     @GET
     @Path("/cookie")
     String sayCookie(@CookieParam("cookieId") String cookieId);
+
     @GET
     @Path("/cookie/list")
     List<String> sayCookie(@CookieParam("cookieId") List<String> values);
+
     @GET
     @Path("/cookie/map")
-    Map<String,String> sayCookie(@CookieParam("cookieId") Map<String,String> value);
+    Map<String, String> sayCookie(@CookieParam("cookieId") Map<String, String> value);
 
     @GET
-    @Path("/matrix;m={m}")
+    @Path("/matrix/string/{m}")
     @Produces(MediaType.TEXT_PLAIN)
-    String sayMatrixString(@MatrixParam("name") String name);
+    String sayMatrixString(@PathParam("m") String m, @MatrixParam("name") String name);
 
     @GET
-    @Path("/matrix/list;m={m}")
-    List<String> sayMatrixList(@MatrixParam("list")List<String> values);
-
+    @Path("/matrix/list/{m}")
+    List<String> sayMatrixList(@PathParam("m") String m, @MatrixParam("name") List<String> values);
 
     @GET
-    @Path("/matrix/map;m={m}")
-    Map<String,List<String>> sayMatrixMap(@MatrixParam("map") Map<String,List<String>> value);
-
+    @Path("/matrix/map/{m}")
+    Map<String, List<String>> sayMatrixMap(
+            @PathParam("m") String m, @MatrixParam("name") Map<String, List<String>> valueMap);
 
     @POST
     @Path("/bodyUser")
@@ -137,7 +135,6 @@
     @Path("/bodyStringMap")
     Map<String, String> sayStringMap(Map<String, String> value);
 
-
     @POST
     @Path("/output")
     String sayOutput(OutputStream out) throws IOException;
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestServiceImpl.java
index fb8d97a..f245954 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/java/org/apache/dubbo/rest/demo/routine/ParamTransferRequestServiceImpl.java
@@ -21,7 +21,6 @@
 import org.apache.dubbo.remoting.http12.HttpMethods;
 import org.apache.dubbo.remoting.http12.HttpRequest;
 import org.apache.dubbo.remoting.http12.HttpResponse;
-import org.apache.dubbo.rest.demo.pojo.Person;
 import org.apache.dubbo.rest.demo.pojo.User;
 
 import java.io.IOException;
@@ -30,7 +29,8 @@
 import java.util.Map;
 
 @DubboService
-public class ParamTransferRequestServiceImpl implements ParamTransferRequestService{
+public class ParamTransferRequestServiceImpl implements ParamTransferRequestService {
+
     @Override
     public String sayHello(String name) {
         return "Hello " + name;
@@ -86,7 +86,6 @@
         return "Hello " + name;
     }
 
-
     @Override
     public String sayHeader(Map<String, String> value) {
         return value.get("name");
@@ -108,19 +107,18 @@
     }
 
     @Override
-    public String sayMatrixString(String name) {
-        return  "Hello " + name;
+    public String sayMatrixString(String m, String name) {
+        return "Hello " + name;
     }
 
     @Override
-    public List<String> sayMatrixList(List<String> values) {
+    public List<String> sayMatrixList(String m, List<String> values) {
         return values;
     }
 
-
     @Override
-    public Map<String, List<String>> sayMatrixMap(Map<String, List<String>> value) {
-        return value;
+    public Map<String, List<String>> sayMatrixMap(String m, Map<String, List<String>> valueMap) {
+        return valueMap;
     }
 
     @Override
@@ -155,5 +153,4 @@
         response.setBody(name);
     }
 
-
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/resources/application.yml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/resources/application.yml
index 36a5dc8..c6db3df 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/resources/application.yml
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/resources/application.yml
@@ -13,16 +13,16 @@
 # 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.
-server:
-    port: 8081
+
+spring:
+  application:
+    name: dubbo-springboot-triple-rest-jaxrs
 dubbo:
   application:
-      name: dubbo-springboot-triple-rest-jaxrs
-      qos-port: 22222
-  registry:
-    address: nacos://${nacos.address:localhost}:8848?username=nacos&password=nacos
+    name: ${spring.application.name}
+    qos-enable: false
   protocol:
-      name: tri
-      port: 50052
-#      serialization: fastjson2
-#      extension: org.apache.dubbo.rest.demo.filter.TraceFilter,org.apache.dubbo.rest.demo.intercept.DynamicTraceInterceptor
+    name: tri
+    port: 50052
+    triple:
+      verbose: true
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/resources/log4j2.xml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..f21b6cb
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/main/resources/log4j2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="%style{%d{HH:mm:ss.SSS}}{Magenta} %style{|-}{White}%highlight{%-5p} [%t] %style{%40.40c}{Cyan}:%style{%-3L}{Blue} %style{-|}{White} %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect)}" disableAnsi="false" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+        <Logger name="org.apache.dubbo.rpc.protocol.tri" level="debug"/>
+        <Logger name="org.apache.dubbo.remoting.http12" level="debug"/>
+        <Logger name="org.apache.dubbo.config" level="warn"/>
+    </Loggers>
+</Configuration>
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/AbnormalRequestServiceIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/AbnormalRequestServiceIT.java
index 3a3cacd..96a60c0 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/AbnormalRequestServiceIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/AbnormalRequestServiceIT.java
@@ -18,61 +18,58 @@
 
 import org.junit.Assert;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.http.HttpStatus;
-import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.http.MediaType;
 import org.springframework.web.client.RestClient;
 
-
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class AbnormalRequestServiceIT {
-
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
-
+@SuppressWarnings("resource")
+public class AbnormalRequestServiceIT extends BaseTest {
 
     @Test
-    public void testNotFound(){
-        RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/abnormal/not")
-                .header("Content-type", "application/json")
+    public void testNotFound() {
+        RestClient.create()
+                .get()
+                .uri(toUri("/abnormal/not"))
+                .accept(MediaType.APPLICATION_JSON)
                 .exchange((request, response) -> {
-                    Assert.assertEquals(HttpStatus.NOT_FOUND,response.getStatusCode());
+                    Assert.assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
                     return response;
                 });
     }
 
     @Test
-    public void testNoParam(){
-        RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/abnormal/notParam?name=1&a=1")
-                .header( "Content-type","application/json")
+    public void testNoParam() {
+        RestClient.create()
+                .get()
+                .uri(toUri("/abnormal/notParam?name=1&a=1"))
+                .accept(MediaType.APPLICATION_JSON)
                 .exchange((request, response) -> {
                     System.out.println(response.getStatusCode());
-                    Assert.assertEquals(HttpStatus.NOT_FOUND,response.getStatusCode());
+                    Assert.assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode());
                     return response;
                 });
     }
 
     @Test
-    public void testParamConvertFail(){
-        RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/abnormal/paramConvertFail?zonedDateTime=2023-03-08T10:15:30+08:00")
-                .header( "Content-type","application/json")
+    public void testParamConvertFail() {
+        RestClient.create()
+                .get()
+                .uri(toUri("/abnormal/paramConvertFail?zonedDateTime=2023-03-08T10:15:30+08:00"))
+                .accept(MediaType.APPLICATION_JSON)
                 .exchange((request, response) -> {
-                    Assert.assertEquals(HttpStatus.INTERNAL_SERVER_ERROR,response.getStatusCode());
+                    Assert.assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
                     return response;
                 });
     }
 
     @Test
-    public void testThrowException(){
-        RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/abnormal/throwException")
-                .header( "Content-type","application/json")
+    public void testThrowException() {
+        RestClient.create()
+                .get()
+                .uri(toUri("/abnormal/throwException"))
+                .accept(MediaType.APPLICATION_JSON)
                 .exchange((request, response) -> {
-                    Assert.assertEquals(HttpStatus.INTERNAL_SERVER_ERROR,response.getStatusCode());
+                    Assert.assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
                     return response;
                 });
     }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/BaseTest.java
similarity index 66%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/BaseTest.java
index 1a58d84..63c2bcb 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/BaseTest.java
@@ -18,14 +18,19 @@
 package org.apache.dubbo.rest.demo.test;
 
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
 
-@SpringBootApplication
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.RestClient;
+
 @EnableDubbo
-public class ConsumerApplication {
+@RunWith(SpringRunner.class)
+public abstract class BaseTest {
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    protected static final String HOST = System.getProperty("dubbo.address", "localhost");
+    protected final RestClient restClient = RestClient.create();
+
+    protected static String toUri(String path) {
+        return "http://" + HOST + ":50052/" + path;
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/BasicParamRequestIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/BasicParamRequestIT.java
index 8bb8bde..fa4cd4a 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/BasicParamRequestIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/BasicParamRequestIT.java
@@ -20,16 +20,6 @@
 import org.apache.dubbo.rest.demo.pojo.Color;
 import org.apache.dubbo.rest.demo.routine.BasicParamRequestService;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.core.ParameterizedTypeReference;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.web.client.RestClient;
-
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.text.ParseException;
@@ -44,12 +34,16 @@
 import java.util.Calendar;
 import java.util.Date;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class BasicParamRequestIT {
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
 
-    @DubboReference
+public class BasicParamRequestIT extends BaseTest {
+
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private BasicParamRequestService basicParamRequestService;
 
     @Test
@@ -64,38 +58,38 @@
         Assert.assertEquals(2L, result3);
 
         double result4 = basicParamRequestService.primitiveDouble(1.1, 1.2);
-        Assert.assertEquals(2.3,result4,0.00001);
+        Assert.assertEquals(2.3, result4, 0.00001);
 
         short result5 = basicParamRequestService.primitiveShort((short) 1, (short) 1);
-        Assert.assertEquals((short)2,result5);
+        Assert.assertEquals((short) 2, result5);
 
         boolean result6 = basicParamRequestService.primitiveBoolean(true, false);
         Assert.assertFalse(result6);
 
         char result7 = basicParamRequestService.primitiveChar('a', 'b');
-        Assert.assertEquals((char)('a'+'b'), result7);
+        Assert.assertEquals((char) ('a' + 'b'), result7);
 
         double result8 = basicParamRequestService.primitiveFloat(1.1f, 1.2f);
-        Assert.assertEquals(2.3f,result8,0.00001f);
+        Assert.assertEquals(2.3f, result8, 0.00001f);
     }
 
     @Test
-    public void test(){
+    public void test() {
         BigInteger result17 = basicParamRequestService.bigInt(BigInteger.ONE, BigInteger.ONE);
-        Assert.assertEquals(BigInteger.TWO,result17);
+        Assert.assertEquals(BigInteger.TWO, result17);
 
         BigDecimal result18 = basicParamRequestService.bigDecimal(BigDecimal.ONE, BigDecimal.ZERO);
-        Assert.assertEquals(BigDecimal.ONE,result18);
+        Assert.assertEquals(BigDecimal.ONE, result18);
 
-        int[] array1 = basicParamRequestService.intArray(new int[]{1, 2, 3});
-        Assert.assertArrayEquals(new int[]{1,2,3},array1);
+        int[] array1 = basicParamRequestService.intArray(new int[] {1, 2, 3});
+        Assert.assertArrayEquals(new int[] {1, 2, 3}, array1);
 
-        long[] array2 = basicParamRequestService.longArray(new long[]{1L, 2L, 3L});
-        Assert.assertArrayEquals(new long[]{1L,2L,3L},array2);
+        long[] array2 = basicParamRequestService.longArray(new long[] {1L, 2L, 3L});
+        Assert.assertArrayEquals(new long[] {1L, 2L, 3L}, array2);
     }
 
     @Test
-     public void testWrapper() {
+    public void testWrapper() {
         Boolean result9 = basicParamRequestService.wrapperBoolean(Boolean.TRUE, Boolean.FALSE);
         Assert.assertEquals(Boolean.FALSE, result9);
 
@@ -118,37 +112,36 @@
         Assert.assertEquals(Short.valueOf((short) 2), result16);
     }
 
-     @Test
-     public void testDateTime(){
-         Date date = basicParamRequestService.date(Date.from(Instant.parse("2023-03-08T09:30:05Z")));
-         Assert.assertEquals(Date.from(Instant.parse("2023-03-08T09:30:05Z")),date);
+    @Test
+    public void testDateTime() {
+        Date date = basicParamRequestService.date(Date.from(Instant.parse("2023-03-08T09:30:05Z")));
+        Assert.assertEquals(Date.from(Instant.parse("2023-03-08T09:30:05Z")), date);
 
-         Instant date1 = basicParamRequestService.date(Instant.parse("2023-03-08T09:30:05Z"));
-         Assert.assertEquals(Instant.parse("2023-03-08T09:30:05Z"),date1);
+        Instant date1 = basicParamRequestService.date(Instant.parse("2023-03-08T09:30:05Z"));
+        Assert.assertEquals(Instant.parse("2023-03-08T09:30:05Z"), date1);
 
-         Calendar calendar = Calendar.getInstance();
-         Calendar date2 = basicParamRequestService.date(calendar);
-         Assert.assertEquals(date2,calendar);
+        Calendar calendar = Calendar.getInstance();
+        Calendar date2 = basicParamRequestService.date(calendar);
+        Assert.assertEquals(date2, calendar);
 
-         LocalDate date3 = basicParamRequestService.date(LocalDate.parse("2001-05-23"));
-         Assert.assertEquals(LocalDate.parse("2001-05-23"),date3);
+        LocalDate date3 = basicParamRequestService.date(LocalDate.parse("2001-05-23"));
+        Assert.assertEquals(LocalDate.parse("2001-05-23"), date3);
 
-         LocalTime date4 = basicParamRequestService.date(LocalTime.parse("09:30:05.123"));
-         Assert.assertEquals(LocalTime.parse("09:30:05.123"),date4);
+        LocalTime date4 = basicParamRequestService.date(LocalTime.parse("09:30:05.123"));
+        Assert.assertEquals(LocalTime.parse("09:30:05.123"), date4);
 
-         LocalDateTime date5 = basicParamRequestService.date(LocalDateTime.parse("2023-03-08T09:30:05"));
-         Assert.assertEquals(LocalDateTime.parse("2023-03-08T09:30:05"),date5);
+        LocalDateTime date5 = basicParamRequestService.date(LocalDateTime.parse("2023-03-08T09:30:05"));
+        Assert.assertEquals(LocalDateTime.parse("2023-03-08T09:30:05"), date5);
 
-         ZonedDateTime date6 = basicParamRequestService.date(ZonedDateTime.parse("2021-06-11T10:00:00+02:00"));
-         Assert.assertEquals(ZonedDateTime.parse("2021-06-11T10:00:00+02:00"),date6);
-     }
+        ZonedDateTime date6 = basicParamRequestService.date(ZonedDateTime.parse("2021-06-11T10:00:00+02:00"));
+        Assert.assertEquals(ZonedDateTime.parse("2021-06-11T10:00:00+02:00"), date6);
+    }
 
     @Test
     public void testPrimitiveInt() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Integer> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveInt?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Integer> result = restClient.get()
+                .uri(toUri("/primitiveInt?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Integer.class);
         Assert.assertEquals(Integer.valueOf(2), result.getBody());
@@ -156,10 +149,9 @@
 
     @Test
     public void testPrimitiveByte() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Byte> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveByte?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Byte> result = restClient.get()
+                .uri(toUri("/primitiveByte?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Byte.class);
         Assert.assertEquals(Byte.valueOf((byte) 2), result.getBody());
@@ -167,10 +159,9 @@
 
     @Test
     public void testPrimitiveLong() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Long> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveLong?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Long> result = restClient.get()
+                .uri(toUri("/primitiveLong?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Long.class);
         Assert.assertEquals(Long.valueOf(2), result.getBody());
@@ -178,10 +169,9 @@
 
     @Test
     public void testPrimitiveDouble() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Double> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveDouble?a={a}&b={b}", 1.1, 1.2)
-                .header("Content-type", "application/json")
+        ResponseEntity<Double> result = restClient.get()
+                .uri(toUri("/primitiveDouble?a={a}&b={b}"), 1.1, 1.2)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Double.class);
         Assert.assertEquals(Double.valueOf(2.3), result.getBody());
@@ -189,10 +179,9 @@
 
     @Test
     public void testPrimitiveShort() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Short> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveShort?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Short> result = restClient.get()
+                .uri(toUri("/primitiveShort?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Short.class);
         Assert.assertEquals(Short.valueOf((short) 2), result.getBody());
@@ -200,43 +189,40 @@
 
     @Test
     public void testPrimitiveChar() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Character> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveChar?a={a}&b={b}", 'a', 'b')
-                .header("Content-type", "application/json")
+        ResponseEntity<Character> result = restClient.get()
+                .uri(toUri("/primitiveChar?a={a}&b={b}"), 'a', 'b')
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Character.class);
-        Assert.assertEquals(Character.valueOf((char) ('a'+'b')), result.getBody());
+        Assert.assertEquals(Character.valueOf((char) ('a' + 'b')), result.getBody());
     }
 
     @Test
     public void testPrimitiveBoolean() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Boolean> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveBoolean?a={a}&b={b}", true, false)
-                .header("Content-type", "application/json")
+        ResponseEntity<Boolean> result = restClient.get()
+                .uri(toUri("/primitiveBoolean?a={a}&b={b}"), true, false)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Boolean.class);
         Assert.assertEquals(Boolean.FALSE, result.getBody());
     }
 
     @Test
+    @SuppressWarnings("DataFlowIssue")
     public void testPrimitiveFloat() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Float> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/primitiveFloat?a={a}&b={b}", 1.1f, 1.2f)
-                .header("Content-type", "application/json")
+        ResponseEntity<Float> result = restClient.get()
+                .uri(toUri("/primitiveFloat?a={a}&b={b}"), 1.1f, 1.2f)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Float.class);
-        Assert.assertEquals(2.3f,result.getBody(),0.00001f);
+        Assert.assertEquals(2.3f, result.getBody(), 0.00001f);
     }
 
     @Test
     public void testWrapperInt() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Integer> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/wrapperInt?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Integer> result = restClient.get()
+                .uri(toUri("/wrapperInt?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Integer.class);
         Assert.assertEquals(Integer.valueOf(2), result.getBody());
@@ -244,10 +230,9 @@
 
     @Test
     public void testWrapperByte() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Byte> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/wrapperByte?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Byte> result = restClient.get()
+                .uri(toUri("/wrapperByte?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Byte.class);
         Assert.assertEquals(Byte.valueOf((byte) 2), result.getBody());
@@ -255,10 +240,9 @@
 
     @Test
     public void testWrapperLong() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Long> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/wrapperLong?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Long> result = restClient.get()
+                .uri(toUri("/wrapperLong?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Long.class);
         Assert.assertEquals(Long.valueOf(2), result.getBody());
@@ -266,10 +250,9 @@
 
     @Test
     public void testWrapperDouble() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Double> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/wrapperDouble?a={a}&b={b}", 1.1, 1.2)
-                .header("Content-type", "application/json")
+        ResponseEntity<Double> result = restClient.get()
+                .uri(toUri("/wrapperDouble?a={a}&b={b}"), 1.1, 1.2)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Double.class);
         Assert.assertEquals(Double.valueOf(2.3), result.getBody());
@@ -277,10 +260,9 @@
 
     @Test
     public void testWrapperShort() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Short> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/wrapperShort?a={a}&b={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Short> result = restClient.get()
+                .uri(toUri("/wrapperShort?a={a}&b={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Short.class);
         Assert.assertEquals(Short.valueOf((short) 2), result.getBody());
@@ -288,21 +270,19 @@
 
     @Test
     public void testWrapperChar() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Character> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/wrapperCharacter?a={a}&b={b}", 'a', 'b')
-                .header("Content-type", "application/json")
+        ResponseEntity<Character> result = restClient.get()
+                .uri(toUri("/wrapperCharacter?a={a}&b={b}"), 'a', 'b')
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Character.class);
-        Assert.assertEquals(Character.valueOf((char) ('a'+'b')), result.getBody());
+        Assert.assertEquals(Character.valueOf((char) ('a' + 'b')), result.getBody());
     }
 
     @Test
     public void testWrapperBoolean() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Boolean> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/wrapperBoolean?a={a}&b={b}", true, false)
-                .header("Content-type", "application/json")
+        ResponseEntity<Boolean> result = restClient.get()
+                .uri(toUri("/wrapperBoolean?a={a}&b={b}"), true, false)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Boolean.class);
         Assert.assertEquals(Boolean.FALSE, result.getBody());
@@ -310,10 +290,9 @@
 
     @Test
     public void testBigInt() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<BigInteger> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/bigInt?a={a}&b={b}",new BigInteger("3000000000"),new BigInteger("3000000000"))
-                .header("Content-type", "application/json")
+        ResponseEntity<BigInteger> result = restClient.get()
+                .uri(toUri("/bigInt?a={a}&b={b}"), new BigInteger("3000000000"), new BigInteger("3000000000"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(BigInteger.class);
         Assert.assertEquals(new BigInteger("6000000000"), result.getBody());
@@ -321,45 +300,41 @@
 
     @Test
     public void testBigDecimal() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<BigDecimal> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/bigDecimal?a={a}&b={b}", new BigDecimal("1.1"), new BigDecimal("1.2"))
-                .header("Content-type", "application/json")
+        ResponseEntity<BigDecimal> result = restClient.get()
+                .uri(toUri("/bigDecimal?a={a}&b={b}"), new BigDecimal("1.1"), new BigDecimal("1.2"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(BigDecimal.class);
-        Assert.assertEquals(new BigDecimal("2.3"),result.getBody());
+        Assert.assertEquals(new BigDecimal("2.3"), result.getBody());
     }
 
     @Test
     public void testIntArray() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<int[]> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/intArray?array={a}&array={b}", 1, 1)
-                .header("Content-type", "application/json")
+        ResponseEntity<int[]> result = restClient.get()
+                .uri(toUri("/intArray?array={a}&array={b}"), 1, 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<int[]>() {});
-        Assert.assertArrayEquals(new int[]{1,1}, result.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertArrayEquals(new int[] {1, 1}, result.getBody());
     }
 
     @Test
     public void testLongArray() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<long[]> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/longArray?array={a}&array={b}", 1L, 1L)
-                .header("Content-type", "application/json")
+        ResponseEntity<long[]> result = restClient.get()
+                .uri(toUri("/longArray?array={a}&array={b}"), 1L, 1L)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<long[]>() {});
-        Assert.assertArrayEquals(new long[]{1L,1L}, result.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertArrayEquals(new long[] {1L, 1L}, result.getBody());
     }
 
     @Test
     public void testDate() throws ParseException {
-        RestClient defaultClient = RestClient.create();
         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        Date result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/date?date=2023-03-08 09:30:05")
-                .header("Content-type", "application/json")
-                .exchange((request,response)->{
+        Date result = restClient.get()
+                .uri(toUri("/date?date=2023-03-08 09:30:05"))
+                .accept(MediaType.APPLICATION_JSON)
+                .exchange((request, response) -> {
                     try {
                         ObjectMapper mapper = new ObjectMapper();
                         String str = mapper.readValue(response.getBody(), String.class);
@@ -368,31 +343,29 @@
                         throw new RuntimeException(e);
                     }
                 });
-        Assert.assertEquals(formatter.parse("2023-03-08 09:30:05"),result);
+        Assert.assertEquals(formatter.parse("2023-03-08 09:30:05"), result);
     }
 
     @Test
     public void testLocalDate() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<LocalDate> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/localDate?localDate=2001-05-23")
-                .header("Content-type", "application/json")
+        ResponseEntity<LocalDate> result = restClient.get()
+                .uri(toUri("/localDate?localDate=2001-05-23"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(LocalDate.class);
-        Assert.assertEquals(LocalDate.parse("2001-05-23"),result.getBody());
+        Assert.assertEquals(LocalDate.parse("2001-05-23"), result.getBody());
     }
 
     @Test
     public void testCalendar() throws ParseException {
-        RestClient defaultClient = RestClient.create();
         SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        Calendar result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/calendar?calendar=2023-03-08 09:30:05")
-                .exchange((request,response)->{
+        Calendar result = restClient.get()
+                .uri(toUri("/calendar?calendar=2023-03-08 09:30:05"))
+                .exchange((request, response) -> {
                     try {
                         ObjectMapper mapper = new ObjectMapper();
                         String str = mapper.readValue(response.getBody(), String.class);
-                        Date date =  formatter.parse(str);
+                        Date date = formatter.parse(str);
                         Calendar instance = Calendar.getInstance();
                         instance.setTime(date);
                         return instance;
@@ -402,102 +375,96 @@
                 });
         Calendar instance = Calendar.getInstance();
         instance.setTime(formatter.parse("2023-03-08 09:30:05"));
-        Assert.assertEquals(instance,result);
+        Assert.assertEquals(instance, result);
     }
+
     @Test
     public void testInstant() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Instant> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/Instant?instant=2023-03-08T09:30:05Z")
-                .header("Content-type", "application/json")
+        ResponseEntity<Instant> result = restClient.get()
+                .uri(toUri("/Instant?instant=2023-03-08T09:30:05Z"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Instant.class);
-        Assert.assertEquals(Instant.parse("2023-03-08T09:30:05Z"),result.getBody());
+        Assert.assertEquals(Instant.parse("2023-03-08T09:30:05Z"), result.getBody());
     }
 
     @Test
     public void testLocalTime() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<LocalTime> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/localTime?localTime=09:30:05.123")
-                .header("Content-type", "application/json")
+        ResponseEntity<LocalTime> result = restClient.get()
+                .uri(toUri("/localTime?localTime=09:30:05.123"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(LocalTime.class);
-        Assert.assertEquals(LocalTime.parse("09:30:05.123"),result.getBody());
+        Assert.assertEquals(LocalTime.parse("09:30:05.123"), result.getBody());
     }
 
     @Test
     public void testLocalDateTime() {
-        RestClient defaultClient = RestClient.create();
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        LocalDateTime result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/localDateTime?localDateTime=2024-04-28 10:00:00")
-                .exchange((request,response)->{
+        LocalDateTime result = restClient.get()
+                .uri(toUri("/localDateTime?localDateTime=2024-04-28 10:00:00"))
+                .exchange((request, response) -> {
                     ObjectMapper mapper = new ObjectMapper();
                     String str = mapper.readValue(response.getBody(), String.class);
                     return LocalDateTime.parse(str, formatter);
                 });
-        Assert.assertEquals(LocalDateTime.parse("2024-04-28 10:00:00",formatter),result);
+        Assert.assertEquals(LocalDateTime.parse("2024-04-28 10:00:00", formatter), result);
     }
 
     @Test
     public void testZonedDateTime() {
-        RestClient defaultClient = RestClient.create();
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
-        ZonedDateTime result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/zonedDateTime?zonedDateTime=2021-06-11 10:00:00")
-                .header("Content-type", "application/json")
-                .exchange((request,response)->{
+        ZonedDateTime result = restClient.get()
+                .uri(toUri("/zonedDateTime?zonedDateTime=2021-06-11 10:00:00"))
+                .accept(MediaType.APPLICATION_JSON)
+                .exchange((request, response) -> {
                     ObjectMapper mapper = new ObjectMapper();
                     String value = mapper.readValue(response.getBody(), String.class);
                     int i = value.indexOf('[');
-                    return LocalDateTime.parse(value.substring(0, i), formatter).atZone(ZoneId.of(value.substring(i + 1, value.length() - 1)));
+                    return LocalDateTime.parse(value.substring(0, i), formatter)
+                            .atZone(ZoneId.of(value.substring(i + 1, value.length() - 1)));
                 });
-        Assert.assertEquals(LocalDateTime.parse("2021-06-11T10:00:00",formatter).atZone(ZoneId.systemDefault()),result);
+        Assert.assertEquals(LocalDateTime.parse("2021-06-11T10:00:00", formatter)
+                .atZone(ZoneId.systemDefault()), result);
     }
 
     @Test
     public void testEnum() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Color> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/enum?enum=RED")
-                .header("Content-type", "application/json")
+        ResponseEntity<Color> result = restClient.get()
+                .uri(toUri("/enum?enum=RED"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Color.class);
-        Assert.assertEquals(Color.RED,result.getBody());
+        Assert.assertEquals(Color.RED, result.getBody());
     }
 
     @Test
     public void testOptionalDouble() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Double> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/optionalDouble?optionalDouble={a}",1.1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Double> result = restClient.get()
+                .uri(toUri("/optionalDouble?optionalDouble={a}"), 1.1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Double.class);
-        Assert.assertEquals(Double.valueOf("1.1"),result.getBody());
+        Assert.assertEquals(Double.valueOf("1.1"), result.getBody());
     }
 
-
     @Test
     public void testOptionalString() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/optionalString?optionalString={a}","Hello world")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.get()
+                .uri(toUri("/optionalString?optionalString={a}"), "Hello world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",result.getBody());
+        Assert.assertEquals("Hello world", result.getBody());
     }
 
     @Test
     public void testOptionalInt() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Integer> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/optionalInt?optionalInt={a}",1)
-                .header("Content-type", "application/json")
+        ResponseEntity<Integer> result = restClient.get()
+                .uri(toUri("/optionalInt?optionalInt={a}"), 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Integer.class);
-        Assert.assertEquals(Integer.valueOf(1),result.getBody());
+        Assert.assertEquals(Integer.valueOf(1), result.getBody());
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ComplexParamRequestIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ComplexParamRequestIT.java
index 57e5604..268d2bd 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ComplexParamRequestIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ComplexParamRequestIT.java
@@ -20,240 +20,225 @@
 import org.apache.dubbo.rest.demo.complex.ComplexParamRequestService;
 import org.apache.dubbo.rest.demo.pojo.Person;
 import org.apache.dubbo.rest.demo.pojo.User;
-import org.jboss.resteasy.specimpl.MultivaluedMapImpl;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.core.ParameterizedTypeReference;
-import org.springframework.http.HttpStatusCode;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.client.RestClient;
+
 import javax.ws.rs.core.MultivaluedHashMap;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.JAXBException;
-import javax.xml.bind.Unmarshaller;
+
+import java.io.StringReader;
+import java.io.StringWriter;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import static org.springframework.http.MediaType.APPLICATION_JSON;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class ComplexParamRequestIT {
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestClient;
 
-    @DubboReference
+public class ComplexParamRequestIT extends BaseTest {
+
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private ComplexParamRequestService complexParamRequestService;
 
     @Test
-    public void test(){
+    public void test() {
         List<User> list = List.of(new User(1L, "1", 1), new User(2L, "2", 2));
         List<User> result1 = complexParamRequestService.list(list);
-        Assert.assertEquals(list,result1);
+        Assert.assertEquals(list, result1);
 
         Set<User> set = Set.of(new User(1L, "1", 1), new User(2L, "2", 2));
         Set<User> result2 = complexParamRequestService.set(set);
-        Assert.assertEquals(set,result2);
+        Assert.assertEquals(set, result2);
 
-        User[] arr ={new User(1L, "1", 1), new User(2L, "2", 2)};
+        User[] arr = {new User(1L, "1", 1), new User(2L, "2", 2)};
         User[] result3 = complexParamRequestService.array(arr);
-        Assert.assertArrayEquals(arr,result3);
+        Assert.assertArrayEquals(arr, result3);
 
         Map<String, User> map = Map.of("user1", new User(1L, "1", 1), "user2", new User(2L, "2", 2));
         Map<String, User> result4 = complexParamRequestService.stringMap(map);
-        Assert.assertEquals(map,result4);
+        Assert.assertEquals(map, result4);
 
-        MultivaluedHashMap<String,String> valueMap = new MultivaluedHashMap<>();
-        valueMap.add("arg1","Hello");
-        valueMap.add("arg2","world");
+        MultivaluedHashMap<String, String> valueMap = new MultivaluedHashMap<>();
+        valueMap.add("arg1", "Hello");
+        valueMap.add("arg2", "world");
         List<String> result5 = complexParamRequestService.testMapForm(valueMap);
-        Assert.assertEquals(valueMap.values().stream().flatMap(List::stream).toList(),result5);
+        Assert.assertEquals(valueMap.values().stream().flatMap(List::stream).toList(), result5);
 
         String result6 = complexParamRequestService.testMapHeader("Head");
-        Assert.assertEquals("Head",result6);
+        Assert.assertEquals("Head", result6);
 
         Map<String, String> stringMap = Map.of("Hello", "World");
         List<String> result7 = complexParamRequestService.testMapParam(stringMap);
-        Assert.assertEquals(stringMap.values().stream().toList(),result7);
+        Assert.assertEquals(stringMap.values().stream().toList(), result7);
 
         Person person = complexParamRequestService.testXml(new Person("1"));
-        Assert.assertEquals(new Person("1"),person);
+        Assert.assertEquals(new Person("1"), person);
 
     }
 
-
     @Test
-    public void testList() throws Exception {
+    public void testList() {
         ArrayList<User> list = new ArrayList<>();
-        list.add(new User(1L,"1",1));
-        list.add(new User(2L,"2",2));
-        ResponseEntity<List<User>> response = RestClient.create().post()
-                .uri("http://" + providerAddress +":50052/complex/list")
-                .contentType(APPLICATION_JSON)
+        list.add(new User(1L, "1", 1));
+        list.add(new User(2L, "2", 2));
+        ResponseEntity<List<User>> response = RestClient.create()
+                .post()
+                .uri(toUri("/complex/list"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(list)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<User>>() {
-                });
-        Assert.assertEquals(list,response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(list, response.getBody());
     }
 
     @Test
-    public void testSet() throws Exception {
+    public void testSet() {
         Set<User> set = new HashSet<>();
-        set.add(new User(1L,"1",1));
-        set.add(new User(2L,"2",2));
-        ResponseEntity<Set<User>> response = RestClient.create().post()
-                .uri("http://" + providerAddress +":50052/complex/set")
-                .contentType(APPLICATION_JSON)
+        set.add(new User(1L, "1", 1));
+        set.add(new User(2L, "2", 2));
+        ResponseEntity<Set<User>> response = RestClient.create()
+                .post()
+                .uri(toUri("/complex/set"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(set)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<Set<User>>() {
-                });
-        Assert.assertEquals(set,response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(set, response.getBody());
     }
 
     @Test
-    public void testArray() throws Exception {
-        User[] array = {new User(1L,"1",1),new User(2L,"2",2)};
-        ResponseEntity<User[]> response = RestClient.create().post()
-                .uri("http://" + providerAddress +":50052/complex/array")
-                .contentType(APPLICATION_JSON)
+    public void testArray() {
+        User[] array = {new User(1L, "1", 1), new User(2L, "2", 2)};
+        ResponseEntity<User[]> response = RestClient.create()
+                .post()
+                .uri(toUri("/complex/array"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(array)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<User[]>() {
-                });
+                .toEntity(new ParameterizedTypeReference<>() {});
         Assert.assertArrayEquals(array, response.getBody());
     }
 
-
     @Test
-    public void testStringMap() throws Exception {
+    public void testStringMap() {
         HashMap<String, User> map = new HashMap<>();
-        map.put("user1",new User(1L,"1",1));
-        map.put("user2",new User(2L,"2",2));
-        ResponseEntity<Map<String,User>> response = RestClient.create().post()
-                .uri("http://" + providerAddress +":50052/complex/stringMap")
-                .contentType(APPLICATION_JSON)
+        map.put("user1", new User(1L, "1", 1));
+        map.put("user2", new User(2L, "2", 2));
+        ResponseEntity<Map<String, User>> response = RestClient.create()
+                .post()
+                .uri(toUri("/complex/stringMap"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(map)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<Map<String,User>>() {
-                });
-        Assert.assertEquals(map,response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(map, response.getBody());
     }
 
     @Test
-    public void testHeader() throws Exception {
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress +":50052/complex/testMapHeader")
-                .header("Content-type", "application/json")
-                .header("headers","Head")
+    public void testHeader() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/complex/testMapHeader"))
+                .accept(MediaType.TEXT_PLAIN)
+                .header("headers", "Head")
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<String>() {
-                });
-        Assert.assertEquals("Head",response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals("Head", response.getBody());
     }
 
-
     @Test
-    public void testMapParam() throws Exception {
-        ResponseEntity<List<String>> response = RestClient.create().get()
-                .uri("http://" + providerAddress +":50052/complex/testMapParam?arg1=World&arg2=Hello")
-                .header("Content-type", "application/json")
+    public void testMapParam() {
+        ResponseEntity<List<String>> response = RestClient.create()
+                .get()
+                .uri(toUri("/complex/testMapParam?arg1=World&arg2=Hello"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<String>>() {
-                });
-        Assert.assertEquals(List.of("Hello","World"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(List.of("Hello", "World"), response.getBody());
     }
 
-
     @Test
-    public void testMapForm() throws Exception {
+    public void testMapForm() {
         MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
-        map.add("arg1","Hello");
-        ResponseEntity<List<String>> response = RestClient.create().post()
-                .uri("http://" + providerAddress +":50052/complex/testMapForm")
+        map.add("arg1", "Hello");
+        ResponseEntity<List<String>> response = RestClient.create()
+                .post()
+                .uri(toUri("/complex/testMapForm"))
                 .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(map)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<String>>() {
-                });
-        Assert.assertEquals(List.of("Hello"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(List.of("Hello"), response.getBody());
     }
 
     @Test
-    public void testXml() throws Exception {
-        String str = "<?xml  version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><person><name>1</name></person>";
-        Person person = new Person("1");
+    public void testXml() throws JAXBException {
+        Person person = new Person("Sam");
 
-        RestClient defaultClient = RestClient.create();
-        Person result = defaultClient.post()
-                .uri("http://" + providerAddress + ":50052/complex/xml")
-                .header("Content-type", "text/xml")
-                .accept(MediaType.APPLICATION_XML)
-                .body(str)
-                .exchange((request,response)->{
-                    if(response.getStatusCode().isSameCodeAs(HttpStatusCode.valueOf(200))){
-                        try {
-                            JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
-                            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
-                            return  (Person) jaxbUnmarshaller.unmarshal(response.getBody());
-                        } catch (JAXBException e) {
-                            throw new RuntimeException(e);
-                        }
-                    }else {
-                        throw new RuntimeException("http code erroe");
-                    }
-                });
-        Assert.assertEquals(person,result);
+        JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
+        StringWriter writer = new StringWriter();
+        jaxbContext.createMarshaller().marshal(person, writer);
+
+        String result = restClient.post()
+                .uri(toUri("/complex/xml"))
+                .contentType(MediaType.APPLICATION_XML)
+                .body(writer.toString())
+                .retrieve()
+                .body(String.class);
+        Assert.assertNotNull(result);
+        Assert.assertEquals(person, jaxbContext.createUnmarshaller().unmarshal(new StringReader(result)));
     }
 
     @Test
-    public void testCookie(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/complex/cookie")
-                .header("Content-type", "application/json")
-                .header( "cookie","cookie=1")
+    public void testCookie() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/complex/cookie"))
+                .accept(MediaType.TEXT_PLAIN)
+                .header("cookie", "cookie=1")
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("1",response.getBody());
+        Assert.assertEquals("1", response.getBody());
     }
 
     @Test
-    public void testHttpHeader(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/complex/httpHeader")
-                .header( "Content-type","text/plain")
-                .header( "name","world")
+    public void testHttpHeader() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/complex/httpHeader"))
+                .accept(MediaType.TEXT_PLAIN)
+                .header("name", "world")
                 .retrieve()
                 .toEntity(String.class);
         Assert.assertEquals("world", response.getBody());
     }
 
     @Test
-    public void testUri(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/complex/uri")
-                .header("Content-type", "application/json")
+    public void testUri() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/complex/uri"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
         Assert.assertEquals("/complex/uri", response.getBody());
     }
 
     @Test
-    public void testAnnoFrom(){
+    public void testAnnoFrom() {
         MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
-        map.add("name","Li");
-        ResponseEntity<String> response = RestClient.create().post()
-                .uri("http://" + providerAddress + ":50052/complex/annoForm")
+        map.add("name", "Li");
+        ResponseEntity<String> response = RestClient.create()
+                .post()
+                .uri(toUri("/complex/annoForm"))
                 .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(map)
                 .retrieve()
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/DemoServiceIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/DemoServiceIT.java
index e2bd65a..0631c1c 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/DemoServiceIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/DemoServiceIT.java
@@ -18,31 +18,24 @@
 
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.rest.demo.DemoService;
+
 import org.junit.Assert;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestClient;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class DemoServiceIT {
+public class DemoServiceIT extends BaseTest {
 
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
-
-    @DubboReference
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private DemoService demoService;
 
     @Test
     public void test() {
-        String result = demoService.hello(1, "world");
-        Assert.assertEquals("Hello world1", result);
+        String result = demoService.hello("world");
+        Assert.assertEquals("Hello world", result);
 
         String res = demoService.deleteUserById("1");
         Assert.assertEquals("1", res);
@@ -51,37 +44,38 @@
         Assert.assertEquals(1, userById);
 
         Long formBody = demoService.testFormBody(1L);
-        Assert.assertEquals(Long.valueOf(1),formBody);
+        Assert.assertEquals(Long.valueOf(1), formBody);
 
     }
 
     @Test
     public void testRest() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/demo/hello?a={a}&name={name}",1,"world")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.get()
+                .uri(toUri("/demo/hello?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world1", result.getBody());
+        Assert.assertEquals("Hello world", result.getBody());
     }
 
     @Test
-    public void testQuery(){
-        ResponseEntity<Integer> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/demo/findUserById?id={id}",1)
-                .header("Content-type", "application/json")
+    public void testQuery() {
+        ResponseEntity<Integer> response = RestClient.create()
+                .get()
+                .uri(toUri("/demo/findUserById?id={id}"), 1)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Integer.class);
         Assert.assertEquals(Integer.valueOf(1), response.getBody());
     }
 
     @Test
-    public void testFrom(){
+    public void testFrom() {
         MultiValueMap<String, Long> map = new LinkedMultiValueMap<>();
-        map.add("number",1L);
-        ResponseEntity<Long> response = RestClient.create().post()
-                .uri("http://" + providerAddress + ":50052/demo/form")
+        map.add("number", 1L);
+        ResponseEntity<Long> response = RestClient.create()
+                .post()
+                .uri(toUri("/demo/form"))
                 .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(map)
                 .retrieve()
@@ -90,14 +84,14 @@
     }
 
     @Test
-    public void testDel(){
-        ResponseEntity<String> response = RestClient.create().delete()
-                .uri("http://" + providerAddress + ":50052/demo/deleteUserById/1")
-                .header("Content-type", "application/json")
+    public void testDel() {
+        ResponseEntity<String> response = RestClient.create()
+                .delete()
+                .uri(toUri("/demo/deleteUserById/1"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
         Assert.assertEquals("1", response.getBody());
     }
 
-
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ExpansionServiceIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ExpansionServiceIT.java
index a642aca..e9a9eda 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ExpansionServiceIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ExpansionServiceIT.java
@@ -18,51 +18,44 @@
 
 import org.junit.Assert;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.web.client.RestClient;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class ExpansionServiceIT {
-
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
-
+public class ExpansionServiceIT extends BaseTest {
 
     @Test
-    public void testFilter(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/ext/filter?name={name}","world ")
-                .header("Content-type", "application/json")
+    public void testFilter() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/ext/filter?name={name}"), "world ")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world response-filter",response.getBody());
+        Assert.assertEquals("Hello world response-filter", response.getBody());
 
     }
 
     @Test
-    public void testIntercept(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/ext/intercept?name={name}","world ")
-                .header("Content-type", "application/json")
+    public void testIntercept() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/ext/intercept?name={name}"), "world ")
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world intercept",response.getBody());
+        Assert.assertEquals("Hello world intercept", response.getBody());
     }
 
-
     @Test
-    public void testException(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/ext/exception")
-                .header("Content-type", "application/json")
+    public void testException() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/ext/exception"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("test-exception",response.getBody());
+        Assert.assertEquals("test-exception", response.getBody());
     }
 
-
-
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/HttpMethodRequestIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/HttpMethodRequestIT.java
index e1e40be..745f8ec 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/HttpMethodRequestIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/HttpMethodRequestIT.java
@@ -16,25 +16,20 @@
  */
 package org.apache.dubbo.rest.demo.test;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.rest.demo.routine.HttpMethodRequestService;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import org.junit.Assert;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.web.client.RestClient;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class HttpMethodRequestIT {
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
+public class HttpMethodRequestIT extends BaseTest {
 
-    @DubboReference
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private HttpMethodRequestService httpMethodRequestService;
 
     @Test
@@ -63,10 +58,9 @@
 
     @Test
     public void testGet() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/HttpRequestMethod/sayGet?name=world")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.get()
+                .uri(toUri("/HttpRequestMethod/sayGet?name=world"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
 
@@ -76,10 +70,9 @@
     @Test
     public void testPost() throws JsonProcessingException {
         String value = new ObjectMapper().writeValueAsString("world");
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.post()
-                .uri("http://" + providerAddress + ":50052/HttpRequestMethod/sayPost")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.post()
+                .uri(toUri("/HttpRequestMethod/sayPost"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(value)
                 .retrieve()
                 .toEntity(String.class);
@@ -89,10 +82,9 @@
 
     @Test
     public void testDel() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.delete()
-                .uri("http://" + providerAddress + ":50052/HttpRequestMethod/sayDelete?name=world")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.delete()
+                .uri(toUri("/HttpRequestMethod/sayDelete?name=world"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
 
@@ -101,10 +93,9 @@
 
     @Test
     public void testHeader() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<Void> result = defaultClient.head()
-                .uri("http://" + providerAddress + ":50052/HttpRequestMethod/sayHead?name=world")
-                .header("Content-type", "application/json")
+        ResponseEntity<Void> result = restClient.head()
+                .uri(toUri("/HttpRequestMethod/sayHead?name=world"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toBodilessEntity();
 
@@ -113,10 +104,9 @@
 
     @Test
     public void testPatch() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.patch()
-                .uri("http://" + providerAddress + ":50052/HttpRequestMethod/sayPatch?name=world")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.patch()
+                .uri(toUri("/HttpRequestMethod/sayPatch?name=world"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
 
@@ -125,23 +115,20 @@
 
     @Test
     public void testOptions() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.options()
-                .uri("http://" + providerAddress + ":50052/HttpRequestMethod/sayOptions?name=world")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.options()
+                .uri(toUri("/HttpRequestMethod/sayOptions?name=world"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
 
         Assert.assertEquals("Hello world", result.getBody());
     }
 
-
     @Test
     public void testPut() {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.put()
-                .uri("http://" + providerAddress + ":50052/HttpRequestMethod/sayPut?name=world")
-                .header("Content-type", "application/json")
+        ResponseEntity<String> result = restClient.put()
+                .uri(toUri("/HttpRequestMethod/sayPut?name=world"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
 
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/MappingRequestServiceIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/MappingRequestServiceIT.java
index 9c90da5..2e01991 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/MappingRequestServiceIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/MappingRequestServiceIT.java
@@ -19,202 +19,200 @@
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.rest.demo.routine.MappingRequestService;
 
-import org.codehaus.jackson.map.ObjectMapper;
 import org.junit.Assert;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.web.client.RestClient;
 
-import java.io.IOException;
+public class MappingRequestServiceIT extends BaseTest {
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class MappingRequestServiceIT {
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
-
-
-    @DubboReference
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private MappingRequestService mappingRequestService;
 
     @Test
-    public void test(){
+    public void test() {
         String result1 = mappingRequestService.testService("world");
-        Assert.assertEquals("Hello world",result1);
+        Assert.assertEquals("Hello world", result1);
 
         String result2 = mappingRequestService.testInterface("world");
-        Assert.assertEquals("Hello world",result2);
+        Assert.assertEquals("Hello world", result2);
 
         String result3 = mappingRequestService.testPathOne("world");
-        Assert.assertEquals("Hello world",result3);
+        Assert.assertEquals("Hello world", result3);
 
         int result4 = mappingRequestService.testPathInt(1);
-        Assert.assertEquals(1,result4);
+        Assert.assertEquals(1, result4);
 
-        String result5 = mappingRequestService.testPathParam("a","b");
-        Assert.assertEquals("ab",result5);
+        String result5 = mappingRequestService.testPathParam("a", "b");
+        Assert.assertEquals("ab", result5);
 
         String result6 = mappingRequestService.testPathTwo("world");
-        Assert.assertEquals("Hello world",result6);
+        Assert.assertEquals("Hello world", result6);
 
-        String result7 = mappingRequestService.testPathParamTwo("a","b");
-        Assert.assertEquals("ab",result7);
+        String result7 = mappingRequestService.testPathParamTwo("a", "b");
+        Assert.assertEquals("ab", result7);
 
         String result8 = mappingRequestService.testPathZero("world");
-        Assert.assertEquals("Hello world",result8);
+        Assert.assertEquals("Hello world", result8);
 
         String result9 = mappingRequestService.testPathAny("world");
-        Assert.assertEquals("Hello world",result9);
+        Assert.assertEquals("Hello world", result9);
 
         String result10 = mappingRequestService.testConsumesAJ("world");
-        Assert.assertEquals("Hello world",result10);
+        Assert.assertEquals("Hello world", result10);
 
         String result11 = mappingRequestService.testConsumesAll("world");
-        Assert.assertEquals("Hello world",result11);
+        Assert.assertEquals("Hello world", result11);
 
         String result12 = mappingRequestService.testProducesAJ("world");
-        Assert.assertEquals("Hello world",result12);
+        Assert.assertEquals("Hello world", result12);
 
         String result13 = mappingRequestService.testProducesAll("world");
-        Assert.assertEquals("Hello world",result13);
+        Assert.assertEquals("Hello world", result13);
     }
 
     @Test
-    public void testInterfacePath(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/path?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testInterfacePath() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/path?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testServicePath(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/servicePath?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testServicePath() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/servicePath?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testPathZero(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testPathZero() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testPathOne(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/say/?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testPathOne() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/say/?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testPathTwo(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/library/books?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testPathTwo() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/library/books?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
-    }
-    @Test
-    public void testPathParamTwo(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/library/{isbn}/{type}","ISN1111","CHINESE")
-                .header( "Content-type","text/plain")
-                .retrieve()
-                .toEntity(String.class);
-        Assert.assertEquals("ISN1111CHINESE",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testPathParam(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/foo{name}-{zip}bar","F","G")
-                .header( "Content-type","text/plain")
+    public void testPathParamTwo() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/library/{isbn}/{type}"), "ISN1111", "CHINESE")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("FG",response.getBody());
+        Assert.assertEquals("ISN1111CHINESE", response.getBody());
     }
 
     @Test
-    public void testPathInt(){
-        ResponseEntity<Integer> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/1/stuff")
-                .header( "Content-type","application/json")
+    public void testPathParam() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/foo{name}-{zip}bar"), "F", "G")
+                .accept(MediaType.TEXT_PLAIN)
+                .retrieve()
+                .toEntity(String.class);
+        Assert.assertEquals("FG", response.getBody());
+    }
+
+    @Test
+    public void testPathInt() {
+        ResponseEntity<Integer> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/1/stuff"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(Integer.class);
-        Assert.assertEquals(Integer.valueOf(1),response.getBody());
+        Assert.assertEquals(Integer.valueOf(1), response.getBody());
     }
 
     @Test
-    public void testPathAny(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/{name}/stuff","world")
-                .header( "Content-type","text/plain")
+    public void testPathAny() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/{name}/stuff"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testConsumeAj(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/consumeAj?name={name}","world")
-                .header( "Content-type","application/json")
+    public void testConsumeAj() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/consumeAj?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
-
-
     @Test
-    public void testConsumeAll(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/consumeAll?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testConsumeAll() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/consumeAll?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
-
-
     @Test
-    public void testProducesAJ() throws IOException {
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/producesAJ?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testProducesAJ() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/producesAJ?name={name}"), "world")
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
-        String value = new ObjectMapper().writeValueAsString("Hello world");
-        Assert.assertEquals(value,response.getBody());
+        Assert.assertEquals("\"Hello world\"", response.getBody());
     }
 
-
     @Test
-    public void testProducesAll(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/mapping/producesAll?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testProducesAll() {
+        ResponseEntity<String> response = RestClient.create()
+                .get()
+                .uri(toUri("/mapping/producesAll?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
-
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ParamTransferRequestIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ParamTransferRequestIT.java
index 8814098..ea671c6 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ParamTransferRequestIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ParamTransferRequestIT.java
@@ -19,193 +19,179 @@
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.rest.demo.pojo.User;
 import org.apache.dubbo.rest.demo.routine.ParamTransferRequestService;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.core.ParameterizedTypeReference;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.client.RestClient;
 
-import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class ParamTransferRequestIT {
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
+public class ParamTransferRequestIT extends BaseTest {
 
-
-    @DubboReference
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private ParamTransferRequestService paramTransferRequestService;
 
     @Test
-    public void test() throws IOException {
+    public void test() {
         String result1 = paramTransferRequestService.sayHello("world");
-        Assert.assertEquals("Hello world",result1);
+        Assert.assertEquals("Hello world", result1);
 
         String result2 = paramTransferRequestService.sayForm("world");
-        Assert.assertEquals("Hello world",result2);
+        Assert.assertEquals("Hello world", result2);
 
         String result3 = paramTransferRequestService.sayPath("1");
-        Assert.assertEquals("Hello 1",result3);
+        Assert.assertEquals("Hello 1", result3);
 
         String result4 = paramTransferRequestService.sayHeader("world");
-        Assert.assertEquals("Hello world",result4);
+        Assert.assertEquals("Hello world", result4);
 
         String result5 = paramTransferRequestService.sayCookie("1");
-        Assert.assertEquals("Hello 1",result5);
+        Assert.assertEquals("Hello 1", result5);
 
-        List<String> result6 = paramTransferRequestService.sayCookie(List.of("1","2"));
-        Assert.assertEquals(List.of("1","2"),result6);
+        List<String> result6 = paramTransferRequestService.sayCookie(List.of("1", "2"));
+        Assert.assertEquals(List.of("1", "2"), result6);
 
-        Map<String, String> result7 = paramTransferRequestService.sayCookie(Map.of("c1","c","c2","d"));
-        Assert.assertEquals(Map.of("c1","c","c2","d"),result7);
+        Map<String, String> result7 = paramTransferRequestService.sayCookie(Map.of("c1", "c", "c2", "d"));
+        Assert.assertEquals(Map.of("c1", "c", "c2", "d"), result7);
 
-        String result8 = paramTransferRequestService.sayHeader(Map.of("name","Hello"));
-        Assert.assertEquals("Hello",result8);
+        String result8 = paramTransferRequestService.sayHeader(Map.of("name", "Hello"));
+        Assert.assertEquals("Hello", result8);
 
         String result9 = paramTransferRequestService.sayNoAnnoParam("world");
-        Assert.assertEquals("world",result9);
+        Assert.assertEquals("world", result9);
 
-        String[] result10 = paramTransferRequestService.sayNoAnnoArrayParam(new String[]{"Hello","world"});
-        Assert.assertArrayEquals(new String[]{"Hello","world"},result10);
+        String[] result10 = paramTransferRequestService.sayNoAnnoArrayParam(new String[] {"Hello", "world"});
+        Assert.assertArrayEquals(new String[] {"Hello", "world"}, result10);
 
-        List<Long> result12 = paramTransferRequestService.sayList(List.of(1L,2L,3L));
-        Assert.assertEquals(List.of(1L,2L,3L),result12);
+        List<Long> result12 = paramTransferRequestService.sayList(List.of(1L, 2L, 3L));
+        Assert.assertEquals(List.of(1L, 2L, 3L), result12);
 
-        List<String> result13 = paramTransferRequestService.sayNoAnnoListParam(List.of("Hello","world"));
-        Assert.assertEquals(List.of("Hello","world"),result13);
+        List<String> result13 = paramTransferRequestService.sayNoAnnoListParam(List.of("Hello", "world"));
+        Assert.assertEquals(List.of("Hello", "world"), result13);
 
-        Map<String, String> result14 = paramTransferRequestService.sayNoAnnoStringMapParam(Map.of("a","world","b","hello"));
-        Assert.assertEquals(Map.of("a","world","b","hello"),result14);
+        Map<String, String> result14 = paramTransferRequestService.sayNoAnnoStringMapParam(Map.of("a", "world", "b", "hello"));
+        Assert.assertEquals(Map.of("a", "world", "b", "hello"), result14);
 
         String result15 = paramTransferRequestService.sayPath("1");
-        Assert.assertEquals("Hello 1",result15);
+        Assert.assertEquals("Hello 1", result15);
 
-        List<String> result16 = paramTransferRequestService.sayQueryList(List.of("Hello ","world"));
-        Assert.assertEquals(List.of("Hello ","world"),result16);
+        List<String> result16 = paramTransferRequestService.sayQueryList(List.of("Hello ", "world"));
+        Assert.assertEquals(List.of("Hello ", "world"), result16);
 
-        Map<String, String> result18 = paramTransferRequestService.sayQueryMap(Map.of("a","world","b","hello"));
-        Assert.assertEquals(Map.of("a","world","b","hello"),result18);
+        Map<String, String> result18 = paramTransferRequestService.sayQueryMap(Map.of("a", "world", "b", "hello"));
+        Assert.assertEquals(Map.of("a", "world", "b", "hello"), result18);
 
-        Map<String, List<String>> result19 = paramTransferRequestService.sayQueryStringMap(Map.of("arg1",List.of("Hello","world"),"arg2",List.of("!")));
-        Assert.assertEquals(Map.of("arg1",List.of("Hello","world"),"arg2",List.of("!")),result19);
+        Map<String, List<String>> result19 = paramTransferRequestService.sayQueryStringMap(Map.of("arg1", List.of("Hello", "world"), "arg2", List.of("!")));
+        Assert.assertEquals(Map.of("arg1", List.of("Hello", "world"), "arg2", List.of("!")), result19);
 
-        Map<String, String> result20 = paramTransferRequestService.sayStringMap(Map.of("Hello","world"));
-        Assert.assertEquals(Map.of("Hello","world"),result20);
+        Map<String, String> result20 = paramTransferRequestService.sayStringMap(Map.of("Hello", "world"));
+        Assert.assertEquals(Map.of("Hello", "world"), result20);
 
         User result21 = paramTransferRequestService.sayUser(new User(1L, "1", 1));
-        Assert.assertEquals(new User(1L,"1",1),result21);
+        Assert.assertEquals(new User(1L, "1", 1), result21);
     }
 
-
     @Test
-    public void testQuery(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/query?name={name}","world")
-                .header( "Content-type","text/plain")
+    public void testQuery() {
+        ResponseEntity<String> response = restClient.get()
+                .uri(toUri("/param/query?name={name}"), "world")
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testQueryList(){
-        ResponseEntity<List<String>> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/queryList?name={name}&name={name}","Hello ","world")
-                .header( "Content-type","application/json")
+    public void testQueryList() {
+        ResponseEntity<List<String>> response = restClient.get()
+                .uri(toUri("/param/queryList?name={name}&name={name}"), "Hello ", "world")
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<String>>() {});
-        Assert.assertEquals(List.of("Hello ","world"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(List.of("Hello ", "world"), response.getBody());
     }
 
     @Test
-    public void testQueryStringMap(){
-        ResponseEntity<Map<String,List<String>>> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/queryStringMap?arg1=Hello&arg1=world&arg2=!")
-                .header( "Content-type","application/json")
+    public void testQueryStringMap() {
+        ResponseEntity<Map<String, List<String>>> response = restClient.get()
+                .uri(toUri("/param/queryStringMap?arg1=Hello&arg1=world&arg2=!"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<Map<String,List<String>>>() {});
-        Assert.assertEquals(Map.of("arg1",List.of("Hello","world"),"arg2",List.of("!")),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(Map.of("arg1", List.of("Hello", "world"), "arg2", List.of("!")), response.getBody());
 
     }
 
     @Test
-    public void testQueryMap(){
-        ResponseEntity<Map<String,String>> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/queryMap?a=world&b=hello")
-                .header( "Content-type","application/json")
+    public void testQueryMap() {
+        ResponseEntity<Map<String, String>> response = restClient.get()
+                .uri(toUri("/param/queryMap?a=world&b=hello"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<Map<String, String>>() {
-                });
-        Assert.assertEquals(Map.of("a","world","b","hello"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(Map.of("a", "world", "b", "hello"), response.getBody());
     }
 
     @Test
-    public void testNoAnnoParam(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/noAnnoParam?name={name}","world")
+    public void testNoAnnoParam() {
+        ResponseEntity<String> response = restClient.get()
+                .uri(toUri("/param/noAnnoParam?name={name}"), "world")
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("world",response.getBody());
+        Assert.assertEquals("world", response.getBody());
     }
 
     @Test
-    public void testNoAnnoListParam(){
-        ResponseEntity<List<String>> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/noAnnoListParam?value={value}&value={value}","Hello ","world")
+    public void testNoAnnoListParam() {
+        ResponseEntity<List<String>> response = restClient.get()
+                .uri(toUri("/param/noAnnoListParam?value={value}&value={value}"), "Hello ", "world")
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<String>>() {});
-        Assert.assertEquals(List.of("Hello ","world"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(List.of("Hello ", "world"), response.getBody());
     }
 
     @Test
-    public void testNoAnnoArrayParam(){
-        ResponseEntity<String[]> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/noAnnoArrayParam?value=Hello&value=world")
-                .header( "Content-type","application/json")
+    public void testNoAnnoArrayParam() {
+        ResponseEntity<String[]> response = restClient.get()
+                .uri(toUri("/param/noAnnoArrayParam?value=Hello&value=world"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<String[]>() {
-                });
-        Assert.assertArrayEquals(new String[]{"Hello","world"}, response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertArrayEquals(new String[] {"Hello", "world"}, response.getBody());
 
     }
 
     @Test
-    public void testNoAnnoStringMap(){
-        ResponseEntity<Map<String,String>> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/noAnnoStringMapParam?a=world&b=hello")
-                .header( "Content-type","application/json")
+    public void testNoAnnoStringMap() {
+        ResponseEntity<Map<String, String>> response = restClient.get()
+                .uri(toUri("/param/noAnnoStringMapParam?a=world&b=hello"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<Map<String, String>>() {
-                });
-        Assert.assertEquals(Map.of("a","world","b","hello"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(Map.of("a", "world", "b", "hello"), response.getBody());
     }
 
-
     @Test
-    public void testPath(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/path/1")
-                .header( "Content-type","text/plain")
+    public void testPath() {
+        ResponseEntity<String> response = restClient.get()
+                .uri(toUri("/param/path/1"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello 1",response.getBody());
+        Assert.assertEquals("Hello 1", response.getBody());
     }
 
     @Test
-    public void testFrom(){
+    public void testFrom() {
         MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
-        map.add("form","world");
-        ResponseEntity<String> response = RestClient.create().post()
-                .uri("http://" + providerAddress + ":50052/param/form")
+        map.add("form", "world");
+        ResponseEntity<String> response = restClient.post()
+                .uri(toUri("/param/form"))
                 .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .body(map)
                 .retrieve()
@@ -215,153 +201,145 @@
     }
 
     @Test
-    public void testHeader(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/header")
-                .header( "Content-type","text/plain")
-                .header("name","world")
+    public void testHeader() {
+        ResponseEntity<String> response = restClient.get()
+                .uri(toUri("/param/header"))
+                .accept(MediaType.TEXT_PLAIN)
+                .header("name", "world")
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello world",response.getBody());
+        Assert.assertEquals("Hello world", response.getBody());
     }
 
     @Test
-    public void testHeaderMap(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/header/map")
-                .header("name","Hello")
+    public void testHeaderMap() {
+        ResponseEntity<String> response = restClient.get()
+                .uri(toUri("/param/header/map"))
+                .header("name", "Hello")
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello",response.getBody());
+        Assert.assertEquals("Hello", response.getBody());
     }
 
     @Test
-    public void testCookie(){
-        ResponseEntity<String> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/cookie")
-                .header( "Content-type","text/plain")
-                .header( "Cookie","cookieId=1")
+    public void testCookie() {
+        ResponseEntity<String> response = restClient.get()
+                .uri(toUri("/param/cookie"))
+                .accept(MediaType.TEXT_PLAIN)
+                .header("Cookie", "cookieId=1")
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("Hello 1",response.getBody());
+        Assert.assertEquals("Hello 1", response.getBody());
     }
 
     @Test
-    public void testCookieList(){
-        ResponseEntity<List<String>> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/cookie/list")
-                .header( "Cookie","cookieId=1")
+    public void testCookieList() {
+        ResponseEntity<List<String>> response = restClient.get()
+                .uri(toUri("/param/cookie/list"))
+                .header("Cookie", "cookieId=1")
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<String>>() {
-                });
-        Assert.assertEquals(List.of("1"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(List.of("1"), response.getBody());
     }
 
     @Test
-    public void testCookieMap(){
-        ResponseEntity<Map<String,String>> response = RestClient.create().get()
-                .uri("http://" + providerAddress + ":50052/param/cookie/map")
-                .header( "Cookie","c1=c")
+    public void testCookieMap() {
+        ResponseEntity<Map<String, String>> response = restClient.get()
+                .uri(toUri("/param/cookie/map"))
+                .header("Cookie", "c1=c")
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<Map<String, String>>() {
-                });
-        Assert.assertEquals(Map.of("c1","c"),response.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(Map.of("c1", "c"), response.getBody());
     }
 
     @Test
-    public void testMatrix(){
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/param/matrix;m=name=world")
-                .header("Content-type", "application/json")
+    public void testMatrix() {
+        ResponseEntity<String> result = restClient.get()
+                .uri(toUri("/param/matrix/string/m;name=world"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
         Assert.assertEquals("Hello world", result.getBody());
     }
 
     @Test
-    public void testMatrixList(){
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<List<String>> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/param/matrix/list;m=list=Hello;list=world")
-                .header("Content-type", "application/json")
+    public void testMatrixList() {
+        ResponseEntity<List<String>> result = restClient.get()
+                .uri(toUri("/param/matrix/list/m;name=Hello;name=world"))
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<String>>() {
-                });
-        Assert.assertEquals(List.of("Hello","world"), result.getBody());
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(List.of("Hello", "world"), result.getBody());
     }
 
     @Test
-    public void testMatrixMap(){
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/param/matrix;m=name=world")
-                .header("Content-type", "application/json")
+    public void testMatrixMap() {
+        ResponseEntity<String> result = restClient.get()
+                .uri(toUri("/param/matrix/map/m;name=world"))
+                .accept(MediaType.APPLICATION_JSON)
+                .retrieve()
+                .toEntity(String.class);
+        Assert.assertEquals("{\"name\":[\"world\"]}", result.getBody());
+    }
+
+    @Test
+    public void testBodyUser() {
+        ResponseEntity<User> response = restClient.post()
+                .uri(toUri("/param/bodyUser"))
+                .contentType(MediaType.APPLICATION_JSON)
+                .body(new User(1L, "1", 1))
+                .retrieve()
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(new User(1L, "1", 1), response.getBody());
+    }
+
+    @Test
+    public void testBodyList() {
+        ResponseEntity<List<Long>> response = restClient.post()
+                .uri(toUri("/param/bodyList"))
+                .contentType(MediaType.APPLICATION_JSON)
+                .body(List.of(1L, 2L, 3L))
+                .retrieve()
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(List.of(1L, 2L, 3L), response.getBody());
+    }
+
+    @Test
+    public void testBodyStringMap() {
+        ResponseEntity<Map<String, String>> response = restClient.post()
+                .uri(toUri("/param/bodyStringMap"))
+                .contentType(MediaType.APPLICATION_JSON)
+                .body(Map.of("Hello", "world"))
+                .retrieve()
+                .toEntity(new ParameterizedTypeReference<>() {});
+        Assert.assertEquals(Map.of("Hello", "world"), response.getBody());
+    }
+
+    @Test
+    public void testHttp() {
+        ResponseEntity<String> result = restClient.get()
+                .uri(toUri("/param/http"))
+                .accept(MediaType.TEXT_PLAIN)
+                .header("name", "Hello world")
                 .retrieve()
                 .toEntity(String.class);
         Assert.assertEquals("Hello world", result.getBody());
     }
 
     @Test
-    public void testBodyUser(){
-        ResponseEntity<User> response = RestClient.create().post()
-                .uri("http://" + providerAddress + ":50052/param/bodyUser" )
-                .header( "Content-type","application/json")
-                .body(new User(1L,"1",1))
-                .retrieve()
-                .toEntity(new ParameterizedTypeReference<User>() {});
-        Assert.assertEquals(new User(1L,"1",1),response.getBody());
-    }
-
-    @Test
-    public void testBodyList(){
-        ResponseEntity<List<Long>> response = RestClient.create().post()
-                .uri("http://" + providerAddress + ":50052/param/bodyList" )
-                .header( "Content-type","application/json")
-                .body(List.of(1L,2L,3L))
-                .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<Long>>() {});
-        Assert.assertEquals(List.of(1L,2L,3L),response.getBody());
-    }
-    @Test
-    public void testBodyStringMap(){
-        ResponseEntity<Map<String,String>> response = RestClient.create().post()
-                .uri("http://" + providerAddress + ":50052/param/bodyStringMap" )
-                .header( "Content-type","application/json")
-                .body(Map.of("Hello","world"))
-                .retrieve()
-                .toEntity(new ParameterizedTypeReference<Map<String,String>>() {});
-        Assert.assertEquals(Map.of("Hello","world"),response.getBody());
-    }
-
-    @Test
-    public void testHttp(){
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/param/http")
-                .header("Content-type", "application/json")
-                .header("name","Hello world")
-                .retrieve()
-                .toEntity(String.class);
-        Assert.assertEquals("Hello world", result.getBody());
-    }
-
-    @Test
-    public void testHttpMethod(){
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.get()
-                .uri("http://" + providerAddress + ":50052/param/httpMethod")
-                .header("Content-type", "application/json")
+    public void testHttpMethod() {
+        ResponseEntity<String> result = restClient.get()
+                .uri(toUri("/param/httpMethod"))
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
         Assert.assertEquals("GET", result.getBody());
     }
 
     @Test
-    public void testOutPut() throws IOException {
-        RestClient defaultClient = RestClient.create();
-        ResponseEntity<String> result = defaultClient.post()
-                .uri("http://" + providerAddress + ":50052/param/output")
+    public void testOutPut() {
+        ResponseEntity<String> result = restClient.post()
+                .uri(toUri("/param/output"))
                 .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                 .retrieve()
                 .toEntity(String.class);
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/README.md b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/README.md
index bec255d..f228606 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/README.md
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/README.md
@@ -1,34 +1,23 @@
 # Dubbo Triple Rest Spring Web Example
 
-This example shows how to use Spring Web annotation to add rest-style access to triple protocol.
+This example shows how to export rest API using the spring web annotation in triple protocol.
 
-# How to run
+## How to run
 
-## Start Zookeeper
-This example replies on Zookeeper(3.8.0+) as service discovery registry center, so you need to run the Zookeeper server first, there are two ways to do so:
-1. [Download zookeeper binary and start it directly](https://dubbo-next.staged.apache.org/zh-cn/overview/reference/integrations/zookeeper/#本地下载)
-2. [Start zookeeper using docker](https://dubbo-next.staged.apache.org/zh-cn/overview/reference/integrations/zookeeper/#docker)
-
-## Install dependencies
-Step into 'dubbo-samples-triple-rest' directory, run the following command:
-
-```shell
-$ mvn clean install
-```
-
-## Start provider
 Step into 'dubbo-samples-triple-rest-springmvc' directory
-
 then, run the following command to start application:
+
 ```shell
-$ mvn compile exec:java -Dexec.mainClass="org.apache.dubbo.rest.demo.SpringmvcRestApplication"
+mvn spring-boot:run
 ```
 
 Run the following command to see server works as expected:
+
 ```shell
-curl \
-    --header "Content-Type: application/json" \
-    'http://localhost:50052/demo/hello?name=world'
+# Passing parameter via query string
+curl 'http://localhost:50052/demo/hello?name=world'
+# Expected output: "Hello world"
+# With double quotes because the default output content-type is 'application/json'
 ```
 
 Or, you can visit the following link by using web browser: `http://localhost:50052/demo/hello?name=world`
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-configuration.yml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-configuration.yml
index 6f86892..a3eebd7 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-configuration.yml
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-configuration.yml
@@ -15,30 +15,13 @@
 # limitations under the License.
 
 services:
-  nacos:
-    image: nacos/nacos-server:${nacos-server.version:2.0.0}
-    environment:
-      - PREFER_HOST_MODE=hostname
-      - MODE=standalone
-      - NACOS_AUTH_ENABLE=true
-      - JVM_XMS=512m
-      - JVM_XMX=512m
-      - JVM_XMN=256m
-
-  springmvc-provider:
+  provider:
     type: app
     basedir: .
     mainClass: org.apache.dubbo.rest.demo.SpringmvcRestApplication
-    systemProps:
-      - nacos.address=nacos
-      - nacos.port=8848
-    waitPortsBeforeRun:
-      - nacos:8848
     checkPorts:
       - 50052
-    checkLog: "Current Spring Boot Application is await..."
-    depends_on:
-      - nacos
+    checkLog: "dubbo service started"
 
   test:
     type: test
@@ -46,12 +29,8 @@
     tests:
       - "**/*IT.class"
     systemProps:
-      - nacos.address=nacos
-      - nacos.port=8848
-      - dubbo.address=springmvc-provider
+      - dubbo.address=provider
     waitPortsBeforeRun:
-      - nacos:8848
-      - springmvc-provider:50052
+      - provider:50052
     depends_on:
-      - nacos
-      - springmvc-provider
+      - provider
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-versions.conf b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-versions.conf
index 82aeb45..f2f919d 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-versions.conf
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/case-versions.conf
@@ -1,21 +1,19 @@
 #
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-#   Licensed to the Apache Software Foundation (ASF) under one or more
-#   contributor license agreements.  See the NOTICE file distributed with
-#   this work for additional information regarding copyright ownership.
-#   The ASF licenses this file to You under the Apache License, Version 2.0
-#   (the "License"); you may not use this file except in compliance with
-#   the License.  You may obtain a copy of the License at
+#     http://www.apache.org/licenses/LICENSE-2.0
 #
-#       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.
 #
-#   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.
-#
-
 
 # Supported component versions of the test case
 
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/pom.xml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/pom.xml
index dda55bb..5e36288 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/pom.xml
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/pom.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -14,96 +15,53 @@
   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>
-        <artifactId>dubbo-samples-triple-rest</artifactId>
-        <groupId>org.apache.dubbo</groupId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
+<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>
+  <parent>
+    <artifactId>dubbo-samples-triple-rest</artifactId>
+    <groupId>org.apache.dubbo</groupId>
+    <version>1.0.0-SNAPSHOT</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
 
-    <artifactId>dubbo-samples-triple-rest-springmvc</artifactId>
+  <artifactId>dubbo-samples-triple-rest-springmvc</artifactId>
 
-    <dependencies>
-        <!-- dubbo -->
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-spring-boot-starter</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
-            <version>3.3.0-beta.2</version>
-        </dependency>
+  <dependencies>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.dubbo</groupId>
+      <artifactId>dubbo-spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-log4j2</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework</groupId>
+      <artifactId>spring-web</artifactId>
+    </dependency>
 
-        <!-- spring web annotation support -->
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-context</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework</groupId>
-            <artifactId>spring-web</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.alibaba.spring</groupId>
-            <artifactId>spring-context-support</artifactId>
-            <version>1.0.11</version>
-        </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-databind</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
 
-        <!-- spring boot starter -->
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-log4j2</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-test</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-        <!-- https://mvnrepository.com/artifact/org.json/json -->
-        <dependency>
-            <groupId>org.json</groupId>
-            <artifactId>json</artifactId>
-            <version>20231013</version>
-        </dependency>
-        <dependency>
-            <groupId>javax.ws.rs</groupId>
-            <artifactId>javax.ws.rs-api</artifactId>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-maven-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <compilerArgs>
-                        <compilerArg>-proc:none</compilerArg>
-                    </compilerArgs>
-                    <!--新增-->
-                    <parameters>true</parameters>
-                    <source>17</source>
-                    <target>17</target>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-maven-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
 </project>
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/DemoService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
index 9c6ee7f..f2d98e6 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/DemoService.java
@@ -17,8 +17,10 @@
 package org.apache.dubbo.rest.demo;
 
 import org.apache.dubbo.rest.demo.pojo.User;
+
+import java.util.List;
+
 import org.springframework.http.MediaType;
-import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -30,69 +32,67 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
-import java.util.HashMap;
-import java.util.List;
 
 @RequestMapping("/demo")
 public interface DemoService {
 
+    @RequestMapping("/hello")
+    String hello(@RequestParam String name);
+
     @GetMapping(value = "get/param")
-    public String getParam(@RequestParam(value = "id")String id);
+    String getParam(@RequestParam String id);
 
     @GetMapping(value = "get/variable/{id}")
-    public String getVariable(@PathVariable(value = "id")String id);
+    String getVariable(@PathVariable String id);
 
     @GetMapping(value = "get/muchParam")
-    public String getMuchParam(@RequestParam(value = "id")String id, @RequestParam(value = "name")String name);
+    String getMuchParam(@RequestParam String id, @RequestParam String name);
 
     @GetMapping(value = "get/muchVariable/{id}/{name}")
-    public String getMuchVariable(@PathVariable(value = "id")String id, @PathVariable(value = "name")String name);
+    String getMuchVariable(@PathVariable String id, @PathVariable String name);
 
     @GetMapping(value = "get/reg/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")
-    public String getReg(@PathVariable(value = "name")String name, @PathVariable(value = "version")String version, @PathVariable(value = "ext")String ext);
+    String getReg(@PathVariable String name, @PathVariable String version, @PathVariable String ext);
 
     @PostMapping(value = "post/body")
-    public String postBody(@RequestBody String name);
+    String postBody(@RequestBody String name);
 
     @PostMapping(value = "post/param")
-    public String postParam(@RequestParam(value = "id")String id);
+    String postParam(@RequestParam String id);
 
     @PostMapping(value = "post/variable/{id}")
-    public String postVariable(@PathVariable(value = "id")String id);
+    String postVariable(@PathVariable String id);
 
-    @PostMapping(value = "post/useConsumes", consumes = "application/json")
-    public String postUseConsumes(@RequestBody String id);
+    @PostMapping(value = "post/useConsumes", consumes = MediaType.APPLICATION_JSON_VALUE)
+    String postUseConsumes(@RequestBody String id);
 
     @RequestMapping(value = "/error", method = RequestMethod.GET, consumes = MediaType.TEXT_PLAIN_VALUE)
     String error();
 
     @PostMapping(value = "post/useParams", params = "myParam=myValue")
-    public String postUseParams(@RequestBody String id);
+    String postUseParams(@RequestBody String id);
 
     @GetMapping(value = "get/head/{id}", headers = "myHeader=myValue")
-    public String getHead(@PathVariable(value = "id")String id);
+    String getHead(@PathVariable String id);
 
-    @PostMapping(value = "post/useConsumes/formData", consumes = "application/x-www-form-urlencoded")
-    // 使用MultiValueMap 会显示反序列化失败 ?
-    // 但是使用hashmap又不支持 因为声明为 application/x-www-form-urlencoded
-    public String postUseConsumesFormData(@RequestBody MultiValueMap<String, String> formData);
+    @PostMapping(value = "post/useConsumes/formData", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    String postUseConsumesFormData(@RequestBody MultiValueMap<String, String> formData);
 
-    // content type为"application/x-www-form-urlencoded"时body的类型必须是MultiValueMap类型
-    @PostMapping(value = "post/useConsumes/user", consumes = "application/x-www-form-urlencoded", produces = MediaType.TEXT_PLAIN_VALUE)
+    @PostMapping(value = "post/useConsumes/user", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.TEXT_PLAIN_VALUE)
     String postUseConsumesUser(@RequestBody MultiValueMap<String, List<User>> formData);
 
     // HashMap<String, User> -> JSON
-    @PostMapping(value = "post/map/user", consumes = "application/json")
-    public String postMapUser(@RequestBody String formData);
+    @PostMapping(value = "post/map/user", consumes = MediaType.APPLICATION_JSON_VALUE)
+    String postMapUser(@RequestBody String formData);
 
     @PutMapping("/put/update/{id}")
-    public String putUpdateId(@PathVariable String id);
+    String putUpdateId(@PathVariable String id);
 
     @DeleteMapping("/delete/{id}")
-    public String deleteId(@PathVariable(value = "id")String id);
+    String deleteId(@PathVariable String id);
 
     @PatchMapping("patch/{id}")
-    public String patchById(@PathVariable String id, @RequestBody String patchData);
+    String patchById(@PathVariable String id, @RequestBody String patchData);
 
     @RequestMapping(method = RequestMethod.GET, value = "/primitive")
     int primitiveInt(@RequestParam("a") int a, @RequestParam("b") int b);
@@ -107,7 +107,6 @@
     long primitiveShort(@RequestParam("a") short a, @RequestParam("b") Long b, @RequestBody int c);
 
     @PostMapping(value = "/post/list", consumes = MediaType.ALL_VALUE)
-    public List<User> postList(@RequestBody List<User> users);
-
+    List<User> postList(@RequestBody List<User> users);
 
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/SpringmvcRestApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/SpringmvcRestApplication.java
index 154f569..23ca250 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/SpringmvcRestApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/SpringmvcRestApplication.java
@@ -17,15 +17,17 @@
 
 package org.apache.dubbo.rest.demo;
 
-
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 @EnableDubbo
 public class SpringmvcRestApplication {
+
     public static void main(String[] args) {
         SpringApplication.run(SpringmvcRestApplication.class, args);
+        System.out.println("dubbo service started");
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/consumer/Task.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/consumer/Task.java
deleted file mode 100644
index 1f7df8a..0000000
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/consumer/Task.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.dubbo.rest.demo.consumer;
-
-import org.apache.dubbo.config.annotation.DubboReference;
-import org.apache.dubbo.rest.demo.DemoService;
-import org.springframework.boot.CommandLineRunner;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Component;
-import org.springframework.web.client.RestClient;
-
-@Component
-public class Task implements CommandLineRunner {
-    @DubboReference
-    private DemoService demoService;
-
-    @Override
-    public void run(String... args) throws Exception {
-//        System.out.println("Receive result ======> " + proxyHello());
-//        System.out.println("Receive rest result ======> " + restHello());
-    }
-
-//    private String proxyHello() {
-//        return demoService.sayHello("world");
-//    }
-//
-//    private String restHello() {
-//        RestClient defaultClient = RestClient.create();
-//        ResponseEntity<String> result = defaultClient.get()
-//                .uri("http://localhost:50052/demo/hello?name=world")
-//                .header("Content-type", "application/json")
-//                .retrieve()
-//                .toEntity(String.class);
-//        return result.getBody();
-//    }
-}
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java
index ffb7fa4..6abcd88 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterService.java
@@ -16,14 +16,13 @@
  */
 package org.apache.dubbo.rest.demo.expansion.filter;
 
-import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 
 @RequestMapping(value = "/filter")
 public interface FilterService {
-    @GetMapping(value = "/get/{name}", consumes = "application/json", produces = MediaType.TEXT_PLAIN_VALUE)
-    public String filterGet(@PathVariable(value = "name") String name);
+
+    @GetMapping(value = "/get/{name}")
+    String filterGet(@PathVariable(value = "name") String name);
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java
index 4ce6aa1..b51e2ab 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/expansion/filter/FilterServiceImpl.java
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 package org.apache.dubbo.rest.demo.expansion.filter;
+
 import org.apache.dubbo.config.annotation.DubboService;
 
 @DubboService
-public class FilterServiceImpl implements FilterService{
+public class FilterServiceImpl implements FilterService {
 
     @Override
     public String filterGet(String name) {
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java
index bb3137d..3dc2bb7 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/pojo/User.java
@@ -15,11 +15,12 @@
  * limitations under the License.
  */
 package org.apache.dubbo.rest.demo.pojo;
+
 import java.io.Serializable;
 import java.util.Objects;
 
 // 需要 implements Serializable
-public class User implements Serializable{
+public class User implements Serializable {
 
     private Long id;
 
@@ -27,18 +28,18 @@
 
     private Integer age;
 
-    public User(Long id, String name){
+    public User(Long id, String name) {
         this.id = id;
         this.name = name;
     }
 
-    public User(Long id, String name, Integer age){
+    public User(Long id, String name, Integer age) {
         this.id = id;
         this.name = name;
         this.age = age;
     }
 
-    public User(){
+    public User() {
 
     }
 
@@ -70,7 +71,7 @@
         User user = new User();
         user.setAge(18);
         user.setName("dubbo");
-        user.setId(404l);
+        user.setId(404L);
         return user;
     }
 
@@ -96,7 +97,7 @@
         return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}';
     }
 
-    public String stringToJson(){
+    public String stringToJson() {
         return "{\"id\":\"" + this.id + "\", \"name\":\"" + this.name + "\"}";
     }
 
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/provider/DemoServiceImpl.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/provider/DemoServiceImpl.java
index 6b6fdc2..f0e3b5b 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/provider/DemoServiceImpl.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/java/org/apache/dubbo/rest/demo/provider/DemoServiceImpl.java
@@ -16,112 +16,115 @@
  */
 package org.apache.dubbo.rest.demo.provider;
 
-import com.alibaba.fastjson2.TypeReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.apache.dubbo.rest.demo.DemoService;
 import org.apache.dubbo.rest.demo.pojo.User;
-import org.json.JSONObject;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
+
 import java.util.HashMap;
 import java.util.List;
 
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import com.alibaba.fastjson2.TypeReference;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+
 @DubboService
 public class DemoServiceImpl implements DemoService {
-    private static final String prefix = "hello ";
+
+    private static final String PREFIX = "Hello ";
+
+    @Override
+    public String hello(String name) {
+        return PREFIX + name;
+    }
 
     @Override
     public String getParam(String id) {
-        return prefix + id;
+        return PREFIX + id;
     }
 
     @Override
     public String getVariable(String id) {
-        return prefix + id;
+        return PREFIX + id;
     }
 
     @Override
     public String getMuchParam(String id, String name) {
-        return prefix + id + " " + name;
+        return PREFIX + id + " " + name;
     }
 
     @Override
     public String getMuchVariable(String id, String name) {
-        return prefix + id + " " + name;
+        return PREFIX + id + " " + name;
     }
 
     @Override
     public String getReg(String name, String version, String ext) {
-        return prefix + name + " " +  version + " " + ext;
+        return PREFIX + name + " " + version + " " + ext;
     }
 
     @Override
     public String postBody(String name_json) {
-        JSONObject jsonObject = new JSONObject(name_json);
-        return prefix + jsonObject.getString("name");
+        JSONObject jsonObject = JSON.parseObject(name_json);
+        return PREFIX + jsonObject.getString("name");
     }
 
     @Override
     public String postParam(String id) {
-        return prefix + id;
+        return PREFIX + id;
     }
 
     @Override
     public String postVariable(String id) {
-        return prefix + id;
+        return PREFIX + id;
     }
 
     @Override
     public String postUseConsumes(String id) {
-        JSONObject jsonObject = new JSONObject(id);
-        return prefix + jsonObject.getString("id");
+        JSONObject jsonObject = JSON.parseObject(id);
+        return PREFIX + jsonObject.getString("id");
     }
 
     @Override
     public String postUseParams(String id) {
-        JSONObject jsonObject = new JSONObject(id);
-        return prefix + jsonObject.getString("id");
+        JSONObject jsonObject = JSON.parseObject(id);
+        return PREFIX + jsonObject.getString("id");
     }
 
     @Override
     public String getHead(String id) {
-        return prefix + id;
+        return PREFIX + id;
     }
 
     @Override
     public String postUseConsumesFormData(MultiValueMap<String, String> formData) {
-        return prefix + formData.get("id").get(0) + " " + formData.get("name").get(0);
+        return PREFIX + formData.get("id").get(0) + " " + formData.get("name").get(0);
     }
 
     @Override
     public String postMapUser(String formData) {
-        HashMap<String, User> userHashMap = com.alibaba.fastjson2.JSONObject.parseObject(formData, new TypeReference<HashMap<String, User>>() {
-            @Override
-            public HashMap<String, User> parseObject(String text) {
-                return super.parseObject(text);
-            }
-        });
-
-        return prefix + userHashMap.get("user1").getId() + " " + userHashMap.get("user2").getId();
+        HashMap<String, User> userHashMap = JSON.parseObject(formData, new TypeReference<>() {});
+        return PREFIX + userHashMap.get("user1").getId() + " " + userHashMap.get("user2").getId();
     }
 
     @Override
-    public String putUpdateId(@PathVariable String id){
-        return prefix + id;
+    public String putUpdateId(@PathVariable String id) {
+        return PREFIX + id;
     }
 
     @Override
-    public String deleteId(@PathVariable(value = "id")String id){
-        return prefix + id;
+    public String deleteId(@PathVariable(value = "id") String id) {
+        return PREFIX + id;
     }
 
     @Override
-    public String patchById(@PathVariable String id, @RequestBody String patchData){
-        JSONObject jsonObject = new JSONObject(patchData);
+    public String patchById(@PathVariable String id, @RequestBody String patchData) {
+        JSONObject jsonObject = JSON.parseObject(patchData);
         String name = jsonObject.getString("name");
 
-        return prefix + id + " " + name;
+        return PREFIX + id + " " + name;
     }
 
     @Override
@@ -130,8 +133,8 @@
     }
 
     @Override
-    public String postUseConsumesUser(@RequestBody MultiValueMap<String, List<User>> formData){
-        return prefix + formData.get("user1").get(0).get(0).getName();
+    public String postUseConsumesUser(@RequestBody MultiValueMap<String, List<User>> formData) {
+        return PREFIX + formData.get("user1").get(0).get(0).getName();
     }
 
     @Override
@@ -155,7 +158,7 @@
     }
 
     @Override
-    public List<User> postList(List<User> users){
+    public List<User> postList(List<User> users) {
         return users;
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/resources/application.yml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/resources/application.yml
index 2d332cd..e95e21c 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/resources/application.yml
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/resources/application.yml
@@ -13,15 +13,16 @@
 # 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.
-server:
-    port: 8081
+
+spring:
+  application:
+    name: dubbo-springboot-triple-rest-springmvc
 dubbo:
   application:
-      name: dubbo-springboot-triple-rest-springmvc
-      qos-port: 33333
-  registry:
-    address: nacos://${nacos.address:localhost}:8848?username=nacos&password=nacos
+    name: ${spring.application.name}
+    qos-enable: false
   protocol:
-      name: tri
-      port: 50052
-      serialization: fastjson2
+    name: tri
+    port: 50052
+    triple:
+      verbose: true
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/resources/log4j2.xml b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..f21b6cb
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/main/resources/log4j2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="%style{%d{HH:mm:ss.SSS}}{Magenta} %style{|-}{White}%highlight{%-5p} [%t] %style{%40.40c}{Cyan}:%style{%-3L}{Blue} %style{-|}{White} %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect)}" disableAnsi="false" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+        <Logger name="org.apache.dubbo.rpc.protocol.tri" level="debug"/>
+        <Logger name="org.apache.dubbo.remoting.http12" level="debug"/>
+        <Logger name="org.apache.dubbo.config" level="warn"/>
+    </Loggers>
+</Configuration>
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/BaseTest.java
similarity index 66%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/BaseTest.java
index 1a58d84..63c2bcb 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/BaseTest.java
@@ -18,14 +18,19 @@
 package org.apache.dubbo.rest.demo.test;
 
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
 
-@SpringBootApplication
+import org.junit.runner.RunWith;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.web.client.RestClient;
+
 @EnableDubbo
-public class ConsumerApplication {
+@RunWith(SpringRunner.class)
+public abstract class BaseTest {
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    protected static final String HOST = System.getProperty("dubbo.address", "localhost");
+    protected final RestClient restClient = RestClient.create();
+
+    protected static String toUri(String path) {
+        return "http://" + HOST + ":50052/" + path;
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
deleted file mode 100644
index 1a58d84..0000000
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.dubbo.rest.demo.test;
-
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
-
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
-    }
-}
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerIT.java b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerIT.java
index d3a8684..e4257a5 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerIT.java
+++ b/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-springmvc/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerIT.java
@@ -16,387 +16,358 @@
  */
 package org.apache.dubbo.rest.demo.test;
 
-import com.alibaba.fastjson2.JSON;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.rest.demo.DemoService;
 import org.apache.dubbo.rest.demo.expansion.filter.FilterService;
 import org.apache.dubbo.rest.demo.pojo.User;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.core.ParameterizedTypeReference;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.test.context.junit4.SpringRunner;
-import org.springframework.util.LinkedMultiValueMap;
-import org.springframework.util.MultiValueMap;
-import org.springframework.web.client.RestClient;
 
-import java.lang.reflect.Type;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 
-import static org.springframework.http.MediaType.APPLICATION_JSON;
+import com.alibaba.fastjson2.JSON;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 
-@SpringBootTest
-@RunWith(SpringRunner.class)
-public class ConsumerIT {
-    private static final String providerAddress = System.getProperty("dubbo.address", "localhost");
-    private static final String urlPrefix = "http://" + providerAddress + ":50052";
-    private static final String prefix = "hello ";
+public class ConsumerIT extends BaseTest {
 
-    @DubboReference
+    private static final String PREFIX = "Hello ";
+
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private DemoService demoService;
 
-    @DubboReference
+    @DubboReference(url = "tri://${dubbo.address:localhost}:50052")
     private FilterService filterService;
 
     @Test
-    public void getParam(){
+    public void getParam() {
         String id = "123";
         String res = demoService.getParam(id);
-        Assert.assertEquals(prefix + id, res);
+        Assert.assertEquals(PREFIX + id, res);
     }
 
     @Test
-    public void RestGetParam(){
+    public void RestGetParam() {
         String id = "123";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.get()
-                .uri(urlPrefix + "/demo/get/param?id=" + id)
-                .header("Content-Type", "application/json")
+                .uri(toUri("/demo/get/param?id=") + id)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void getVariable(){
+    public void getVariable() {
         String id = "123";
         String res = demoService.getVariable(id);
-        Assert.assertEquals(prefix + id, res);
+        Assert.assertEquals(PREFIX + id, res);
     }
 
     @Test
-    public void RestGetVariable(){
+    public void RestGetVariable() {
         String id = "123";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.get()
-                .uri(urlPrefix + "/demo/get/variable/{id}", id)
-                .header("Content-Type", "application/json")
+                .uri(toUri("/demo/get/variable/{id}"), id)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void getMuchParam(){
+    public void getMuchParam() {
         String id = "123", name = "test";
         String res = demoService.getMuchParam(id, name);
-        Assert.assertEquals(prefix + id + " " + name, res);
+        Assert.assertEquals(PREFIX + id + " " + name, res);
     }
 
     @Test
-    public void RestGetMuchParam(){
+    public void RestGetMuchParam() {
         String id = "123", name = "test";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.get()
-                .uri(urlPrefix + "/demo/get/muchParam?id=" + id + "&name=" + name)
-                .header("Content-Type", "application/json")
+                .uri(toUri("/demo/get/muchParam?id=") + id + "&name=" + name)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + " " + name + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + " " + name + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void getMuchVariable(){
+    public void getMuchVariable() {
         String id = "123", name = "test";
         String res = demoService.getMuchVariable(id, name);
-        Assert.assertEquals(prefix + id + " " + name, res);
+        Assert.assertEquals(PREFIX + id + " " + name, res);
     }
 
     @Test
-    public void RestGetMuchVariable(){
+    public void RestGetMuchVariable() {
         String id = "123", name = "test";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.get()
-                .uri(urlPrefix + "/demo/get/muchVariable/{id}/{name}", id, name)
-                .header("Content-Type", "application/json")
+                .uri(toUri("/demo/get/muchVariable/{id}/{name}"), id, name)
+                .accept(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + " " + name + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + " " + name + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void getReg(){
+    public void getReg() {
         String name = "test", version = "2.2.1", ext = ".txt";
         String res = demoService.getReg(name, version, ext);
-        Assert.assertEquals(prefix + name + " " +  version + " " + ext, res);
+        Assert.assertEquals(PREFIX + name + " " + version + " " + ext, res);
     }
 
     @Test
-    public void RestGetReg(){
+    public void RestGetReg() {
         String name = "test", version = "2.2.1", ext = ".txt";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.get()
-                .uri(urlPrefix + "/demo/get/reg/{name}-{version}{ext}", name, version, ext)
-                .header("Content-Type", "application/json")
+                .uri(toUri("/demo/get/reg/{name}-{version}{ext}"), name, version, ext)
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
 
         // 因为已经解析了json 那么不需要再变成json格式了
-        Assert.assertEquals(prefix + name + " " + version + " " + ext, responseEntity.getBody());
+        Assert.assertEquals(PREFIX + name + " " + version + " " + ext, responseEntity.getBody());
     }
 
     @Test
-    public void postBody(){
+    public void postBody() {
         String name = "123";
         String requestBody = "{\"name\": \"" + name + "\"}";
         String res = demoService.postBody(requestBody);
-        Assert.assertEquals(prefix + name, res);
+        Assert.assertEquals(PREFIX + name, res);
     }
 
     @Test
-    public void RestPostBody(){
+    public void RestPostBody() {
         String name = "name";
         String requestBody = "{\"name\": \"" + name + "\"}";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.post()
-                .uri(urlPrefix + "/demo/post/body")
-                .header("content-type", "application/json")
+                .uri(toUri("/demo/post/body"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(requestBody)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + name + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + name + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void postParam(){
+    public void postParam() {
         String name = "123";
         String res = demoService.postParam(name);
-        Assert.assertEquals(prefix + name, res);
+        Assert.assertEquals(PREFIX + name, res);
     }
 
     @Test
-    public void RestPostParam(){
+    public void RestPostParam() {
         String id = "name";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.post()
-                .uri(urlPrefix + "/demo/post/param?id=" + id)
-                .contentType(APPLICATION_JSON)
+                .uri(toUri("/demo/post/param?id=") + id)
+                .contentType(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void postVariable(){
+    public void postVariable() {
         String name = "123";
         String res = demoService.postVariable(name);
-        Assert.assertEquals(prefix + name, res);
+        Assert.assertEquals(PREFIX + name, res);
     }
 
     @Test
-    public void RestPostVariable(){
+    public void RestPostVariable() {
         String id = "name";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.post()
-                .uri(urlPrefix + "/demo/post/variable/{id}", id)
-                .contentType(APPLICATION_JSON)
+                .uri(toUri("/demo/post/variable/{id}"), id)
+                .contentType(MediaType.APPLICATION_JSON)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void postUseConsumes(){
+    public void postUseConsumes() {
         String id = "123";
         String requestBody = "{\"id\": \"" + id + "\"}";
         String res = demoService.postUseConsumes(requestBody);
-        Assert.assertEquals(prefix + id, res);
+        Assert.assertEquals(PREFIX + id, res);
     }
 
     @Test
-    public void RestUseConsumes(){
+    public void RestUseConsumes() {
         String id = "name";
         String requestBody = "{\"id\":\"" + id + "\"}";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.post()
-                .uri(urlPrefix + "/demo/post/useConsumes")
-                .header("content-type", "application/json")
+                .uri(toUri("/demo/post/useConsumes"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(requestBody)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void postUseParams(){
+    public void postUseParams() {
         String id = "123";
         String requestBody = "{\"id\":\"" + id + "\"}";
         String res = demoService.postUseParams(requestBody);
-        Assert.assertEquals(prefix + id, res);
+        Assert.assertEquals(PREFIX + id, res);
     }
 
     @Test
-    public void RestUseParams(){
+    public void RestUseParams() {
         String id = "name";
         String requestBody = "{\"id\":\"" + id + "\"}";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.post()
-                .uri(urlPrefix + "/demo/post/useParams?myParam=myValue")
-                .contentType(APPLICATION_JSON)
+                .uri(toUri("/demo/post/useParams?myParam=myValue"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(requestBody)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void getHead(){
+    public void getHead() {
         String id = "123";
         String res = demoService.getHead(id);
-        Assert.assertEquals(prefix + id, res);
+        Assert.assertEquals(PREFIX + id, res);
     }
 
     @Test
-    public void RestGetHead(){
+    public void RestGetHead() {
         String id = "123";
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.get()
-                .uri(urlPrefix + "/demo/get/head/{id}", id)
-                .header("Content-Type", "application/json")
+                .uri(toUri("/demo/get/head/{id}"), id)
+                .accept(MediaType.APPLICATION_JSON)
                 .header("myHeader", "myValue")
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", responseEntity.getBody());
     }
 
-
     @Test
-    public void RestPostUseConsumesFormData(){
+    public void RestPostUseConsumesFormData() {
         String id = "123", name = "John";
 
         MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
         map.add("id", id);
         map.add("name", name);
 
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.post()
-                .uri(urlPrefix + "/demo/post/useConsumes/formData")
+                .uri(toUri("/demo/post/useConsumes/formData"))
                 .header("Content-Type", "application/x-www-form-urlencoded")
                 .body(map)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + id + " " + name + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + " " + name + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void postUser(){
-        HashMap<String, User> map = new HashMap<String, User>();
+    public void postUser() {
+        HashMap<String, User> map = new HashMap<>();
         map.put("user1", new User(123L, "nick"));
         map.put("user2", new User(456L, "lick"));
 
         String json = JSON.toJSONString(map);
 
-        Assert.assertEquals(prefix + "123" + " 456", demoService.postMapUser(json));
+        Assert.assertEquals(PREFIX + "123" + " 456", demoService.postMapUser(json));
     }
 
     // 出现问题
     @Test
-    public void RestPostUser(){
-        HashMap<String, User> map = new HashMap<String, User>();
+    public void RestPostUser() {
+        HashMap<String, User> map = new HashMap<>();
         map.put("user1", new User(123L, "nick"));
         map.put("user2", new User(456L, "lick"));
 
         String json = JSON.toJSONString(map);
 
-        RestClient restClient = RestClient.create();
         ResponseEntity<String> responseEntity = restClient.post()
-                .uri(urlPrefix + "/demo/post/map/user")
-                .header("content-type", "application/json")
+                .uri(toUri("/demo/post/map/user"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(json)
                 .retrieve()
                 .toEntity(String.class);
 
-        Assert.assertEquals("\"" + prefix + "123" + " 456" + "\"", responseEntity.getBody());
+        Assert.assertEquals("\"" + PREFIX + "123" + " 456" + "\"", responseEntity.getBody());
     }
 
     @Test
-    public void putUpdateId(){
+    public void putUpdateId() {
         String id = "123";
-        Assert.assertEquals(prefix + id, demoService.putUpdateId(id));
+        Assert.assertEquals(PREFIX + id, demoService.putUpdateId(id));
     }
 
-
     @Test
-    public void RestPutUpdateId(){
+    public void RestPutUpdateId() {
         String id = "123";
-        RestClient restClient = RestClient.create();
         HttpEntity<String> response = restClient.put()
-                .uri(urlPrefix + "/demo/put/update/{id}", id)
+                .uri(toUri("/demo/put/update/{id}"), id)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("\"" + prefix + id + "\"", response.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", response.getBody());
     }
 
     @Test
-    public void deleteId(){
+    public void deleteId() {
         String id = "123";
-        Assert.assertEquals(prefix + id, demoService.deleteId(id));
+        Assert.assertEquals(PREFIX + id, demoService.deleteId(id));
     }
 
-
     @Test
-    public void RestDeleteId(){
+    public void RestDeleteId() {
         String id = "123";
 
-        RestClient restClient = RestClient.create();
         HttpEntity<String> response = restClient.delete()
-                .uri(urlPrefix + "/demo/delete/{id}", id)
+                .uri(toUri("/demo/delete/{id}"), id)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("\"" + prefix + id + "\"", response.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + "\"", response.getBody());
     }
 
     @Test
-    public void patchById(){
+    public void patchById() {
         String id = "123";
-        Assert.assertEquals(prefix + id + " jack", demoService.patchById(id, new User(123L, "jack").stringToJson()));
+        Assert.assertEquals(PREFIX + id + " jack", demoService.patchById(id, new User(123L, "jack").stringToJson()));
     }
 
-
     @Test
-    public void RestPatchById(){
+    public void RestPatchById() {
         String id = "123";
         String requestBody = new User(12L, "jack").stringToJson();
 
-        RestClient restClient = RestClient.create();
         HttpEntity<String> response = restClient.patch()
-                .uri(urlPrefix + "/demo/patch/{id}", id)
-                .contentType(APPLICATION_JSON)
+                .uri(toUri("/demo/patch/{id}"), id)
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(requestBody)
                 .retrieve()
                 .toEntity(String.class);
-        Assert.assertEquals("\"" + prefix + id + " jack" +"\"", response.getBody());
+        Assert.assertEquals("\"" + PREFIX + id + " jack" + "\"", response.getBody());
     }
 
     @Test
-    public void primitive(){
+    public void primitive() {
         Assert.assertEquals(1 + 2, demoService.primitiveInt(1, 2));
 
         Assert.assertEquals(1L + 2L, demoService.primitiveLong(1L, 2L));
@@ -407,18 +378,17 @@
     }
 
     @Test
-    public void filterGet(){
+    public void filterGet() {
         String name = "123";
         Assert.assertEquals(name, filterService.filterGet(name));
     }
 
     @Test
-    public void RestFilterGet(){
+    public void RestFilterGet() {
         String name = "123";
-        RestClient restClient = RestClient.create();
         HttpEntity<String> response = restClient.get()
-                .uri(urlPrefix + "/filter/get/{name}", name)
-                .header("content-type", "application/json")
+                .uri(toUri("/filter/get/{name}"), name)
+                .accept(MediaType.TEXT_PLAIN)
                 .retrieve()
                 .toEntity(String.class);
 
@@ -426,7 +396,7 @@
     }
 
     @Test
-    public void postList(){
+    public void postList() {
         List<User> userList = new LinkedList<>();
         userList.add(new User(123L, "jack"));
         userList.add(new User(345L, "mack"));
@@ -435,23 +405,17 @@
     }
 
     @Test
-    public void RestPostList(){
+    public void RestPostList() {
         List<User> userList = new LinkedList<>();
         userList.add(new User(123L, "jack", 123));
         userList.add(new User(345L, "mack", 123));
 
-        RestClient restClient = RestClient.create();
         HttpEntity<List<User>> response = restClient.post()
-                .uri(urlPrefix + "/demo/post/list")
-                .contentType(APPLICATION_JSON)
+                .uri(toUri("/demo/post/list"))
+                .contentType(MediaType.APPLICATION_JSON)
                 .body(userList)
                 .retrieve()
-                .toEntity(new ParameterizedTypeReference<List<User>>() {
-                    @Override
-                    public Type getType() {
-                        return super.getType();
-                    }
-                });
+                .toEntity(new ParameterizedTypeReference<>() {});
 
         Assert.assertEquals(userList, response.getBody());
     }
diff --git a/2-advanced/dubbo-samples-triple-rest/pom.xml b/2-advanced/dubbo-samples-triple-rest/pom.xml
index dbfd9d6..23bcd44 100644
--- a/2-advanced/dubbo-samples-triple-rest/pom.xml
+++ b/2-advanced/dubbo-samples-triple-rest/pom.xml
@@ -1,143 +1,141 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one or more
-  ~ contributor license agreements.  See the NOTICE file distributed with
-  ~ this work for additional information regarding copyright ownership.
-  ~ The ASF licenses this file to You under the Apache License, Version 2.0
-  ~ (the "License"); you may not use this file except in compliance with
-  ~ the License.  You may obtain a copy of the License at
-  ~
-  ~     http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
   -->
+<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>
+  <parent>
+    <groupId>org.apache</groupId>
+    <artifactId>apache</artifactId>
+    <version>31</version>
+    <relativePath/>
+  </parent>
 
-<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>org.apache</groupId>
-        <artifactId>apache</artifactId>
-        <version>31</version>
-        <relativePath/>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.dubbo</groupId>
+  <artifactId>dubbo-samples-triple-rest</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
 
-    <groupId>org.apache.dubbo</groupId>
-    <artifactId>dubbo-samples-triple-rest</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
+  <name>Dubbo Samples Triple Rest</name>
+  <description>Dubbo Samples Triple Rest</description>
 
-    <name>Dubbo Samples Triple Rest</name>
-    <description>Dubbo Samples Triple Rest</description>
+  <properties>
+    <maven.compiler.source>17</maven.compiler.source>
+    <maven.compiler.target>17</maven.compiler.target>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 
-    <properties>
-        <maven.compiler.source>17</maven.compiler.source>
-        <maven.compiler.target>17</maven.compiler.target>
-        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <dubbo.version>3.3.0-beta.5</dubbo.version>
+    <!--<dubbo.version>3.3.0-beta.6-SNAPSHOT</dubbo.version>-->
+    <spring-boot.version>3.2.3</spring-boot.version>
+    <jaxb-runtime.version>2.3.3-b02</jaxb-runtime.version>
+  </properties>
 
-        <dubbo.version>3.3.0-beta.2</dubbo.version>
-        <spring-boot.version>3.2.3</spring-boot.version>
-        <spring.version>6.1.5</spring.version>
-    </properties>
+  <modules>
+    <module>dubbo-samples-triple-rest-basic</module>
+    <module>dubbo-samples-triple-rest-jaxrs</module>
+    <module>dubbo-samples-triple-rest-springmvc</module>
+  </modules>
 
-    <modules>
-        <module>dubbo-samples-triple-rest-springmvc</module>
-        <module>dubbo-samples-triple-rest-jaxrs</module>
-    </modules>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.springframework</groupId>
-                <artifactId>spring-framework-bom</artifactId>
-                <version>${spring.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-dependencies</artifactId>
-                <version>${spring-boot.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-            <dependency>
-                <groupId>org.springframework.boot</groupId>
-                <artifactId>spring-boot-starter</artifactId>
-                <version>${spring-boot.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <artifactId>spring-boot-starter-logging</artifactId>
-                        <groupId>org.springframework.boot</groupId>
-                    </exclusion>
-                </exclusions>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-bom</artifactId>
-                <version>${dubbo.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
+  <dependencyManagement>
     <dependencies>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-dependencies</artifactId>
+        <version>${spring-boot.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo-bom</artifactId>
+        <version>${dubbo.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter</artifactId>
+        <version>${spring-boot.version}</version>
+        <exclusions>
+          <exclusion>
+            <artifactId>spring-boot-starter-logging</artifactId>
+            <groupId>org.springframework.boot</groupId>
+          </exclusion>
+        </exclusions>
+      </dependency>
+      <dependency>
+        <groupId>org.glassfish.jaxb</groupId>
+        <artifactId>jaxb-runtime</artifactId>
+        <version>${jaxb-runtime.version}</version>
+      </dependency>
     </dependencies>
+  </dependencyManagement>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <compilerArgs>
-                        <compilerArg>-proc:none</compilerArg>
-                    </compilerArgs>
-                </configuration>
-            </plugin>
-        </plugins>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.springframework.boot</groupId>
-                    <artifactId>spring-boot-maven-plugin</artifactId>
-                    <version>${spring-boot.version}</version>
-                    <executions>
-                        <execution>
-                            <goals>
-                                <goal>repackage</goal>
-                            </goals>
-                        </execution>
-                    </executions>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
 
-    <repositories>
-        <repository>
-            <id>apache.snapshots.https</id>
-            <name>Apache Development Snapshot Repository</name>
-            <url>https://repository.apache.org/content/repositories/snapshots</url>
-            <layout>default</layout>
-            <releases>
-                <enabled>false</enabled>
-            </releases>
-            <snapshots>
-                <enabled>true</enabled>
-                <updatePolicy>daily</updatePolicy>
-            </snapshots>
-        </repository>
-    </repositories>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <compilerArgs>
+            <compilerArg>-proc:none</compilerArg>
+          </compilerArgs>
+          <parameters>true</parameters>
+        </configuration>
+      </plugin>
+    </plugins>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.springframework.boot</groupId>
+          <artifactId>spring-boot-maven-plugin</artifactId>
+          <version>${spring-boot.version}</version>
+          <executions>
+            <execution>
+              <goals>
+                <goal>repackage</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
+  <repositories>
+    <repository>
+      <id>apache.snapshots.https</id>
+      <name>Apache Development Snapshot Repository</name>
+      <url>https://repository.apache.org/content/repositories/snapshots</url>
+      <layout>default</layout>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+      <snapshots>
+        <enabled>true</enabled>
+        <updatePolicy>daily</updatePolicy>
+      </snapshots>
+    </repository>
+  </repositories>
 </project>
diff --git a/2-advanced/dubbo-samples-triple-servlet/README.md b/2-advanced/dubbo-samples-triple-servlet/README.md
new file mode 100644
index 0000000..1db977a
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/README.md
@@ -0,0 +1,83 @@
+# Dubbo Triple Servlet Example
+
+This example shows how to enable servlet support for triple protocol.
+
+## Benefits
+
+After enabled Servlet support, Triple protocol requests will be forward to the servlet server, allowing to use features of servlet container such as filters.
+This also avoids the maintenance costs associated with adding extra server port and uri mapping, makes it easier to penetrate firewalls and gateways.
+
+## How to run
+
+Step into 'dubbo-samples-triple-servlet' directory
+then, run the following command to start application:
+
+```shell
+mvn spring-boot:run
+```
+
+## Testing using curl
+
+Run the following command to see server works as expected:
+
+```shell
+# Passing parameter via query string
+curl --http2-prior-knowledge -v 'http://localhost:50052/org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world'
+
+# Expected output:
+#* Connected to localhost (::1) port 50052
+#* [HTTP/2] [1] OPENED stream for http://localhost:50052/org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world
+#* [HTTP/2] [1] [:method: GET]
+#* [HTTP/2] [1] [:scheme: http]
+#* [HTTP/2] [1] [:authority: localhost:50052]
+#* [HTTP/2] [1] [:path: /org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world]
+#* [HTTP/2] [1] [user-agent: curl/8.7.1]
+#* [HTTP/2] [1] [accept: */*]
+#> GET /org.apache.dubbo.demo.GreeterService/sayHelloAsync?request=world HTTP/2
+#> Host: localhost:50052
+#> User-Agent: curl/8.7.1
+#> Accept: */*
+#>
+#* Request completely sent off
+#< HTTP/2 200
+#< content-type: application/json
+#< date: Sun, 25 Aug 2024 03:38:12 GMT
+#<
+#"Hello world"
+```
+
+## How to enable servlet support for triple
+
+### Add maven dependencies
+
+Note that only spring boot3 is required, spring boot2 has been imported by dubbo-spring-boot-starter
+
+```xml
+
+<dependencys>
+    <dependency>
+        <groupId>org.apache.dubbo</groupId>
+        <artifactId>dubbo-spring-boot-3-autoconfigure</artifactId>
+    </dependency>
+</dependencys>
+```
+
+### Add the following configuration to `application.yml` to enable servlet support
+
+Note that when set the triple port to be the same as the servlet server, triple will no longer start netty port listening, all requests will be forward to the servlet server.
+
+```yaml
+server:
+    port: 50052
+    http2:
+        enabled: true
+    tomcat:
+        keep-alive-timeout: -1
+dubbo:
+    protocol:
+        name: tri
+        port: ${server.port}
+        triple:
+        servlet:
+            enabled: true
+```
diff --git a/2-advanced/dubbo-samples-triple-servlet/case-configuration.yml b/2-advanced/dubbo-samples-triple-servlet/case-configuration.yml
new file mode 100644
index 0000000..b63913d
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/case-configuration.yml
@@ -0,0 +1,57 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+services:
+  nacos:
+    image: nacos/nacos-server:${nacos-server.version:2.0.0}
+    environment:
+      - PREFER_HOST_MODE=hostname
+      - MODE=standalone
+      - NACOS_AUTH_ENABLE=true
+      - JVM_XMS=512m
+      - JVM_XMX=512m
+      - JVM_XMN=256m
+
+  provider:
+    type: app
+    basedir: .
+    mainClass: org.apache.dubbo.demo.ProviderApplication
+    systemProps:
+      - nacos.address=nacos
+      - nacos.port=8848
+    waitPortsBeforeRun:
+      - nacos:8848
+    checkPorts:
+      - 50052
+    checkLog: "dubbo service started"
+    depends_on:
+      - nacos
+
+  test:
+    type: test
+    basedir: .
+    tests:
+      - "**/*IT.class"
+    systemProps:
+      - nacos.address=nacos
+      - nacos.port=8848
+      - dubbo.address=provider
+    waitPortsBeforeRun:
+      - nacos:8848
+      - provider:50052
+    depends_on:
+      - nacos
+      - provider
diff --git a/2-advanced/dubbo-samples-triple-servlet/case-versions.conf b/2-advanced/dubbo-samples-triple-servlet/case-versions.conf
new file mode 100644
index 0000000..f2f919d
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/case-versions.conf
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Supported component versions of the test case
+
+# Spring app
+dubbo.version=3.3.*
+spring.version=6.*
+java.version= [>= 17]
diff --git a/2-advanced/dubbo-samples-triple-servlet/pom.xml b/2-advanced/dubbo-samples-triple-servlet/pom.xml
new file mode 100644
index 0000000..718ecce
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/pom.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<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>
+    <parent>
+        <groupId>org.apache</groupId>
+        <artifactId>apache</artifactId>
+        <version>31</version>
+        <relativePath/>
+    </parent>
+
+    <groupId>org.apache.dubbo</groupId>
+    <artifactId>dubbo-samples-triple-servlet</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+
+    <name>Dubbo Samples Triple Servlet</name>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+        <!--<dubbo.version>3.3.0-beta.5</dubbo.version>-->
+        <dubbo.version>3.3.0-beta.6-SNAPSHOT</dubbo.version>
+        <spring-boot.version>3.2.3</spring-boot.version>
+
+        <maven_os_plugin_version>1.7.1</maven_os_plugin_version>
+        <maven_protobuf_plugin_version>0.6.1</maven_protobuf_plugin_version>
+        <protobuf-protoc_version>3.22.3</protobuf-protoc_version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>${spring-boot.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-bom</artifactId>
+                <version>${dubbo.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-starter</artifactId>
+                <version>${spring-boot.version}</version>
+                <exclusions>
+                    <exclusion>
+                        <artifactId>spring-boot-starter-logging</artifactId>
+                        <groupId>org.springframework.boot</groupId>
+                    </exclusion>
+                </exclusions>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
+          <exclusions>
+            <exclusion>
+              <artifactId>nacos-log4j2-adapter</artifactId>
+              <groupId>com.alibaba.nacos</groupId>
+            </exclusion>
+          </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-3-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <compilerArg>-proc:none</compilerArg>
+                    </compilerArgs>
+                    <parameters>true</parameters>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+                <version>${maven_os_plugin_version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>detect</goal>
+                        </goals>
+                        <phase>initialize</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <version>${maven_protobuf_plugin_version}</version>
+                <configuration>
+                    <!--suppress UnresolvedMavenProperty -->
+                    <protocArtifact>com.google.protobuf:protoc:${protobuf-protoc_version}:exe:${os.detected.classifier}</protocArtifact>
+                    <pluginId>triple-java</pluginId>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+    <repositories>
+        <repository>
+            <id>apache.snapshots.https</id>
+            <name>Apache Development Snapshot Repository</name>
+            <url>https://repository.apache.org/content/repositories/snapshots</url>
+            <layout>default</layout>
+            <releases>
+                <enabled>false</enabled>
+            </releases>
+            <snapshots>
+                <enabled>true</enabled>
+                <updatePolicy>daily</updatePolicy>
+            </snapshots>
+        </repository>
+    </repositories>
+</project>
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterController.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterController.java
new file mode 100644
index 0000000..b723931
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterController.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.demo;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class GreeterController {
+
+    @RequestMapping("/demo/hello")
+    public String sayHello(String request) {
+        return "Hello " + request;
+    }
+
+    @GetMapping("/org.apache.dubbo.demo.GreeterWrapperService/hi")
+    public String sayHelloWithSameUrl(String request) {
+        return "Hello " + request;
+    }
+}
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterService.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterService.java
new file mode 100644
index 0000000..debbc19
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterService.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.demo.pb.HelloReply;
+import org.apache.dubbo.demo.pb.HelloRequest;
+
+import java.util.concurrent.CompletableFuture;
+
+public interface GreeterService {
+
+    /**
+     * Sends a greeting
+     */
+    HelloReply sayHello(HelloRequest request);
+
+    /**
+     * Sends a greeting asynchronously
+     */
+    CompletableFuture<String> sayHelloAsync(String request);
+
+    /**
+     * Sends a greeting with server streaming
+     */
+    void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver);
+
+    /**
+     * Sends greetings with bi streaming
+     */
+    StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver);
+}
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterServiceImpl.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterServiceImpl.java
new file mode 100644
index 0000000..61e998c
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterServiceImpl.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.apache.dubbo.demo.pb.HelloReply;
+import org.apache.dubbo.demo.pb.HelloRequest;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DubboService
+public class GreeterServiceImpl implements GreeterService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GreeterServiceImpl.class);
+
+    @Override
+    public HelloReply sayHello(HelloRequest request) {
+        LOGGER.info("Received sayHello request: {}", request.getName());
+        return toReply("Hello " + request.getName());
+    }
+
+    @Override
+    public CompletableFuture<String> sayHelloAsync(String request) {
+        LOGGER.info("Received sayHelloAsync request: {}", request);
+        return CompletableFuture.supplyAsync(() -> "Hello " + request);
+    }
+
+    @Override
+    public void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloServerStream request");
+        for (int i = 1; i < 6; i++) {
+            LOGGER.info("sayHelloServerStream onNext: {} {} times", request.getName(), i);
+            responseObserver.onNext(toReply("Hello " + request.getName()));
+        }
+        LOGGER.info("sayHelloServerStream onCompleted");
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloBiStream request");
+        return new StreamObserver<>() {
+            @Override
+            public void onNext(HelloRequest request) {
+                LOGGER.info("sayHelloBiStream onNext: {}", request.getName());
+                responseObserver.onNext(toReply("Hello " + request.getName()));
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                LOGGER.error("sayHelloBiStream onError", throwable);
+            }
+
+            @Override
+            public void onCompleted() {
+                LOGGER.info("sayHelloBiStream onCompleted");
+                responseObserver.onCompleted();
+            }
+        };
+    }
+
+    private static HelloReply toReply(String message) {
+        return HelloReply.newBuilder().setMessage(message).build();
+    }
+}
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterWrapperService.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterWrapperService.java
new file mode 100644
index 0000000..85d03d3
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterWrapperService.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.remoting.http12.HttpMethods;
+import org.apache.dubbo.remoting.http12.rest.Mapping;
+
+import java.util.concurrent.CompletableFuture;
+
+public interface GreeterWrapperService {
+
+    /**
+     * Sends a greeting
+     */
+    HelloReply sayHello(HelloRequest request);
+
+    /**
+     * Sends a greeting asynchronously
+     */
+    @Mapping(value = "hi", method = HttpMethods.POST)
+    CompletableFuture<String> sayHelloAsync(String request);
+
+    /**
+     * Sends a greeting with server streaming
+     */
+    void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver);
+
+    /**
+     * Sends greetings with bi streaming
+     */
+    StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver);
+}
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterWrapperServiceImpl.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterWrapperServiceImpl.java
new file mode 100644
index 0000000..ecd99da
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/GreeterWrapperServiceImpl.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboService;
+
+import java.util.concurrent.CompletableFuture;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@DubboService
+public class GreeterWrapperServiceImpl implements GreeterWrapperService {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(GreeterWrapperServiceImpl.class);
+
+    @Override
+    public HelloReply sayHello(HelloRequest request) {
+        LOGGER.info("Received sayHello request: {}", request.getName());
+        return toReply("Hello " + request.getName());
+    }
+
+    @Override
+    public CompletableFuture<String> sayHelloAsync(String name) {
+        LOGGER.info("Received sayHelloAsync request: {}", name);
+        return CompletableFuture.supplyAsync(() -> "Hello " + name);
+    }
+
+    @Override
+    public void sayHelloServerStream(HelloRequest request, StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloServerStream request");
+        for (int i = 1; i < 6; i++) {
+            LOGGER.info("sayHelloServerStream onNext: {} {} times", request.getName(), i);
+            responseObserver.onNext(toReply("Hello " + request.getName()));
+        }
+        LOGGER.info("sayHelloServerStream onCompleted");
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public StreamObserver<HelloRequest> sayHelloBiStream(StreamObserver<HelloReply> responseObserver) {
+        LOGGER.info("Received sayHelloBiStream request");
+        return new StreamObserver<>() {
+            @Override
+            public void onNext(HelloRequest request) {
+                LOGGER.info("sayHelloBiStream onNext: {}", request.getName());
+                responseObserver.onNext(toReply("Hello " + request.getName()));
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                LOGGER.error("sayHelloBiStream onError", throwable);
+            }
+
+            @Override
+            public void onCompleted() {
+                LOGGER.info("sayHelloBiStream onCompleted");
+                responseObserver.onCompleted();
+            }
+        };
+    }
+
+    private static HelloReply toReply(String message) {
+        HelloReply reply = new HelloReply();
+        reply.setMessage(message);
+        return reply;
+    }
+
+}
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/HelloReply.java
similarity index 65%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/HelloReply.java
index 1a58d84..c958ab7 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/HelloReply.java
@@ -14,18 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.dubbo.demo;
 
-package org.apache.dubbo.rest.demo.test;
+import java.io.Serial;
+import java.io.Serializable;
 
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+public class HelloReply implements Serializable {
 
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    private String message;
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/HelloRequest.java
similarity index 65%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/HelloRequest.java
index 1a58d84..0a45faa 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/HelloRequest.java
@@ -14,18 +14,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.dubbo.demo;
 
-package org.apache.dubbo.rest.demo.test;
+import java.io.Serial;
+import java.io.Serializable;
 
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+public class HelloRequest implements Serializable {
 
-@SpringBootApplication
-@EnableDubbo
-public class ConsumerApplication {
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+    private String name;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/ProviderApplication.java
similarity index 85%
copy from 2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
copy to 2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/ProviderApplication.java
index 1a58d84..f3d81ce 100644
--- a/2-advanced/dubbo-samples-triple-rest/dubbo-samples-triple-rest-jaxrs/src/test/java/org/apache/dubbo/rest/demo/test/ConsumerApplication.java
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/java/org/apache/dubbo/demo/ProviderApplication.java
@@ -14,18 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.dubbo.rest.demo.test;
+package org.apache.dubbo.demo;
 
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 
 @SpringBootApplication
 @EnableDubbo
-public class ConsumerApplication {
+public class ProviderApplication {
 
     public static void main(String[] args) {
-        SpringApplication.run(ConsumerApplication.class, args);
+        SpringApplication.run(ProviderApplication.class, args);
+        System.out.println("dubbo service started");
     }
 }
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/proto/helloworld.proto b/2-advanced/dubbo-samples-triple-servlet/src/main/proto/helloworld.proto
new file mode 100644
index 0000000..eaa831b
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/proto/helloworld.proto
@@ -0,0 +1,29 @@
+// 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.
+syntax = "proto3";
+
+option java_multiple_files = true;
+option java_package = "org.apache.dubbo.demo.pb";
+option java_outer_classname = "HelloWorldProto";
+option objc_class_prefix = "HLW";
+
+package helloworld;
+
+// The request message containing the user's name.
+message HelloRequest {
+    string name = 1;
+}
+
+// The response message containing the greetings
+message HelloReply {
+    string message = 1;
+}
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/resources/application.yml b/2-advanced/dubbo-samples-triple-servlet/src/main/resources/application.yml
new file mode 100644
index 0000000..48058df
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/resources/application.yml
@@ -0,0 +1,41 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+spring:
+  application:
+    name: dubbo-samples-triple-servlet
+server:
+  port: 50052
+  http2:
+    enabled: true
+  tomcat:
+    keep-alive-timeout: -1
+dubbo:
+  application:
+    name: ${spring.application.name}
+    qos-enable: false
+  protocol:
+    name: tri
+    port: ${server.port}
+    triple:
+      verbose: true
+      servlet:
+        enabled: true
+        enable: true
+  registry:
+    address: nacos://${nacos.address:127.0.0.1}:8848
+    username: nacos
+    password: nacos
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/main/resources/log4j2.xml b/2-advanced/dubbo-samples-triple-servlet/src/main/resources/log4j2.xml
new file mode 100644
index 0000000..f21b6cb
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/main/resources/log4j2.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<Configuration status="WARN">
+    <Appenders>
+        <Console name="Console" target="SYSTEM_OUT" follow="true">
+            <PatternLayout pattern="%style{%d{HH:mm:ss.SSS}}{Magenta} %style{|-}{White}%highlight{%-5p} [%t] %style{%40.40c}{Cyan}:%style{%-3L}{Blue} %style{-|}{White} %m%n%rEx{filters(jdk.internal.reflect,java.lang.reflect,sun.reflect)}" disableAnsi="false" charset="UTF-8"/>
+        </Console>
+    </Appenders>
+    <Loggers>
+        <Root level="info">
+            <AppenderRef ref="Console"/>
+        </Root>
+        <Logger name="org.apache.dubbo.rpc.protocol.tri" level="debug"/>
+        <Logger name="org.apache.dubbo.remoting.http12" level="debug"/>
+        <Logger name="org.apache.dubbo.config" level="warn"/>
+    </Loggers>
+</Configuration>
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/test/java/org/apache/dubbo/demo/ConsumerIT.java b/2-advanced/dubbo-samples-triple-servlet/src/test/java/org/apache/dubbo/demo/ConsumerIT.java
new file mode 100644
index 0000000..f3bd098
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/test/java/org/apache/dubbo/demo/ConsumerIT.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.demo.pb.HelloReply;
+import org.apache.dubbo.demo.pb.HelloRequest;
+import org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@SpringBootTest(classes = {DubboAutoConfiguration.class})
+@RunWith(SpringRunner.class)
+public class ConsumerIT {
+
+    @DubboReference
+    private GreeterService greeterService;
+
+    private static org.apache.dubbo.demo.pb.HelloRequest buildRequest(String name) {
+        return HelloRequest.newBuilder().setName(name).build();
+    }
+
+    @Test
+    public void sayHello() {
+        HelloReply reply = greeterService.sayHello(buildRequest("world"));
+        Assert.assertEquals("Hello world", reply.getMessage());
+    }
+
+    @Test
+    public void sayHelloAsync() throws Exception {
+        String reply = greeterService.sayHelloAsync("world").get(1, TimeUnit.SECONDS);
+        Assert.assertEquals("Hello world", reply);
+    }
+
+    @Test
+    public void sayHelloServerStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> responseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello stream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        greeterService.sayHelloServerStream(buildRequest("stream"), responseObserver);
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+
+    @Test
+    public void sayHelloBiStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> biResponseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello biStream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        StreamObserver<HelloRequest> biRequestObserver = greeterService.sayHelloBiStream(biResponseObserver);
+        for (int i = 0; i < 5; i++) {
+            biRequestObserver.onNext(buildRequest("biStream"));
+        }
+        biRequestObserver.onCompleted();
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+}
diff --git a/2-advanced/dubbo-samples-triple-servlet/src/test/java/org/apache/dubbo/demo/WrapperConsumerIT.java b/2-advanced/dubbo-samples-triple-servlet/src/test/java/org/apache/dubbo/demo/WrapperConsumerIT.java
new file mode 100644
index 0000000..7c28724
--- /dev/null
+++ b/2-advanced/dubbo-samples-triple-servlet/src/test/java/org/apache/dubbo/demo/WrapperConsumerIT.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.demo;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.dubbo.spring.boot.autoconfigure.DubboAutoConfiguration;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@SpringBootTest(classes = {DubboAutoConfiguration.class})
+@RunWith(SpringRunner.class)
+public class WrapperConsumerIT {
+
+    @DubboReference
+    private GreeterWrapperService greeterService;
+
+    private static HelloRequest buildRequest(String name) {
+        HelloRequest request = new HelloRequest();
+        request.setName(name);
+        return request;
+    }
+
+    @Test
+    public void sayHello() {
+        HelloReply reply = greeterService.sayHello(buildRequest("world"));
+        Assert.assertEquals("Hello world", reply.getMessage());
+    }
+
+    @Test
+    public void sayHelloAsync() throws Exception {
+        String reply = greeterService.sayHelloAsync("world").get(1, TimeUnit.SECONDS);
+        Assert.assertEquals("Hello world", reply);
+    }
+
+    @Test
+    public void sayHelloServerStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> responseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello stream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        greeterService.sayHelloServerStream(buildRequest("stream"), responseObserver);
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+
+    @Test
+    public void sayHelloBiStream() throws Exception {
+        CompletableFuture<Void> future = new CompletableFuture<>();
+        AtomicInteger count = new AtomicInteger();
+        StreamObserver<HelloReply> biResponseObserver = new StreamObserver<>() {
+            @Override
+            public void onNext(HelloReply reply) {
+                Assert.assertEquals("Hello biStream", reply.getMessage());
+                count.incrementAndGet();
+            }
+
+            @Override
+            public void onError(Throwable t) {
+                future.completeExceptionally(t);
+            }
+
+            @Override
+            public void onCompleted() {
+                future.complete(null);
+            }
+        };
+        StreamObserver<HelloRequest> biRequestObserver = greeterService.sayHelloBiStream(biResponseObserver);
+        for (int i = 0; i < 5; i++) {
+            biRequestObserver.onNext(buildRequest("biStream"));
+        }
+        biRequestObserver.onCompleted();
+        future.get(5, TimeUnit.SECONDS);
+        Assert.assertEquals(5, count.get());
+    }
+}
diff --git a/2-advanced/pom.xml b/2-advanced/pom.xml
index 1da1ddb..4c8b356 100644
--- a/2-advanced/pom.xml
+++ b/2-advanced/pom.xml
@@ -67,6 +67,8 @@
         <module>dubbo-samples-api-with-registry</module>
         <module>dubbo-samples-dubbo</module>
         <module>dubbo-samples-triple-rest</module>
+        <module>dubbo-samples-triple-http3</module>
+        <module>dubbo-samples-triple-servlet</module>
         <module>dubbo-samples-gateway</module>
         <module>dubbo-samples-multiple-protocols</module>
     </modules>