Spring Boot嵌入式Tomcat性能

12
我正在为我的应用程序开发微服务API,使用Spring Boot应用程序作为起点。我创建了两个构件-"带嵌入式Tomcat的业务代码""不带嵌入式Tomcat的业务代码"
当我比较性能结果时,我可以看到"非嵌入式Tomcat"(即在独立的Tomcat上执行)由于本地执行而提供了良好的输出。
因此,就实现而言,嵌入式Tomcat和独立Tomcat有什么区别? 这两种执行方式之间的性能差异如何?

你是怎么进行测试的?能解释一下吗?谢谢。 - Rudge
@Rudge:我使用Jmeter模拟了两种情况下的负载。我的业务代码中使用了Camel。在事务结束时,我打印消息历史记录,其中显示了路由信息和执行时间。当我比较嵌入式Tomcat上的两种情况的执行时间时,至少会出现20毫秒的平均延迟。 - Peter Jerald
2个回答

20

我找到了这个问题的实际根本原因。

APR(Apache Portable Runtime)在tomcat线程执行中扮演着重要角色。

默认情况下,嵌入式tomcat执行NIO。NIO和BIO都是基于Java的执行,而APR是本地执行。当我们比较NIO和APR的性能时,APR相对来说更快。

事实上,所有基于Linux的tomcat捆绑包都在tomcat lib文件夹下附带了APR库。

在我启用了嵌入式tomcat(即Spring Boot)中的APR后,与独立的tomcat相比,性能执行是相同的。

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


1
嗨,@Peter Jerald,你能告诉我如何在嵌入式Tomcat中启用APR吗? - Ace.Yin
4
@Ace.Yin 这是如何操作的:https://gist.github.com/andreldm/7f89a3279438467a0bd41e6c1249d014 - AndreLDM
Peter,你能告诉我如何在Spring Boot中启用APR吗? - Eshan I.

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接