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 相比,性能执行相同。

http://tomcat.apache.org/tomcat-7.0-doc/apr.html

我们可以通过覆盖 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;
}