如何将Spring嵌入式Tomcat的HTTP连接器从Nio切换为APR?
当然可以切换嵌入式Tomcat的HTTP Connector为APR!
你说得没错,APR连接器在高并发场景下性能确实比默认的NIO更优,而且完全可以在Spring Boot(你用STS开发Spring REST API应该是基于Spring Boot的吧?)的嵌入式Tomcat里配置使用,不用非得打包成WAR部署到外部Tomcat。下面是具体的实现步骤:
1. 添加APR相关依赖
首先需要在你的项目中引入Tomcat APR的嵌入式依赖,以Maven为例,在pom.xml中添加以下依赖:
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-apr</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket-apr</artifactId> </dependency>
如果是Gradle项目,对应的依赖配置是:
implementation 'org.apache.tomcat.embed:tomcat-embed-apr' implementation 'org.apache.tomcat.embed:tomcat-embed-websocket-apr'
这些依赖会自动引入APR运行所需的核心库,包括平台相关的native组件(比如Linux下的libtcnative-1.so、Windows下的tcnative-1.dll)。
2. 自定义Tomcat配置,启用APR Connector
接下来需要创建一个配置类,自定义Tomcat的ServletWebServerFactory,替换默认的NIO Connector为APR Connector。代码示例如下:
import org.apache.catalina.connector.Connector; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TomcatAprConfig { @Bean public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatAprCustomizer() { return factory -> { // 直接替换默认的Connector为APR类型 factory.setTomcatConnectorCustomizers(connector -> { connector.setProtocol("org.apache.coyote.http11.Http11AprProtocol"); }); // 如果你想保留默认NIO同时新增一个APR端口,也可以用下面的方式: // Connector aprConnector = new Connector("org.apache.coyote.http11.Http11AprProtocol"); // aprConnector.setPort(8081); // factory.addAdditionalTomcatConnectors(aprConnector); }; } }
根据你的需求选择配置方式即可,通常推荐直接替换默认Connector,这样所有请求都会走APR协议。
3. 验证APR是否生效
启动你的Spring Boot应用后,查看控制台日志,如果看到类似下面的日志,说明APR Connector已经成功启用:
INFO [main] o.a.coyote.http11.Http11AprProtocol: Starting ProtocolHandler ["http-apr-8080"]
这就证明嵌入式Tomcat现在已经在使用APR连接器处理请求了。
注意事项
- Linux环境下:确保系统已安装基础依赖(比如
apr-devel、openssl-devel),不过大多数情况下,依赖中的native组件已经足够,无需额外手动安装。 - Windows环境下:Spring Boot会自动从依赖包中加载
tcnative-1.dll,不需要手动将文件放到系统路径。
内容的提问来源于stack exchange,提问作者Yunus Emre Güler
相关产品推荐
相关产品推荐

