Skip to content

Commit

Permalink
Added support for configuring Tomcat HTTP2 max stream size in Spring …
Browse files Browse the repository at this point in the history
…Boot
  • Loading branch information
oxsean committed Sep 20, 2024
1 parent bf51a34 commit 3782591
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ public class ServletConfig implements Serializable {
*/
private Boolean enabled;

/**
* Maximum concurrent streams.
* <p>For HTTP/2
* <p>The default value is {@link Integer#MAX_VALUE}.
*/
private Integer maxConcurrentStreams;

/**
* The URL patterns that the servlet filter will be registered for.
* <p>The default value is '/*'.
Expand All @@ -48,6 +55,14 @@ public void setEnabled(Boolean enabled) {
this.enabled = enabled;
}

public Integer getMaxConcurrentStreams() {
return maxConcurrentStreams;
}

public void setMaxConcurrentStreams(Integer maxConcurrentStreams) {
this.maxConcurrentStreams = maxConcurrentStreams;
}

public String[] getFilterUrlPatterns() {
return filterUrlPatterns;
}
Expand Down
6 changes: 3 additions & 3 deletions dubbo-spring-boot/dubbo-spring-boot-3-autoconfigure/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,9 @@
</dependency>

<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<optional>true</optional>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,16 @@
import org.apache.dubbo.rpc.protocol.tri.servlet.jakarta.TripleFilter;

import jakarta.servlet.Filter;
import org.apache.coyote.ProtocolHandler;
import org.apache.coyote.UpgradeProtocol;
import org.apache.coyote.http2.Http2Protocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
Expand Down Expand Up @@ -54,5 +59,20 @@ public FilterRegistrationBean<TripleFilter> tripleProtocolFilter(
registrationBean.setOrder(order);
return registrationBean;
}

@Bean
WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> tripleTomcatHttp2Customizer(
@Value("${" + PREFIX + ".max-concurrent-streams:2147483647}") int maxConcurrentStreams) {
return factory -> factory.addConnectorCustomizers(connector -> {
ProtocolHandler handler = connector.getProtocolHandler();
for (UpgradeProtocol upgradeProtocol : handler.findUpgradeProtocols()) {
if (upgradeProtocol instanceof Http2Protocol) {
Http2Protocol protocol = (Http2Protocol) upgradeProtocol;
protocol.setMaxConcurrentStreams(maxConcurrentStreams);
protocol.setMaxConcurrentStreamExecution(maxConcurrentStreams);
}
}
});
}
}
}
4 changes: 2 additions & 2 deletions dubbo-spring-boot/dubbo-spring-boot-autoconfigure/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<scope>provided</scope>
</dependency>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,16 @@

import javax.servlet.Filter;

import org.apache.coyote.ProtocolHandler;
import org.apache.coyote.UpgradeProtocol;
import org.apache.coyote.http2.Http2Protocol;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
import org.springframework.boot.web.embedded.tomcat.ConfigurableTomcatWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
Expand Down Expand Up @@ -55,5 +60,20 @@ public FilterRegistrationBean<TripleFilter> tripleProtocolFilter(
registrationBean.setOrder(order);
return registrationBean;
}

@Bean
WebServerFactoryCustomizer<ConfigurableTomcatWebServerFactory> tripleTomcatHttp2Customizer(
@Value("${" + PREFIX + ".max-concurrent-streams:2147483647}") int maxConcurrentStreams) {
return factory -> factory.addConnectorCustomizers(connector -> {
ProtocolHandler handler = connector.getProtocolHandler();
for (UpgradeProtocol upgradeProtocol : handler.findUpgradeProtocols()) {
if (upgradeProtocol instanceof Http2Protocol) {
Http2Protocol protocol = (Http2Protocol) upgradeProtocol;
protocol.setMaxConcurrentStreams(maxConcurrentStreams);
protocol.setMaxConcurrentStreamExecution(maxConcurrentStreams);
}
}
});
}
}
}

0 comments on commit 3782591

Please sign in to comment.