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

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


The following commit(s) were added to refs/heads/3.3 by this push:
     new b5bb04496c Add TripleConfig to ProtocolConfig as nest configuration 
(#14077)
b5bb04496c is described below

commit b5bb04496c8becd750614cc15e2b1fc5077a5104
Author: TomlongTK <[email protected]>
AuthorDate: Thu May 23 11:15:06 2024 +0800

    Add TripleConfig to ProtocolConfig as nest configuration (#14077)
    
    * Add TripleConfig to ProtocolConfig as nest configuration
    
    * Fix compile issue
    
    * Use default protocol config
    
    * Format code
    
    * Handle the situation where ProtocolConfig is not set
    
    * Follow the old rules and fix some sonar issues
    
    * Add checkDefault method
    
    * Refresh when uninitialized
    
    * Remove needRefresh
    
    ---------
    
    Co-authored-by: earthchen <[email protected]>
---
 .../org/apache/dubbo/config/ProtocolConfig.java    |  18 ++
 .../java/org/apache/dubbo/config/TripleConfig.java | 118 ----------
 .../config/context/AbstractConfigManager.java      |  20 +-
 .../apache/dubbo/config/context/ConfigManager.java |  15 ++
 .../apache/dubbo/config/nested/TripleConfig.java   | 237 +++++++++++++++++++++
 .../config/bootstrap/builders/TripleBuilder.java   | 212 ++++++++++++++++++
 .../apache/dubbo/config/ProtocolConfigTest.java    |  80 ++++---
 .../dubbo/config/bootstrap/DubboBootstrapTest.java |  46 ++++
 .../bootstrap/builders/TripleBuilderTest.java      | 143 +++++++++++++
 .../src/main/resources/META-INF/dubbo.xsd          |  86 ++++++++
 .../main/java/org/apache/dubbo/rpc/Constants.java  |   6 -
 .../protocol/tri/TriHttp2RemoteFlowController.java |  74 +++----
 .../rpc/protocol/tri/TripleHttp2Protocol.java      |  80 +++----
 .../dubbo/rpc/protocol/tri/ExceptionUtilsTest.java |   1 -
 .../DubboConfigurationProperties.java              |   2 +-
 15 files changed, 886 insertions(+), 252 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
index 1d0b5918a0..a66e57390b 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ProtocolConfig.java
@@ -19,6 +19,8 @@ package org.apache.dubbo.config;
 import org.apache.dubbo.common.serialization.PreferSerializationProvider;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.config.nested.TripleConfig;
+import org.apache.dubbo.config.support.Nested;
 import org.apache.dubbo.config.support.Parameter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
@@ -236,6 +238,9 @@ public class ProtocolConfig extends AbstractConfig {
      */
     private String jsonCheckLevel;
 
+    @Nested
+    private TripleConfig triple;
+
     public ProtocolConfig() {}
 
     public ProtocolConfig(ApplicationModel applicationModel) {
@@ -277,6 +282,11 @@ public class ProtocolConfig extends AbstractConfig {
                             .getBean(PreferSerializationProvider.class)
                             .getPreferSerialization();
         }
+
+        if (triple == null) {
+            triple = new TripleConfig();
+        }
+        triple.checkDefault();
     }
 
     @Parameter(excluded = true)
@@ -621,6 +631,14 @@ public class ProtocolConfig extends AbstractConfig {
         this.extProtocol = extProtocol;
     }
 
+    public TripleConfig getTriple() {
+        return triple;
+    }
+
+    public void setTriple(TripleConfig triple) {
+        this.triple = triple;
+    }
+
     public void mergeProtocol(ProtocolConfig sourceConfig) {
         if (sourceConfig == null) {
             return;
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/TripleConfig.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/TripleConfig.java
deleted file mode 100644
index 1b7469ee21..0000000000
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/TripleConfig.java
+++ /dev/null
@@ -1,118 +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.config;
-
-import java.io.Serializable;
-
-/**
- * Configuration for triple protocol.
- */
-public class TripleConfig implements Serializable {
-
-    private static final long serialVersionUID = -3682252713701362155L;
-
-    /**
-     * The header table size.
-     */
-    private String headerTableSize;
-
-    /**
-     * Whether to enable push, default is false.
-     */
-    private Boolean enablePush;
-
-    /**
-     * Maximum concurrent streams.
-     */
-    private String maxConcurrentStreams;
-
-    /**
-     * Initial window size.
-     */
-    private String initialWindowSize;
-
-    /**
-     * Maximum frame size.
-     */
-    private String maxFrameSize;
-
-    /**
-     * Maximum header list size.
-     */
-    private String maxHeaderListSize;
-
-    /**
-     * Whether to pass through standard HTTP headers, default is false.
-     */
-    private Boolean passThroughStandardHttpHeaders;
-
-    public String getHeaderTableSize() {
-        return headerTableSize;
-    }
-
-    public void setHeaderTableSize(String headerTableSize) {
-        this.headerTableSize = headerTableSize;
-    }
-
-    public Boolean getEnablePush() {
-        return enablePush;
-    }
-
-    public void setEnablePush(Boolean enablePush) {
-        this.enablePush = enablePush;
-    }
-
-    public String getMaxConcurrentStreams() {
-        return maxConcurrentStreams;
-    }
-
-    public void setMaxConcurrentStreams(String maxConcurrentStreams) {
-        this.maxConcurrentStreams = maxConcurrentStreams;
-    }
-
-    public String getInitialWindowSize() {
-        return initialWindowSize;
-    }
-
-    public void setInitialWindowSize(String initialWindowSize) {
-        this.initialWindowSize = initialWindowSize;
-    }
-
-    public String getMaxFrameSize() {
-        return maxFrameSize;
-    }
-
-    public void setMaxFrameSize(String maxFrameSize) {
-        this.maxFrameSize = maxFrameSize;
-    }
-
-    public String getMaxHeaderListSize() {
-        return maxHeaderListSize;
-    }
-
-    public void setMaxHeaderListSize(String maxHeaderListSize) {
-        this.maxHeaderListSize = maxHeaderListSize;
-    }
-
-    public Boolean getPassThroughStandardHttpHeaders() {
-        return passThroughStandardHttpHeaders;
-    }
-
-    public void setPassThroughStandardHttpHeaders(Boolean 
passThroughStandardHttpHeaders) {
-        this.passThroughStandardHttpHeaders = passThroughStandardHttpHeaders;
-    }
-}
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
index 5a15b14ac2..7fb8ff07f7 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/AbstractConfigManager.java
@@ -419,7 +419,7 @@ public abstract class AbstractConfigManager extends 
LifecycleAdapter {
         List<C> list = configsMap.values().stream()
                 .filter(c -> 
TRUE.equals(AbstractConfigManager.isDefaultConfig(c)))
                 .collect(Collectors.toList());
-        if (list.size() > 0) {
+        if (!list.isEmpty()) {
             return list;
         }
 
@@ -635,10 +635,7 @@ public abstract class AbstractConfigManager extends 
LifecycleAdapter {
      * @return
      */
     protected <T extends AbstractConfig> boolean isNeedValidation(T config) {
-        if (config instanceof MetadataReportConfig) {
-            return false;
-        }
-        return true;
+        return !(config instanceof MetadataReportConfig);
     }
 
     private ConfigValidator getConfigValidator() {
@@ -656,14 +653,11 @@ public abstract class AbstractConfigManager extends 
LifecycleAdapter {
      * @return
      */
     protected <T extends AbstractConfig> boolean isRequired(Class<T> clazz) {
-        if (clazz == RegistryConfig.class
-                || clazz == MetadataReportConfig.class
-                || clazz == MonitorConfig.class
-                || clazz == MetricsConfig.class
-                || clazz == TracingConfig.class) {
-            return false;
-        }
-        return true;
+        return clazz != RegistryConfig.class
+                && clazz != MetadataReportConfig.class
+                && clazz != MonitorConfig.class
+                && clazz != MetricsConfig.class
+                && clazz != TracingConfig.class;
     }
 
     private <T extends AbstractConfig> boolean shouldAddDefaultConfig(Class<T> 
clazz) {
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
index 58d7abf7cb..e49bf560bf 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java
@@ -197,6 +197,21 @@ public class ConfigManager extends AbstractConfigManager 
implements ApplicationE
         return getConfig(ProtocolConfig.class, idOrName);
     }
 
+    public ProtocolConfig getOrAddProtocol(String idOrName) {
+        Optional<ProtocolConfig> protocol = getProtocol(idOrName);
+        if (protocol.isPresent()) {
+            return protocol.get();
+        }
+        ProtocolConfig protocolConfig = new ProtocolConfig(idOrName);
+        addProtocol(protocolConfig);
+        // addProtocol triggers refresh when other protocols exist in the 
ConfigManager.
+        // So refresh is only done when ProtocolConfig is not refreshed.
+        if (!protocolConfig.isRefreshed()) {
+            protocolConfig.refresh();
+        }
+        return protocolConfig;
+    }
+
     public List<ProtocolConfig> getDefaultProtocols() {
         return getDefaultConfigs(ProtocolConfig.class);
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/TripleConfig.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/TripleConfig.java
new file mode 100644
index 0000000000..0edaf61c36
--- /dev/null
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/TripleConfig.java
@@ -0,0 +1,237 @@
+/*
+ * 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.config.nested;
+
+import java.io.Serializable;
+
+/**
+ * Configuration for triple protocol.
+ */
+public class TripleConfig implements Serializable {
+
+    private static final long serialVersionUID = -3682252713701362155L;
+
+    /**
+     * Maximum allowed size for HTTP1 request bodies.
+     * Limits the size of request to prevent excessively large request.
+     * <p>The default value is 8MiB.
+     */
+    private Integer maxBodySize;
+
+    /**
+     * Maximum allowed size for HTTP1 response bodies.
+     * Limits the size of responses to prevent excessively large response.
+     * <p>The default value is 8MiB.
+     */
+    private Integer maxResponseBodySize;
+
+    /**
+     * Set the maximum chunk size.
+     * HTTP requests and responses can be quite large, in which case it's 
better to process the data as a stream of
+     * chunks.
+     * This sets the limit, in bytes, at which Netty will send a chunk down 
the pipeline.
+     * <p>The default value is 8MiB.
+     */
+    private Integer maxChunkSize;
+
+    /**
+     * Set the maximum line length of header lines.
+     * This limits how much memory Netty will use when parsing HTTP header 
key-value pairs.
+     * You would typically set this to the same value as {@link 
#setMaxInitialLineLength(Integer)}.
+     * <p>The default value is 8KiB.
+     */
+    private Integer maxHeaderSize;
+
+    /**
+     * Set the maximum length of the first line of the HTTP header.
+     * This limits how much memory Netty will use when parsed the initial HTTP 
header line.
+     * You would typically set this to the same value as {@link 
#setMaxHeaderSize(Integer)}.
+     * <p>The default value is 4096.
+     */
+    private Integer maxInitialLineLength;
+
+    /**
+     * Set the initial size of the temporary buffer used when parsing the 
lines of the HTTP headers.
+     * <p>The default value is 16384 octets.
+     */
+    private Integer initialBufferSize;
+
+    /**
+     * The header table size.
+     */
+    private Integer headerTableSize;
+
+    /**
+     * Whether to enable push, default is false.
+     */
+    private Boolean enablePush;
+
+    /**
+     * Maximum concurrent streams.
+     */
+    private Integer maxConcurrentStreams;
+
+    /**
+     * Initial window size.
+     */
+    private Integer initialWindowSize;
+
+    /**
+     * Maximum frame size.
+     */
+    private Integer maxFrameSize;
+
+    /**
+     * Maximum header list size.
+     */
+    private Integer maxHeaderListSize;
+
+    public Integer getMaxBodySize() {
+        return maxBodySize;
+    }
+
+    public void setMaxBodySize(Integer maxBodySize) {
+        this.maxBodySize = maxBodySize;
+    }
+
+    public Integer getMaxResponseBodySize() {
+        return maxResponseBodySize;
+    }
+
+    public void setMaxResponseBodySize(Integer maxResponseBodySize) {
+        this.maxResponseBodySize = maxResponseBodySize;
+    }
+
+    public Integer getMaxChunkSize() {
+        return maxChunkSize;
+    }
+
+    public void setMaxChunkSize(Integer maxChunkSize) {
+        this.maxChunkSize = maxChunkSize;
+    }
+
+    public Integer getMaxHeaderSize() {
+        return maxHeaderSize;
+    }
+
+    public void setMaxHeaderSize(Integer maxHeaderSize) {
+        this.maxHeaderSize = maxHeaderSize;
+    }
+
+    public Integer getMaxInitialLineLength() {
+        return maxInitialLineLength;
+    }
+
+    public void setMaxInitialLineLength(Integer maxInitialLineLength) {
+        this.maxInitialLineLength = maxInitialLineLength;
+    }
+
+    public Integer getInitialBufferSize() {
+        return initialBufferSize;
+    }
+
+    public void setInitialBufferSize(Integer initialBufferSize) {
+        this.initialBufferSize = initialBufferSize;
+    }
+
+    public Integer getHeaderTableSize() {
+        return headerTableSize;
+    }
+
+    public void setHeaderTableSize(Integer headerTableSize) {
+        this.headerTableSize = headerTableSize;
+    }
+
+    public Boolean getEnablePush() {
+        return enablePush;
+    }
+
+    public void setEnablePush(Boolean enablePush) {
+        this.enablePush = enablePush;
+    }
+
+    public Integer getMaxConcurrentStreams() {
+        return maxConcurrentStreams;
+    }
+
+    public void setMaxConcurrentStreams(Integer maxConcurrentStreams) {
+        this.maxConcurrentStreams = maxConcurrentStreams;
+    }
+
+    public Integer getInitialWindowSize() {
+        return initialWindowSize;
+    }
+
+    public void setInitialWindowSize(Integer initialWindowSize) {
+        this.initialWindowSize = initialWindowSize;
+    }
+
+    public Integer getMaxFrameSize() {
+        return maxFrameSize;
+    }
+
+    public void setMaxFrameSize(Integer maxFrameSize) {
+        this.maxFrameSize = maxFrameSize;
+    }
+
+    public Integer getMaxHeaderListSize() {
+        return maxHeaderListSize;
+    }
+
+    public void setMaxHeaderListSize(Integer maxHeaderListSize) {
+        this.maxHeaderListSize = maxHeaderListSize;
+    }
+
+    public void checkDefault() {
+        if (maxBodySize == null) {
+            maxBodySize = 1 << 23;
+        }
+        if (maxResponseBodySize == null) {
+            maxResponseBodySize = 1 << 23;
+        }
+        if (maxChunkSize == null) {
+            maxChunkSize = 1 << 23;
+        }
+        if (maxHeaderSize == null) {
+            maxHeaderSize = 8192;
+        }
+        if (maxInitialLineLength == null) {
+            maxInitialLineLength = 4096;
+        }
+        if (initialBufferSize == null) {
+            initialBufferSize = 16384;
+        }
+        if (headerTableSize == null) {
+            headerTableSize = 4096;
+        }
+        if (enablePush == null) {
+            enablePush = false;
+        }
+        if (maxConcurrentStreams == null) {
+            maxConcurrentStreams = Integer.MAX_VALUE;
+        }
+        if (initialWindowSize == null) {
+            initialWindowSize = 1 << 23;
+        }
+        if (maxFrameSize == null) {
+            maxFrameSize = 1 << 23;
+        }
+        if (maxHeaderListSize == null) {
+            maxHeaderListSize = 1 << 15;
+        }
+    }
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/builders/TripleBuilder.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/builders/TripleBuilder.java
new file mode 100644
index 0000000000..4e0b553ecf
--- /dev/null
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/bootstrap/builders/TripleBuilder.java
@@ -0,0 +1,212 @@
+/*
+ * 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.config.bootstrap.builders;
+
+import org.apache.dubbo.config.nested.TripleConfig;
+
+/**
+ * This is a builder for build {@link TripleConfig}.
+ *
+ * @since 3.3
+ */
+public class TripleBuilder {
+
+    /**
+     * Maximum allowed size for HTTP1 request bodies.
+     * Limits the size of request to prevent excessively large request.
+     * <p>The default value is 8MiB.
+     */
+    private Integer maxBodySize;
+
+    /**
+     * Maximum allowed size for HTTP1 response bodies.
+     * Limits the size of responses to prevent excessively large response.
+     * <p>The default value is 8MiB.
+     */
+    private Integer maxResponseBodySize;
+
+    /**
+     * Set the maximum chunk size.
+     * HTTP requests and responses can be quite large, in which case it's 
better to process the data as a stream of
+     * chunks.
+     * This sets the limit, in bytes, at which Netty will send a chunk down 
the pipeline.
+     * <p>The default value is 8KiB.
+     */
+    private Integer maxChunkSize;
+
+    /**
+     * Set the maximum line length of header lines.
+     * This limits how much memory Netty will use when parsing HTTP header 
key-value pairs.
+     * You would typically set this to the same value as {@link 
#maxInitialLineLength(Integer)}.
+     * <p>The default value is 8KiB.
+     */
+    private Integer maxHeaderSize;
+
+    /**
+     * Set the maximum length of the first line of the HTTP header.
+     * This limits how much memory Netty will use when parsed the initial HTTP 
header line.
+     * You would typically set this to the same value as {@link 
#maxHeaderSize(Integer)}.
+     * <p>The default value is 4096.
+     */
+    private Integer maxInitialLineLength;
+
+    /**
+     * Set the initial size of the temporary buffer used when parsing the 
lines of the HTTP headers.
+     * <p>The default value is 128 octets.
+     */
+    private Integer initialBufferSize;
+
+    /**
+     * The header table size.
+     */
+    private Integer headerTableSize;
+
+    /**
+     * Whether to enable push, default is false.
+     */
+    private Boolean enablePush;
+
+    /**
+     * Maximum concurrent streams.
+     */
+    private Integer maxConcurrentStreams;
+
+    /**
+     * Initial window size.
+     */
+    private Integer initialWindowSize;
+
+    /**
+     * Maximum frame size.
+     */
+    private Integer maxFrameSize;
+
+    /**
+     * Maximum header list size.
+     */
+    private Integer maxHeaderListSize;
+
+    public static TripleBuilder newBuilder() {
+        return new TripleBuilder();
+    }
+
+    public TripleBuilder maxBodySize(Integer maxBodySize) {
+        this.maxBodySize = maxBodySize;
+        return getThis();
+    }
+
+    public TripleBuilder maxResponseBodySize(Integer maxResponseBodySize) {
+        this.maxResponseBodySize = maxResponseBodySize;
+        return getThis();
+    }
+
+    public TripleBuilder maxChunkSize(Integer maxChunkSize) {
+        this.maxChunkSize = maxChunkSize;
+        return getThis();
+    }
+
+    public TripleBuilder maxHeaderSize(Integer maxHeaderSize) {
+        this.maxHeaderSize = maxHeaderSize;
+        return getThis();
+    }
+
+    public TripleBuilder maxInitialLineLength(Integer maxInitialLineLength) {
+        this.maxInitialLineLength = maxInitialLineLength;
+        return getThis();
+    }
+
+    public TripleBuilder initialBufferSize(Integer initialBufferSize) {
+        this.initialBufferSize = initialBufferSize;
+        return getThis();
+    }
+
+    public TripleBuilder headerTableSize(Integer headerTableSize) {
+        this.headerTableSize = headerTableSize;
+        return getThis();
+    }
+
+    public TripleBuilder enablePush(Boolean enablePush) {
+        this.enablePush = enablePush;
+        return getThis();
+    }
+
+    public TripleBuilder maxConcurrentStreams(Integer maxConcurrentStreams) {
+        this.maxConcurrentStreams = maxConcurrentStreams;
+        return getThis();
+    }
+
+    public TripleBuilder initialWindowSize(Integer initialWindowSize) {
+        this.initialWindowSize = initialWindowSize;
+        return getThis();
+    }
+
+    public TripleBuilder maxFrameSize(Integer maxFrameSize) {
+        this.maxFrameSize = maxFrameSize;
+        return getThis();
+    }
+
+    public TripleBuilder maxHeaderListSize(Integer maxHeaderListSize) {
+        this.maxHeaderListSize = maxHeaderListSize;
+        return getThis();
+    }
+
+    protected TripleBuilder getThis() {
+        return this;
+    }
+
+    public TripleConfig build() {
+        TripleConfig triple = new TripleConfig();
+
+        if (maxBodySize != null) {
+            triple.setMaxBodySize(maxBodySize);
+        }
+        if (maxResponseBodySize != null) {
+            triple.setMaxResponseBodySize(maxResponseBodySize);
+        }
+        if (maxChunkSize != null) {
+            triple.setMaxChunkSize(maxChunkSize);
+        }
+        if (maxHeaderSize != null) {
+            triple.setMaxHeaderSize(maxHeaderSize);
+        }
+        if (maxInitialLineLength != null) {
+            triple.setMaxInitialLineLength(maxInitialLineLength);
+        }
+        if (initialBufferSize != null) {
+            triple.setInitialBufferSize(initialBufferSize);
+        }
+        if (headerTableSize != null) {
+            triple.setHeaderTableSize(headerTableSize);
+        }
+        if (enablePush != null) {
+            triple.setEnablePush(enablePush);
+        }
+        if (maxConcurrentStreams != null) {
+            triple.setMaxConcurrentStreams(maxConcurrentStreams);
+        }
+        if (initialWindowSize != null) {
+            triple.setInitialWindowSize(initialWindowSize);
+        }
+        if (maxFrameSize != null) {
+            triple.setMaxFrameSize(maxFrameSize);
+        }
+        if (maxHeaderListSize != null) {
+            triple.setMaxHeaderListSize(maxHeaderListSize);
+        }
+        return triple;
+    }
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
index c10c8eefc2..ef198ebf6c 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ProtocolConfigTest.java
@@ -35,6 +35,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasEntry;
 import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
 class ProtocolConfigTest {
@@ -56,11 +58,35 @@ class ProtocolConfigTest {
     }
 
     @Test
-    void testName() throws Exception {
+    void testDefaultTripleConfig() {
+        ProtocolConfig protocol = new ProtocolConfig();
+        protocol.refresh();
+        Map<String, String> parameters = new HashMap<>();
+        ProtocolConfig.appendParameters(parameters, protocol);
+        assertThat(parameters.isEmpty(), is(false));
+        // http2 default config
+        assertEquals(4096, 
Integer.parseInt(parameters.get("triple.header.table.size")));
+        
assertFalse(Boolean.parseBoolean(parameters.get("triple.enable.push")));
+        assertEquals(Integer.MAX_VALUE, 
Integer.parseInt(parameters.get("triple.max.concurrent.streams")));
+        assertEquals(1 << 23, 
Integer.parseInt(parameters.get("triple.initial.window.size")));
+        assertEquals(1 << 23, 
Integer.parseInt(parameters.get("triple.max.frame.size")));
+        assertEquals(1 << 15, 
Integer.parseInt(parameters.get("triple.max.header.list.size")));
+
+        // http1 default config
+        assertEquals(1 << 23, 
Integer.parseInt(parameters.get("triple.max.body.size")));
+        assertEquals(1 << 23, 
Integer.parseInt(parameters.get("triple.max.response.body.size")));
+        assertEquals(1 << 23, 
Integer.parseInt(parameters.get("triple.max.chunk.size")));
+        assertEquals(8192, 
Integer.parseInt(parameters.get("triple.max.header.size")));
+        assertEquals(4096, 
Integer.parseInt(parameters.get("triple.max.initial.line.length")));
+        assertEquals(16384, 
Integer.parseInt(parameters.get("triple.initial.buffer.size")));
+    }
+
+    @Test
+    void testName() {
         ProtocolConfig protocol = new ProtocolConfig();
         String protocolName = "xprotocol";
         protocol.setName(protocolName);
-        Map<String, String> parameters = new HashMap<String, String>();
+        Map<String, String> parameters = new HashMap<>();
         ProtocolConfig.appendParameters(parameters, protocol);
         assertThat(protocol.getName(), equalTo(protocolName));
         assertThat(protocol.getId(), equalTo(null));
@@ -68,7 +94,7 @@ class ProtocolConfigTest {
     }
 
     @Test
-    void testHost() throws Exception {
+    void testHost() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setHost("host");
         Map<String, String> parameters = new HashMap<String, String>();
@@ -78,21 +104,21 @@ class ProtocolConfigTest {
     }
 
     @Test
-    void testPort() throws Exception {
+    void testPort() {
         ProtocolConfig protocol = new ProtocolConfig();
         int port = NetUtils.getAvailablePort();
         protocol.setPort(port);
-        Map<String, String> parameters = new HashMap<String, String>();
+        Map<String, String> parameters = new HashMap<>();
         ProtocolConfig.appendParameters(parameters, protocol);
         assertThat(protocol.getPort(), equalTo(port));
         assertThat(parameters.isEmpty(), is(true));
     }
 
     @Test
-    void testPath() throws Exception {
+    void testPath() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setContextpath("context-path");
-        Map<String, String> parameters = new HashMap<String, String>();
+        Map<String, String> parameters = new HashMap<>();
         ProtocolConfig.appendParameters(parameters, protocol);
         assertThat(protocol.getPath(), equalTo("context-path"));
         assertThat(protocol.getContextpath(), equalTo("context-path"));
@@ -103,42 +129,42 @@ class ProtocolConfigTest {
     }
 
     @Test
-    void testCorethreads() throws Exception {
+    void testCorethreads() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setCorethreads(10);
         assertThat(protocol.getCorethreads(), is(10));
     }
 
     @Test
-    void testThreads() throws Exception {
+    void testThreads() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setThreads(10);
         assertThat(protocol.getThreads(), is(10));
     }
 
     @Test
-    void testIothreads() throws Exception {
+    void testIothreads() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setIothreads(10);
         assertThat(protocol.getIothreads(), is(10));
     }
 
     @Test
-    void testQueues() throws Exception {
+    void testQueues() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setQueues(10);
         assertThat(protocol.getQueues(), is(10));
     }
 
     @Test
-    void testAccepts() throws Exception {
+    void testAccepts() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setAccepts(10);
         assertThat(protocol.getAccepts(), is(10));
     }
 
     @Test
-    void testCodec() throws Exception {
+    void testCodec() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setName("dubbo");
         protocol.setCodec("mockcodec");
@@ -146,84 +172,84 @@ class ProtocolConfigTest {
     }
 
     @Test
-    void testAccesslog() throws Exception {
+    void testAccesslog() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setAccesslog("access.log");
         assertThat(protocol.getAccesslog(), equalTo("access.log"));
     }
 
     @Test
-    void testTelnet() throws Exception {
+    void testTelnet() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setTelnet("mocktelnethandler");
         assertThat(protocol.getTelnet(), equalTo("mocktelnethandler"));
     }
 
     @Test
-    void testRegister() throws Exception {
+    void testRegister() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setRegister(true);
         assertThat(protocol.isRegister(), is(true));
     }
 
     @Test
-    void testTransporter() throws Exception {
+    void testTransporter() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setTransporter("mocktransporter");
         assertThat(protocol.getTransporter(), equalTo("mocktransporter"));
     }
 
     @Test
-    void testExchanger() throws Exception {
+    void testExchanger() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setExchanger("mockexchanger");
         assertThat(protocol.getExchanger(), equalTo("mockexchanger"));
     }
 
     @Test
-    void testDispatcher() throws Exception {
+    void testDispatcher() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setDispatcher("mockdispatcher");
         assertThat(protocol.getDispatcher(), equalTo("mockdispatcher"));
     }
 
     @Test
-    void testNetworker() throws Exception {
+    void testNetworker() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setNetworker("networker");
         assertThat(protocol.getNetworker(), equalTo("networker"));
     }
 
     @Test
-    void testParameters() throws Exception {
+    void testParameters() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setParameters(Collections.singletonMap("k1", "v1"));
         assertThat(protocol.getParameters(), hasEntry("k1", "v1"));
     }
 
     @Test
-    void testDefault() throws Exception {
+    void testDefault() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setDefault(true);
         assertThat(protocol.isDefault(), is(true));
     }
 
     @Test
-    void testKeepAlive() throws Exception {
+    void testKeepAlive() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setKeepAlive(true);
         assertThat(protocol.getKeepAlive(), is(true));
     }
 
     @Test
-    void testOptimizer() throws Exception {
+    void testOptimizer() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setOptimizer("optimizer");
         assertThat(protocol.getOptimizer(), equalTo("optimizer"));
     }
 
     @Test
-    void testExtension() throws Exception {
+    void testExtension() {
         ProtocolConfig protocol = new ProtocolConfig();
         protocol.setExtension("extension");
         assertThat(protocol.getExtension(), equalTo("extension"));
@@ -384,7 +410,7 @@ class ProtocolConfigTest {
     }
 
     @Test
-    void testPreferSerializationDefault1() throws Exception {
+    void testPreferSerializationDefault1() {
         ProtocolConfig protocolConfig = new ProtocolConfig();
         assertNull(protocolConfig.getPreferSerialization());
 
@@ -400,7 +426,7 @@ class ProtocolConfigTest {
     }
 
     @Test
-    void testPreferSerializationDefault2() throws Exception {
+    void testPreferSerializationDefault2() {
         ProtocolConfig protocolConfig = new ProtocolConfig();
         assertNull(protocolConfig.getPreferSerialization());
 
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
index 79aeb132ae..d46740eb95 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/DubboBootstrapTest.java
@@ -35,6 +35,7 @@ import org.apache.dubbo.config.api.DemoService;
 import org.apache.dubbo.config.deploy.DefaultApplicationDeployer;
 import org.apache.dubbo.config.metadata.ConfigurableMetadataServiceExporter;
 import org.apache.dubbo.config.metadata.ExporterDeployListener;
+import org.apache.dubbo.config.nested.TripleConfig;
 import org.apache.dubbo.config.provider.impl.DemoServiceImpl;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.metadata.MetadataService;
@@ -57,6 +58,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Properties;
 import java.util.stream.Collectors;
 
@@ -472,6 +474,50 @@ class DubboBootstrapTest {
         });
     }
 
+    @Test
+    void testDefaultTriple() {
+        ServiceConfig<DemoService> service = new ServiceConfig<>();
+        service.setInterface(DemoService.class);
+        service.setRef(new DemoServiceImpl());
+
+        TripleConfig triple = new TripleConfig();
+        triple.setMaxBodySize(50);
+        triple.setMaxResponseBodySize(100);
+
+        ProtocolConfig protocolConfig = new 
ProtocolConfig(CommonConstants.DUBBO_PROTOCOL, -1);
+        protocolConfig.setTriple(triple);
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap
+                .application(new ApplicationConfig("bootstrap-test"))
+                .registry(new RegistryConfig(zkServerAddress))
+                .protocol(protocolConfig)
+                .service(service)
+                .start();
+
+        TripleConfig tripleConfig = bootstrap
+                .getConfigManager()
+                .getProtocol(protocolConfig.getName())
+                .flatMap(protocol -> Optional.of(protocol.getTriple()))
+                .orElse(null);
+
+        // check custom value
+        Assertions.assertEquals(50, tripleConfig.getMaxBodySize());
+        Assertions.assertEquals(100, tripleConfig.getMaxResponseBodySize());
+
+        // check default value
+        Assertions.assertEquals(1 << 23, tripleConfig.getMaxChunkSize());
+        Assertions.assertEquals(8192, tripleConfig.getMaxHeaderSize());
+        Assertions.assertEquals(4096, tripleConfig.getMaxInitialLineLength());
+        Assertions.assertEquals(16384, tripleConfig.getInitialBufferSize());
+        Assertions.assertEquals(4096, tripleConfig.getHeaderTableSize());
+        Assertions.assertFalse(tripleConfig.getEnablePush());
+        Assertions.assertEquals(Integer.MAX_VALUE, 
tripleConfig.getMaxConcurrentStreams());
+        Assertions.assertEquals(1 << 23, tripleConfig.getInitialWindowSize());
+        Assertions.assertEquals(1 << 23, tripleConfig.getMaxFrameSize());
+        Assertions.assertEquals(1 << 15, tripleConfig.getMaxHeaderListSize());
+    }
+
     private ExporterDeployListener getListener(ApplicationModel model) {
         return (ExporterDeployListener)
                 
model.getExtensionLoader(ApplicationDeployListener.class).getExtension("exporter");
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/TripleBuilderTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/TripleBuilderTest.java
new file mode 100644
index 0000000000..1450412a53
--- /dev/null
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/bootstrap/builders/TripleBuilderTest.java
@@ -0,0 +1,143 @@
+/*
+ * 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.config.bootstrap.builders;
+
+import org.apache.dubbo.config.nested.TripleConfig;
+
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+class TripleBuilderTest {
+
+    @Test
+    void maxBodySize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxBodySize(10240);
+        Assertions.assertEquals(10240, builder.build().getMaxBodySize());
+    }
+
+    @Test
+    void maxResponseBodySize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxResponseBodySize(8192);
+        Assertions.assertEquals(8192, 
builder.build().getMaxResponseBodySize());
+    }
+
+    @Test
+    void maxChunkSize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxChunkSize(2048);
+        Assertions.assertEquals(2048, builder.build().getMaxChunkSize());
+    }
+
+    @Test
+    void maxHeaderSize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxHeaderSize(40960);
+        Assertions.assertEquals(40960, builder.build().getMaxHeaderSize());
+    }
+
+    @Test
+    void maxInitialLineLength() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxInitialLineLength(Integer.MAX_VALUE);
+        Assertions.assertEquals(Integer.MAX_VALUE, 
builder.build().getMaxInitialLineLength());
+    }
+
+    @Test
+    void initialBufferSize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.initialBufferSize(3000);
+        Assertions.assertEquals(3000, builder.build().getInitialBufferSize());
+    }
+
+    @Test
+    void headerTableSize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.headerTableSize(1000);
+        Assertions.assertEquals(1000, builder.build().getHeaderTableSize());
+    }
+
+    @Test
+    void enablePush() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.enablePush(false);
+        Assertions.assertFalse(builder.build().getEnablePush());
+    }
+
+    @Test
+    void maxConcurrentStreams() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxConcurrentStreams(3000);
+        Assertions.assertEquals(3000, 
builder.build().getMaxConcurrentStreams());
+    }
+
+    @Test
+    void initialWindowSize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.initialWindowSize(10240);
+        Assertions.assertEquals(10240, builder.build().getInitialWindowSize());
+    }
+
+    @Test
+    void maxFrameSize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxFrameSize(4096);
+        Assertions.assertEquals(4096, builder.build().getMaxFrameSize());
+    }
+
+    @Test
+    void maxHeaderListSize() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxHeaderListSize(2000);
+        Assertions.assertEquals(2000, builder.build().getMaxHeaderListSize());
+    }
+
+    @Test
+    void build() {
+        TripleBuilder builder = TripleBuilder.newBuilder();
+        builder.maxBodySize(2048)
+                .maxResponseBodySize(3072)
+                .maxChunkSize(10240)
+                .maxHeaderSize(400)
+                .maxInitialLineLength(100)
+                .initialBufferSize(8192)
+                .headerTableSize(300)
+                .enablePush(true)
+                .maxConcurrentStreams(Integer.MAX_VALUE)
+                .initialWindowSize(4096)
+                .maxFrameSize(1024)
+                .maxHeaderListSize(500);
+
+        TripleConfig config = builder.build();
+        TripleConfig config2 = builder.build();
+
+        Assertions.assertEquals(2048, config.getMaxBodySize());
+        Assertions.assertEquals(3072, config.getMaxResponseBodySize());
+        Assertions.assertEquals(10240, config.getMaxChunkSize());
+        Assertions.assertEquals(400, config.getMaxHeaderSize());
+        Assertions.assertEquals(100, config.getMaxInitialLineLength());
+        Assertions.assertEquals(8192, config.getInitialBufferSize());
+        Assertions.assertEquals(300, config.getHeaderTableSize());
+        Assertions.assertTrue(config.getEnablePush());
+        Assertions.assertEquals(Integer.MAX_VALUE, 
config.getMaxConcurrentStreams());
+        Assertions.assertEquals(4096, config.getInitialWindowSize());
+        Assertions.assertEquals(1024, config.getMaxFrameSize());
+        Assertions.assertEquals(500, config.getMaxHeaderListSize());
+        Assertions.assertNotSame(config, config2);
+    }
+}
diff --git 
a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd 
b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
index 32f67add22..f07843a9cb 100644
--- a/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
+++ b/dubbo-config/dubbo-config-spring/src/main/resources/META-INF/dubbo.xsd
@@ -1134,6 +1134,80 @@
         </xsd:attribute>
     </xsd:complexType>
 
+    <xsd:complexType name="tripleType">
+        <xsd:attribute name="max-body-size" type="xsd:integer" 
default="8388608">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Maximum allowed size for HTTP1 
request bodies. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="max-response-body-size" type="xsd:integer" 
default="8388608">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Maximum allowed size for HTTP1 
response bodies. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="max-chunk-size" type="xsd:integer" 
default="8388608">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Set the maximum chunk size. 
]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="max-header-size" type="xsd:integer" 
default="8192">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Set the maximum line length of 
header lines. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="max-initial-line-length" type="xsd:integer" 
default="4096">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Set the maximum length of the 
first line of the HTTP header. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="initial-buffer-size" type="xsd:integer" 
default="16384">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Set the initial size of the 
temporary buffer used when parsing the lines of the HTTP headers. 
]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="header-table-size" type="xsd:integer" 
default="4096">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ The header table size. 
]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="enable-push" type="xsd:boolean" default="false">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Whether to enable push, default 
is false. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="max-concurrent-streams" type="xsd:integer" 
default="2147483647">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Maximum concurrent streams 
]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="initial-window-size" type="xsd:integer" 
default="8388608">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Whether to enable push, default 
is false. ]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="max-frame-size" type="xsd:integer" 
default="8388608">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Maximum concurrent streams 
]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+
+        <xsd:attribute name="max-header-list-size" type="xsd:integer" 
default="32768">
+            <xsd:annotation>
+                <xsd:documentation><![CDATA[ Maximum header list size. 
]]></xsd:documentation>
+            </xsd:annotation>
+        </xsd:attribute>
+    </xsd:complexType>
+
     <xsd:complexType name="prometheusExporterType">
         <xsd:attribute name="enabled" type="xsd:boolean">
             <xsd:annotation>
@@ -1508,6 +1582,7 @@
     <xsd:complexType name="protocolType">
         <xsd:sequence minOccurs="0" maxOccurs="unbounded">
             <xsd:element ref="parameter" minOccurs="0" maxOccurs="unbounded"/>
+            <xsd:element ref="triple" minOccurs="0" />
         </xsd:sequence>
         <xsd:attribute name="id" type="xsd:ID">
             <xsd:annotation>
@@ -2179,6 +2254,17 @@
         </xsd:annotation>
     </xsd:element>
 
+    <xsd:element name="triple" type="tripleType">
+        <xsd:annotation>
+            <xsd:documentation><![CDATA[ The triple config 
]]></xsd:documentation>
+            <xsd:appinfo>
+                <tool:annotation>
+                    <tool:exports 
type="org.apache.dubbo.config.nested.TripleConfig"/>
+                </tool:annotation>
+            </xsd:appinfo>
+        </xsd:annotation>
+    </xsd:element>
+
     <xsd:element name="prometheus-exporter" type="prometheusExporterType">
         <xsd:annotation>
             <xsd:documentation><![CDATA[ The metrics prometheus exporter 
config. ]]></xsd:documentation>
diff --git 
a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java 
b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java
index afad51c598..222dfcaf5d 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/Constants.java
@@ -97,12 +97,6 @@ public interface Constants {
     String INVOCATION_KEY = "invocation";
     String SERIALIZATION_ID_KEY = "serialization_id";
 
-    String H2_SETTINGS_HEADER_TABLE_SIZE_KEY = 
"dubbo.rpc.tri.header-table-size";
-    String H2_SETTINGS_ENABLE_PUSH_KEY = "dubbo.rpc.tri.enable-push";
-    String H2_SETTINGS_MAX_CONCURRENT_STREAMS_KEY = 
"dubbo.rpc.tri.max-concurrent-streams";
-    String H2_SETTINGS_INITIAL_WINDOW_SIZE_KEY = 
"dubbo.rpc.tri.initial-window-size";
-    String H2_SETTINGS_MAX_FRAME_SIZE_KEY = "dubbo.rpc.tri.max-frame-size";
-    String H2_SETTINGS_MAX_HEADER_LIST_SIZE_KEY = 
"dubbo.rpc.tri.max-header-list-size";
     String H2_SETTINGS_SUPPORT_NO_LOWER_HEADER_KEY = 
"dubbo.rpc.tri.support-no-lower-header";
     String H2_SETTINGS_IGNORE_1_0_0_KEY = "dubbo.rpc.tri.ignore-1.0.0-version";
     String H2_SETTINGS_RESOLVE_FALLBACK_TO_DEFAULT_KEY = 
"dubbo.rpc.tri.resolve-fallback-to-default";
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriHttp2RemoteFlowController.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriHttp2RemoteFlowController.java
index aa5339317d..e2eb02f6f0 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriHttp2RemoteFlowController.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TriHttp2RemoteFlowController.java
@@ -16,9 +16,7 @@
 
 package org.apache.dubbo.rpc.protocol.tri;
 
-import org.apache.dubbo.common.config.Configuration;
-import org.apache.dubbo.common.config.ConfigurationUtils;
-import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.config.nested.TripleConfig;
 
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.handler.codec.http2.Http2Connection;
@@ -37,7 +35,6 @@ import io.netty.util.internal.logging.InternalLoggerFactory;
 import java.util.ArrayDeque;
 import java.util.Deque;
 
-import static io.netty.handler.codec.http2.Http2CodecUtil.DEFAULT_WINDOW_SIZE;
 import static io.netty.handler.codec.http2.Http2CodecUtil.MAX_WEIGHT;
 import static io.netty.handler.codec.http2.Http2CodecUtil.MIN_WEIGHT;
 import static io.netty.handler.codec.http2.Http2Error.FLOW_CONTROL_ERROR;
@@ -49,47 +46,43 @@ import static 
io.netty.util.internal.ObjectUtil.checkNotNull;
 import static io.netty.util.internal.ObjectUtil.checkPositiveOrZero;
 import static java.lang.Math.max;
 import static java.lang.Math.min;
-import static 
org.apache.dubbo.rpc.Constants.H2_SETTINGS_INITIAL_WINDOW_SIZE_KEY;
 
 /**
  * This design is learning from {@see 
io.netty.handler.codec.http2.DefaultHttp2RemoteFlowController} which is in 
Netty.
  */
 @UnstableApi
 public class TriHttp2RemoteFlowController implements Http2RemoteFlowController 
{
-    private static final InternalLogger logger =
-        InternalLoggerFactory.getInstance(TriHttp2RemoteFlowController.class);
+    private static final InternalLogger logger = 
InternalLoggerFactory.getInstance(TriHttp2RemoteFlowController.class);
     private static final int MIN_WRITABLE_CHUNK = 32 * 1024;
     private final Http2Connection connection;
     private final Http2Connection.PropertyKey stateKey;
     private final StreamByteDistributor streamByteDistributor;
     private final FlowState connectionState;
-    private final Configuration config;
     private int initialWindowSize;
     private WritabilityMonitor monitor;
     private ChannelHandlerContext ctx;
 
-    public TriHttp2RemoteFlowController(Http2Connection connection, 
ApplicationModel applicationModel) {
-        this(connection, (Listener) null, applicationModel);
+    public TriHttp2RemoteFlowController(Http2Connection connection, 
TripleConfig config) {
+        this(connection, (Listener) null, config);
     }
 
-    public TriHttp2RemoteFlowController(Http2Connection connection,
-                                        StreamByteDistributor 
streamByteDistributor,
-                                        ApplicationModel applicationModel) {
-        this(connection, streamByteDistributor, null, applicationModel);
+    public TriHttp2RemoteFlowController(
+            Http2Connection connection, StreamByteDistributor 
streamByteDistributor, TripleConfig config) {
+        this(connection, streamByteDistributor, null, config);
     }
 
-    public TriHttp2RemoteFlowController(Http2Connection connection, final 
Listener listener, ApplicationModel applicationModel) {
-        this(connection, new WeightedFairQueueByteDistributor(connection), 
listener, applicationModel);
+    public TriHttp2RemoteFlowController(Http2Connection connection, final 
Listener listener, TripleConfig config) {
+        this(connection, new WeightedFairQueueByteDistributor(connection), 
listener, config);
     }
 
-    public TriHttp2RemoteFlowController(Http2Connection connection,
-                                        StreamByteDistributor 
streamByteDistributor,
-                                        final Listener listener,
-                                        ApplicationModel applicationModel) {
+    public TriHttp2RemoteFlowController(
+            Http2Connection connection,
+            StreamByteDistributor streamByteDistributor,
+            final Listener listener,
+            TripleConfig config) {
         this.connection = checkNotNull(connection, "connection");
         this.streamByteDistributor = checkNotNull(streamByteDistributor, 
"streamWriteDistributor");
-        this.config = 
ConfigurationUtils.getGlobalConfiguration(applicationModel);
-        this.initialWindowSize = 
config.getInt(H2_SETTINGS_INITIAL_WINDOW_SIZE_KEY, DEFAULT_WINDOW_SIZE);
+        this.initialWindowSize = config.getInitialWindowSize();
 
         // Add a flow state for the connection.
         stateKey = connection.newKey();
@@ -414,9 +407,9 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
                 if (cancelled) {
                     cancel(INTERNAL_ERROR, cause);
                 }
-                if(monitor.isOverFlowControl()){
+                if (monitor.isOverFlowControl()) {
                     cause = new Throwable();
-                    cancel(FLOW_CONTROL_ERROR,cause);
+                    cancel(FLOW_CONTROL_ERROR, cause);
                 }
             }
             return writtenBytes;
@@ -427,8 +420,7 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
          */
         int incrementStreamWindow(int delta) throws Http2Exception {
             if (delta > 0 && Integer.MAX_VALUE - delta < window) {
-                throw streamError(stream.id(), FLOW_CONTROL_ERROR,
-                    "Window size overflow for stream: %d", stream.id());
+                throw streamError(stream.id(), FLOW_CONTROL_ERROR, "Window 
size overflow for stream: %d", stream.id());
             }
             window += delta;
             streamByteDistributor.updateStreamableBytes(this);
@@ -499,8 +491,8 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
             FlowControlled frame = pendingWriteQueue.poll();
             if (frame != null) {
                 // Only create exception once and reuse to reduce overhead of 
filling in the stacktrace.
-                final Http2Exception exception = streamError(stream.id(), 
error, cause,
-                    "Stream closed before write could take place");
+                final Http2Exception exception =
+                        streamError(stream.id(), error, cause, "Stream closed 
before write could take place");
                 do {
                     writeError(frame, exception);
                     frame = pendingWriteQueue.poll();
@@ -572,13 +564,13 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
          * Called when the writability of the underlying channel changes.
          * @throws Http2Exception If a write occurs and an exception happens 
in the write operation.
          */
-        void channelWritabilityChange() throws Http2Exception { }
+        void channelWritabilityChange() throws Http2Exception {}
 
         /**
          * Called when the state is cancelled.
          * @param state the state that was cancelled.
          */
-        void stateCancelled(FlowState state) { }
+        void stateCancelled(FlowState state) {}
 
         /**
          * Set the initial window size for {@code state}.
@@ -644,10 +636,10 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
                 int bytesToWrite = writableBytes();
                 // Make sure we always write at least once, regardless if we 
have bytesToWrite or not.
                 // This ensures that zero-length frames will always be written.
-                for (;;) {
-                    if (!streamByteDistributor.distribute(bytesToWrite, this) 
||
-                        (bytesToWrite = writableBytes()) <= 0 ||
-                        !isChannelWritable0()) {
+                for (; ; ) {
+                    if (!streamByteDistributor.distribute(bytesToWrite, this)
+                            || (bytesToWrite = writableBytes()) <= 0
+                            || !isChannelWritable0()) {
                         break;
                     }
                 }
@@ -680,9 +672,9 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
         }
 
         final boolean isOverFlowControl() {
-            if(connectionState.windowSize() == 0){
+            if (connectionState.windowSize() == 0) {
                 return true;
-            }else {
+            } else {
                 return false;
             }
         }
@@ -785,9 +777,12 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
                 checkAllWritabilityChanged();
             } else if (isWritable(state) != state.markedWritability()) {
                 notifyWritabilityChanged(state);
-            }else if(isOverFlowControl()){
-                throw streamError(state.stream().id(), FLOW_CONTROL_ERROR,
-                    "TotalPendingBytes size overflow for stream: %d", 
state.stream().id());
+            } else if (isOverFlowControl()) {
+                throw streamError(
+                        state.stream().id(),
+                        FLOW_CONTROL_ERROR,
+                        "TotalPendingBytes size overflow for stream: %d",
+                        state.stream().id());
             }
         }
 
@@ -798,4 +793,3 @@ public class TriHttp2RemoteFlowController implements 
Http2RemoteFlowController {
         }
     }
 }
-
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java
index 2a8b539527..415e8d7a31 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TripleHttp2Protocol.java
@@ -17,9 +17,8 @@
 package org.apache.dubbo.rpc.protocol.tri;
 
 import org.apache.dubbo.common.URL;
-import org.apache.dubbo.common.config.Configuration;
-import org.apache.dubbo.common.config.ConfigurationUtils;
 import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.config.nested.TripleConfig;
 import org.apache.dubbo.remoting.ChannelHandler;
 import org.apache.dubbo.remoting.api.AbstractWireProtocol;
 import org.apache.dubbo.remoting.api.pu.ChannelHandlerPretender;
@@ -31,7 +30,6 @@ import 
org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1ConnectionHandler;
 import org.apache.dubbo.remoting.http12.netty4.h2.NettyHttp2FrameCodec;
 import 
org.apache.dubbo.remoting.http12.netty4.h2.NettyHttp2ProtocolSelectorHandler;
 import org.apache.dubbo.remoting.utils.UrlUtils;
-import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.apache.dubbo.rpc.model.ScopeModelAware;
 import org.apache.dubbo.rpc.protocol.tri.h12.TripleProtocolDetector;
@@ -47,6 +45,7 @@ import java.util.List;
 import io.netty.channel.ChannelDuplexHandler;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelPipeline;
+import io.netty.handler.codec.http.HttpDecoderConfig;
 import io.netty.handler.codec.http.HttpObjectAggregator;
 import io.netty.handler.codec.http.HttpServerCodec;
 import io.netty.handler.codec.http.HttpServerUpgradeHandler;
@@ -62,25 +61,9 @@ import io.netty.handler.flush.FlushConsolidationHandler;
 import io.netty.handler.logging.LogLevel;
 import io.netty.util.AsciiString;
 
-import static org.apache.dubbo.rpc.Constants.H2_SETTINGS_ENABLE_PUSH_KEY;
-import static org.apache.dubbo.rpc.Constants.H2_SETTINGS_HEADER_TABLE_SIZE_KEY;
-import static 
org.apache.dubbo.rpc.Constants.H2_SETTINGS_INITIAL_WINDOW_SIZE_KEY;
-import static 
org.apache.dubbo.rpc.Constants.H2_SETTINGS_MAX_CONCURRENT_STREAMS_KEY;
-import static org.apache.dubbo.rpc.Constants.H2_SETTINGS_MAX_FRAME_SIZE_KEY;
-import static 
org.apache.dubbo.rpc.Constants.H2_SETTINGS_MAX_HEADER_LIST_SIZE_KEY;
-
 @Activate
 public class TripleHttp2Protocol extends AbstractWireProtocol implements 
ScopeModelAware {
 
-    // 1 MiB
-    private static final int MIB_1 = 1 << 20;
-    private static final int MIB_8 = 1 << 23;
-    private static final int KIB_32 = 1 << 15;
-    private static final int DEFAULT_MAX_HEADER_LIST_SIZE = KIB_32;
-    private static final int DEFAULT_SETTING_HEADER_LIST_SIZE = 4096;
-    private static final int DEFAULT_MAX_FRAME_SIZE = MIB_8;
-    private static final int DEFAULT_WINDOW_INIT_SIZE = MIB_8;
-
     public static final Http2FrameLogger CLIENT_LOGGER = new 
Http2FrameLogger(LogLevel.DEBUG, "H2_CLIENT");
 
     public static final Http2FrameLogger SERVER_LOGGER = new 
Http2FrameLogger(LogLevel.DEBUG, "H2_SERVER");
@@ -103,18 +86,16 @@ public class TripleHttp2Protocol extends 
AbstractWireProtocol implements ScopeMo
 
     @Override
     public void configClientPipeline(URL url, ChannelOperator operator, 
ContextOperator contextOperator) {
-        Configuration config = 
ConfigurationUtils.getGlobalConfiguration(url.getOrDefaultApplicationModel());
+        TripleConfig tripleConfig = getTripleConfig(url);
         final Http2FrameCodec codec = Http2FrameCodecBuilder.forClient()
                 .gracefulShutdownTimeoutMillis(10000)
                 .initialSettings(new Http2Settings()
-                        .headerTableSize(
-                                
config.getInt(H2_SETTINGS_HEADER_TABLE_SIZE_KEY, 
DEFAULT_SETTING_HEADER_LIST_SIZE))
-                        
.pushEnabled(config.getBoolean(H2_SETTINGS_ENABLE_PUSH_KEY, false))
-                        
.maxConcurrentStreams(config.getInt(H2_SETTINGS_MAX_CONCURRENT_STREAMS_KEY, 
Integer.MAX_VALUE))
-                        
.initialWindowSize(config.getInt(H2_SETTINGS_INITIAL_WINDOW_SIZE_KEY, 
DEFAULT_WINDOW_INIT_SIZE))
-                        
.maxFrameSize(config.getInt(H2_SETTINGS_MAX_FRAME_SIZE_KEY, 
DEFAULT_MAX_FRAME_SIZE))
-                        .maxHeaderListSize(
-                                
config.getInt(H2_SETTINGS_MAX_HEADER_LIST_SIZE_KEY, 
DEFAULT_MAX_HEADER_LIST_SIZE)))
+                        .headerTableSize(tripleConfig.getHeaderTableSize())
+                        .pushEnabled(tripleConfig.getEnablePush())
+                        
.maxConcurrentStreams(tripleConfig.getMaxConcurrentStreams())
+                        .initialWindowSize(tripleConfig.getInitialWindowSize())
+                        .maxFrameSize(tripleConfig.getMaxFrameSize())
+                        
.maxHeaderListSize(tripleConfig.getMaxHeaderListSize()))
                 .frameLogger(CLIENT_LOGGER)
                 .build();
         //        
codec.connection().local().flowController().frameWriter(codec.encoder().frameWriter());
@@ -148,17 +129,20 @@ public class TripleHttp2Protocol extends 
AbstractWireProtocol implements ScopeMo
     }
 
     private void configurerHttp1Handlers(URL url, List<ChannelHandler> 
handlers) {
-        final HttpServerCodec sourceCodec = new HttpServerCodec();
+        TripleConfig tripleConfig = getTripleConfig(url);
+        final HttpServerCodec sourceCodec = new HttpServerCodec(new 
HttpDecoderConfig()
+                .setMaxChunkSize(tripleConfig.getMaxChunkSize())
+                .setMaxHeaderSize(tripleConfig.getMaxHeaderSize())
+                
.setMaxInitialLineLength(tripleConfig.getMaxInitialLineLength())
+                .setInitialBufferSize(tripleConfig.getInitialBufferSize()));
         handlers.add(new ChannelHandlerPretender(sourceCodec));
         // Triple protocol http1 upgrade support
         handlers.add(new ChannelHandlerPretender(new HttpServerUpgradeHandler(
                 sourceCodec,
                 protocol -> {
                     if 
(AsciiString.contentEquals(Http2CodecUtil.HTTP_UPGRADE_PROTOCOL_NAME, 
protocol)) {
-                        Configuration config =
-                                
ConfigurationUtils.getGlobalConfiguration(url.getOrDefaultApplicationModel());
                         return new Http2ServerUpgradeCodec(
-                                buildHttp2FrameCodec(config, 
url.getOrDefaultApplicationModel()),
+                                buildHttp2FrameCodec(url),
                                 new HttpWriteQueueHandler(),
                                 new FlushConsolidationHandler(64, true),
                                 new TripleServerConnectionHandler(),
@@ -172,7 +156,7 @@ public class TripleHttp2Protocol extends 
AbstractWireProtocol implements ScopeMo
         // If the upgrade was successful, remove the message from the output 
list
         // so that it's not propagated to the next handler. This request will
         // be propagated as a user event instead.
-        handlers.add(new ChannelHandlerPretender(new 
HttpObjectAggregator(Integer.MAX_VALUE)));
+        handlers.add(new ChannelHandlerPretender(new 
HttpObjectAggregator(tripleConfig.getMaxBodySize())));
         handlers.add(new ChannelHandlerPretender(new NettyHttp1Codec()));
         handlers.add(new ChannelHandlerPretender(new 
NettyHttp1ConnectionHandler(
                 url, frameworkModel, 
DefaultHttp11ServerTransportListenerFactory.INSTANCE)));
@@ -191,8 +175,7 @@ public class TripleHttp2Protocol extends 
AbstractWireProtocol implements ScopeMo
     }
 
     private void configurerHttp2Handlers(URL url, List<ChannelHandler> 
handlers) {
-        Configuration config = 
ConfigurationUtils.getGlobalConfiguration(url.getOrDefaultApplicationModel());
-        final Http2FrameCodec codec = buildHttp2FrameCodec(config, 
url.getOrDefaultApplicationModel());
+        final Http2FrameCodec codec = buildHttp2FrameCodec(url);
         final Http2MultiplexHandler handler = buildHttp2MultiplexHandler(url);
         handlers.add(new ChannelHandlerPretender(new HttpWriteQueueHandler()));
         handlers.add(new ChannelHandlerPretender(codec));
@@ -202,21 +185,26 @@ public class TripleHttp2Protocol extends 
AbstractWireProtocol implements ScopeMo
         handlers.add(new ChannelHandlerPretender(new TripleTailHandler()));
     }
 
-    private Http2FrameCodec buildHttp2FrameCodec(Configuration config, 
ApplicationModel applicationModel) {
+    private Http2FrameCodec buildHttp2FrameCodec(URL url) {
+        TripleConfig tripleConfig = getTripleConfig(url);
         return TripleHttp2FrameCodecBuilder.forServer()
-                .customizeConnection((connection) -> connection
-                        .remote()
-                        .flowController(new 
TriHttp2RemoteFlowController(connection, applicationModel)))
+                .customizeConnection((connection) ->
+                        connection.remote().flowController(new 
TriHttp2RemoteFlowController(connection, tripleConfig)))
                 .gracefulShutdownTimeoutMillis(10000)
                 .initialSettings(new Http2Settings()
-                        .headerTableSize(
-                                
config.getInt(H2_SETTINGS_HEADER_TABLE_SIZE_KEY, 
DEFAULT_SETTING_HEADER_LIST_SIZE))
-                        
.maxConcurrentStreams(config.getInt(H2_SETTINGS_MAX_CONCURRENT_STREAMS_KEY, 
Integer.MAX_VALUE))
-                        
.initialWindowSize(config.getInt(H2_SETTINGS_INITIAL_WINDOW_SIZE_KEY, 
DEFAULT_WINDOW_INIT_SIZE))
-                        
.maxFrameSize(config.getInt(H2_SETTINGS_MAX_FRAME_SIZE_KEY, 
DEFAULT_MAX_FRAME_SIZE))
-                        .maxHeaderListSize(
-                                
config.getInt(H2_SETTINGS_MAX_HEADER_LIST_SIZE_KEY, 
DEFAULT_MAX_HEADER_LIST_SIZE)))
+                        .headerTableSize(tripleConfig.getHeaderTableSize())
+                        
.maxConcurrentStreams(tripleConfig.getMaxConcurrentStreams())
+                        .initialWindowSize(tripleConfig.getInitialWindowSize())
+                        .maxFrameSize(tripleConfig.getMaxFrameSize())
+                        
.maxHeaderListSize(tripleConfig.getMaxHeaderListSize()))
                 .frameLogger(SERVER_LOGGER)
                 .build();
     }
+
+    private TripleConfig getTripleConfig(URL url) {
+        return url.getOrDefaultApplicationModel()
+                .getApplicationConfigManager()
+                .getOrAddProtocol(url.getProtocol())
+                .getTriple();
+    }
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ExceptionUtilsTest.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ExceptionUtilsTest.java
index 3454548670..175ff442b7 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ExceptionUtilsTest.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/ExceptionUtilsTest.java
@@ -91,7 +91,6 @@ class ExceptionUtilsTest {
 
         URL providerUrl = URL.valueOf("tri://127.0.0.1:" + availablePort + "/" 
+ IGreeter2.class.getName())
                 .addParameter(CommonConstants.TIMEOUT_KEY, 10000);
-        ;
 
         ModuleServiceRepository serviceRepository =
                 applicationModel.getDefaultModule().getServiceRepository();
diff --git 
a/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboConfigurationProperties.java
 
b/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboConfigurationProperties.java
index f9fdce872b..3f52e12802 100644
--- 
a/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboConfigurationProperties.java
+++ 
b/dubbo-spring-boot/dubbo-spring-boot-compatible/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/autoconfigure/DubboConfigurationProperties.java
@@ -30,7 +30,7 @@ import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.RestConfig;
 import org.apache.dubbo.config.SslConfig;
 import org.apache.dubbo.config.TracingConfig;
-import org.apache.dubbo.config.TripleConfig;
+import org.apache.dubbo.config.nested.TripleConfig;
 
 import java.util.LinkedHashMap;
 import java.util.Map;

Reply via email to