Spring 引导嵌入式 Tomcat 性能
Spring Boot Embedded Tomcat Performance
我正在为我的应用程序开发微服务 API。我从 Spring 启动应用程序开始。我创建了两个工件 - "business code with embedded tomcat" 和 "business code without embedded tomcat"。
当我比较性能结果时,我可以看到 "non-embedded tomcat"(即独立执行 tomcat)由于本机执行而提供了良好的输出。
所以基本上 嵌入式 tomcat 和独立 tomcat 在实施方面有什么区别?
两次执行之间的性能差异如何?
我找到了这个问题的真正根本原因。
APR(Apache 可移植运行时)在 tomcat 线程执行中起着重要作用。
默认情况下,嵌入式tomcat执行NIO。 NIO 和 BIO 是基于 Java 的执行,而 APR 是本机执行。当我们比较 NIO 和 APR 的性能时,APR 快得多。
事实上,所有基于 Linux 的 tomcat 捆绑包都随 tomcat lib 文件夹下的 APR 库一起提供。
在嵌入式 tomcat(即 Spring 启动)中启用 APR 后,与独立 tomcat 相比,性能执行相同。
我们可以通过覆盖 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory 并提供新的 org.apache.catalina.connector.Connector 在嵌入的 springboot tomcat 中启用 APR
使用 org.apache.coyote.http11.Http11AprProtocol 协议。
下面的代码可能有助于完成它。
@Bean
public TomcatServletWebServerFactory servletContainerFactoryProd() {
TomcatServletWebServerFactory tomcat = new
TomcatServletWebServerFactory() {
@Override
protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
// to create new directories and files and add them to Context
return super.getTomcatWebServer(tomcat);
}
};
Connector connector = new Connector("org.apache.coyote.http11.Http11AprProtocol");
Http11AprProtocol protocol = (Http11AprProtocol) connector.getProtocolHandler();
connector.setProperty("compression", "on");
// can also enable ssl and provide certificate details
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}
我正在为我的应用程序开发微服务 API。我从 Spring 启动应用程序开始。我创建了两个工件 - "business code with embedded tomcat" 和 "business code without embedded tomcat"。
当我比较性能结果时,我可以看到 "non-embedded tomcat"(即独立执行 tomcat)由于本机执行而提供了良好的输出。
所以基本上 嵌入式 tomcat 和独立 tomcat 在实施方面有什么区别?
两次执行之间的性能差异如何?
我找到了这个问题的真正根本原因。
APR(Apache 可移植运行时)在 tomcat 线程执行中起着重要作用。
默认情况下,嵌入式tomcat执行NIO。 NIO 和 BIO 是基于 Java 的执行,而 APR 是本机执行。当我们比较 NIO 和 APR 的性能时,APR 快得多。
事实上,所有基于 Linux 的 tomcat 捆绑包都随 tomcat lib 文件夹下的 APR 库一起提供。
在嵌入式 tomcat(即 Spring 启动)中启用 APR 后,与独立 tomcat 相比,性能执行相同。
我们可以通过覆盖 org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory 并提供新的 org.apache.catalina.connector.Connector 在嵌入的 springboot tomcat 中启用 APR 使用 org.apache.coyote.http11.Http11AprProtocol 协议。
下面的代码可能有助于完成它。
@Bean
public TomcatServletWebServerFactory servletContainerFactoryProd() {
TomcatServletWebServerFactory tomcat = new
TomcatServletWebServerFactory() {
@Override
protected TomcatWebServer getTomcatWebServer(Tomcat tomcat) {
// to create new directories and files and add them to Context
return super.getTomcatWebServer(tomcat);
}
};
Connector connector = new Connector("org.apache.coyote.http11.Http11AprProtocol");
Http11AprProtocol protocol = (Http11AprProtocol) connector.getProtocolHandler();
connector.setProperty("compression", "on");
// can also enable ssl and provide certificate details
tomcat.addAdditionalTomcatConnectors(connector);
return tomcat;
}