设为首页 收藏本站
查看: 1882|回复: 0

[经验分享] Tomcat vs. Jetty vs. Undertow: Comparison of Spring Boot Embedded Servlet Contai

[复制链接]

尚未签到

发表于 2017-12-26 13:30:37 | 显示全部楼层 |阅读模式
  原文地址:https://examples.javacodegeeks.com/enterprise-java/spring/tomcat-vs-jetty-vs-undertow-comparison-of-spring-boot-embedded-servlet-containers/
  With the rise in popularity of micro services we have seen a similar rise in popularity of applications with embedded servlet containers. Spring boot is a Java based framework that supports application services. It runs as a standalone jar with an embedded servlet container or as a WAR file inside a container.
  In this example, we will focus on the standalone jar with embedded servlet containers. The framework supports three different types of embedded servlet containers: Tomcat (default), Jetty and Undertow. We will compare the three and look at differences in properties, settings, performance and memory. Keep in mind that this example is analyzing the default configuration. There are many ways to optimize the performance or memory usage including to customize the auto configuration and component scanning.
  We used Eclipse Neon, Java 8, Maven 3.3.9, Spring 1.4.3, Tomcat 8.5.6, Jetty 9.3.14 and Undertow 1.3.24.
Table Of Contents
1. Setup Spring Boot Application2. Tomcat3. Jetty4. Undertow5. Performance and Load5.1. Measure Performance5.2. Measure Memory6. Comparison7. Conclusion8. Download the Source Code1. Setup Spring Boot Application

  We will use Maven to setup a new project in Eclipse with the appropriate dependencies. We will use the starter parent for this example but the dependencies in a production application will likely be>1.1 Setup Spring Boot Dependencies
  The default embedded servlet container is Tomcat. This version of Spring Web 1.4.3 brings in Tomcat version 8.5.6.
  pom.xml
01<parent>02   <groupId>org.springframework.boot</groupId>03   <artifactId>spring-boot-starter-parent</artifactId>04   <version>1.4.3.RELEASE</version>05</parent>06 07<dependencies>08   <!-- TOMCAT -->09   <dependency>10      <groupId>org.springframework.boot</groupId>11      <artifactId>spring-boot-starter-web</artifactId>12   </dependency>13</dependencies>1.2 Setup Spring Boot Main Application and Controllers
  To setup the Spring Boot application you include the @SpringBootApplication annotation in your Main>@SpringBootApplication annotation brings in @SpringBootConfiguration, @EnableAutoConfiguration and @ComponentScanannotations.
  Application.java
1@SpringBootApplication2@ConfigurationProperties3public class Application {4public static void main(String[] args) {5   SpringApplication.run(Application.class, args);6}  You may choose to eliminate this annotation and add the @SpringBootConfiguration alone or to another>@ComponentScan will scan your application for items like the @Controller you will need to setup a RESTful service. The following controller will return a simple “Hello World” string from a HTTP GET request. We have also included in the bundled example another endpoint mapping that returns a complex object type.
  SampleController.java
01@Controller02public class SampleController {03 04@Autowired05private ResourceLoader resourceLoader;06 07@RequestMapping("/")08@ResponseBody09public String home() {10   return "Hello World!";11}1.3 Key Configuration Parameters
  The default properties for all the embedded servlet containers are the same. Some of the most important properties to consider are the properties for configuring startup information like ports and application name, TSL, access logs, compression and many more.
  For example, to configure SSL add the following to key value pairs to the application.properties.
  application.properties
1server.port=84432server.ssl.key-store=classpath:keystore.jks3server.ssl.key-store-password=secret4server.ssl.key-password=another-secret1.4 How to Find Additional Parameters
  To explore the parameters for Spring boot applications you can add the Spring actuator dependency and the @ConfigurationProperties annotation to your Main>/configprops endpoint on your application to get a list of the available properties.
  Application.java
1@SpringBootApplication2@ConfigurationProperties3public class Application {  pom.xml
1<dependency>2   <groupId>org.springframework.boot</groupId>3   <artifactId>spring-boot-starter-actuator</artifactId>4</dependency>1http://localhost:8080/jcg/service/configprops1.5 Change version of Embedded Servlet Containers

  The embedded servlet container versions are defined in the following parent dependency from the pom. You can change the version of the embedded servlet container by explicitly including the dependency and>  pom.xml
1<dependency>2   <groupId>org.springframework.boot</groupId>3   <artifactId>spring-boot-dependencies</artifactId>4   <version>1.3.7.RELEASE</version>5</dependency>2. Tomcat
  As Tomcat is the default embedded servlet container there is nothing you need to do to the default implementation to use Tomcat. You can change the version of Tomcat you are using or change properties in the pom.xml or application.properties files.
2.2 Change Version of Tomcat
  pom.xml
01<properties><tomcat.version>8.5.6</tomcat.version></properties>02 03<dependency>04   <groupId>org.apache.tomcat.embed</groupId>05   <artifactId>tomcat-embed-core</artifactId>06   <version>${tomcat.version}</version>07</dependency>08<dependency>09   <groupId>org.apache.tomcat.embed</groupId>10   <artifactId>tomcat-embed-el</artifactId>11   <version>${tomcat.version}</version>12</dependency>13<dependency>14   <groupId>org.apache.tomcat.embed</groupId>15   <artifactId>tomcat-embed-websocket</artifactId>16   <version>${tomcat.version}</version>17</dependency>3. Jetty
  To change the embedded servlet container to Jetty you need to edit the pom file to remove the Tomcat dependency and add Jetty.
3.1 Change to Jetty (version 9.3.14)
  pom.xml
01<dependency>02   <groupId>org.springframework.boot</groupId>03   <artifactId>spring-boot-starter-web</artifactId>04   <exclusions>05      <exclusion>06         <groupId>org.springframework.boot</groupId>07         <artifactId>spring-boot-starter-tomcat</artifactId>08      </exclusion>09   </exclusions>10</dependency>11<dependency>12   <groupId>org.springframework.boot</groupId>13   <artifactId>spring-boot-starter-jetty</artifactId>14</dependency>4. Undertow
  To change the embedded servlet container to Undertow you need to edit the pom file to remove the Tomcat dependency and add Undertow.
4.1 Change to Undertow (version 1.3.24 final)
  Notice the undertow version included in the spring boot starter is incorrect, referring to 1.3.25. You’ll need to change it to 1.3.24.Final for this to work at the time of this article.
  pom.xml
01<dependency>02   <groupId>org.springframework.boot</groupId>03   <artifactId>spring-boot-starter-web</artifactId>04   <exclusions>05      <exclusion>06         <groupId>org.springframework.boot</groupId>07         <artifactId>spring-boot-starter-tomcat</artifactId>08      </exclusion>09   </exclusions>10</dependency>11<dependency>12   <groupId>org.springframework.boot</groupId>13   <artifactId>spring-boot-starter-undertow</artifactId>14</dependency>15<dependency>16   <groupId>io.undertow</groupId>17   <artifactId>undertow-core</artifactId>18   <version>1.3.24.Final</version>19</dependency>20<dependency>21   <groupId>io.undertow</groupId>22   <artifactId>undertow-servlet</artifactId>23   <version>1.3.24.Final</version>24</dependency>5. Performance and Load
  In this example, we will analyze both the peformance of HTTP requests and the memory footprint at startup of all three embedded servlet containers. We used JMeter to measure performance by simulating load and JVisualVM to look at the memory footprint.
5.1 Measure Performance
  In this example, we will analyze both the peformance of simple RESTFul GET requests that return a string and more complex GET requests that return complex JSON objects. JMeter is the tool used to measure the performance of the the three different types of containers. The key to setting up this test was establishing thread groups with the appropriate load, a counter to dynamically update the input to the API and report viewers to display or aggregate the results. For the simple string examples, we used a thread group with 1000 threads that would loop 3 times through the sequence. It also used a ramp up time of 10 seconds. For the complex object examples, we used the same parameters but did not loop.

  JMeter Tomcat Thread Group

  JMeter Tomcat Summary Report
5.1.1 Tomcat
5.1.1.1 Simple String
Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. BytesStartup30007154935.783743610293.858360355.9593557255.67238466195Others300010451.3596616820287.880241854.8209444954.53981144195Others300010241.1550322750292.112950355.6269778555.34171131955.1.1.2 Complex Object with Dynamic Data
Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. BytesStartup100011431601322.8671905097.68486861202.333599919.937634322121Others100032171.328216473097.88566954202.749516719.97861812121Others100021161.110529603098.52216749204.067887920.108528332121Others100021211.344498419098.53187506204.087995120.1105096621215.1.2 Jetty
5.1.2.1 Simple Object
Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. BytesStartup30007056140.137050650291.516859456.082833355.22878197Others300010211.0589250310293.599530256.4835033855.6233485197Others300010210.9260343170294.348508656.6275939555.76524481975.1.2.2 Complex Object with Dynamic Data
Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. BytesStartup100011031397278.7961107098.13542689203.362671719.933758592122Others100032201.500210319098.48335631204.083673920.004431752122Others100032452.729377218098.29942003203.702509119.9670696921225.1.3 Undertow
5.1.3.1 Simple Object
Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. BytesStartup30006045131.61887020295.683027863.8144034656.01807363221Others300010221.2554478620292.740046863.1792483955.46051669221Others300010181.5594779750294.377391863.5326206955.770716812215.1.3.2 Complex Object with Dynamic Data
Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. BytesStartup10007031114197.1333241097.059109203.396936119.620442012145.893Startup1000423852132.6443576098.02960494205.632413520.007995542148Others100032191.293570253098.55129595206.630500420.018231992147Others100022271.659250132098.74592673207.038578820.057766372147Others100021171.260904041098.28975821206.082139519.9651071421475.2 Measure Memory
  To measure the memory of each embedded servlet container we looked at the memory usage on startup. JVisualVM is a tool provided with the Java Development Kit for visualizing the memory and footprint of java applications. We used this tool to show the initial startup impact of each of the three embedded servlet containers. The heap>https://examples.javacodegeeks.com/wp-content/uploads/2017/01/jvisualvmTomcat_watermarkScaled.jpg
  JVisualVM Report
5.2.2 Tomcat

  Heap>  Used: 124,260,976 B
  Max: 2,147,483,648 B
  Threads: 17 Live, 22 Started
5.2.3 Jetty

  Heap>  Used: 311,476,776 B
  Max: 2,147,483,648 B
  Threads: 19 Live, 22 Started
5.2.4 Undertow

  Heap>  Used: 114,599,536 B
  Max: 2,147,483,648 B
  Threads: 17 Live, 20 Started
6. Compare
6.1 Performance
  While all three of the embedded servlet containers had similar performance under the parameters used in this example, Undertow seems to have the best performance with Tomcat and Jetty close behind. The memory footprint of Jetty on startup was the largest using 311 MB. Tomcat and Undertow had similarly low initial footprints around 120 MB with Undertow coming in the lowest at 114 MB. The key difference in the response headers is that Undertow includes HTTP Persistent connections by default. This header will be used in clients that support persistent connections to optimize performance by reusing connection details.
6.1.1 Tomcat Response Headers
1Content-Type →application/json;2Date →Mon, 09 Jan 2017 02:23:26 GMT3Transfer-Encoding →chunked4X-Application-Context →JcgSpringBootContainers:# Application index.6.1.2 Jetty Response Headers
1Content-Type →application/json;charset=UTF-82Date →Mon, 09 Jan 2017 02:29:21 GMT3Transfer-Encoding →chunked4X-Application-Context →JcgSpringBootContainers:# Application index.6.1.3 Undertow Response Headers
1Connection →keep-alive2Content-Type →application/json;charset=UTF-83Date →Mon, 09 Jan 2017 02:20:25 GMT4Transfer-Encoding →chunked5X-Application-Context →JcgSpringBootContainers:# Application index.7. Conclusion
  The numbers indicate that Undertow is the best in performance and memory usage. It is encouraging to see that Undertow is embracing the latest capabilities and defaulting to persistent connections. The numbers do not indicate a dramatic difference in performance based on the load used in this example but I would imagine that they would scale and that if performance is the most important factor Undertow is the right match for your application. It is also reasonable to think that an organization may favor an embedded servlet container because of familiarity with it’s capabilities. Many times the defaults settings will have to change because of application requirements that include performance, memory usage and functionality.
8. Download the Source Code
  Here we compared three types of embedded servlet containers you can include in a Spring Boot Application.
Download  You can download the Eclipse project here: JcgSpringBootContainers

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-428224-1-1.html 上篇帖子: SpringBoot war包部署到Tomcat服务器 下篇帖子: tomcat自签证书相关配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表