ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议 [打印本页]

作者: 冬雨财经    时间: 10 小时前
标题: Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议
目录
一、常用Web服务器
1、Tomcat
2、Jetty
3、Undertow
二、什么是HTTP/2协议
1、定义
2、特性
3、优点
4、与HTTP/1.1的区别
三、集成Web服务器并开启HTTP/2协议
1、生成证书
2、新建springboot项目
3、集成Web服务器
3.1 集成Tomcat
3.2 集成Jetty
3.3 集成Undertow


一、常用Web服务器

在Spring Boot应用中,选择合适的Web服务器是至关重要的。常见的Web服务器有Jetty、Tomcat和Undertow。它们各自具有差别的特点和优势,下面将进行详细的比较。
1、Tomcat

Tomcat是Apache基金会下的一个开源项目,是一个实现了Java Servlet和JavaServer Pages (JSP)技能的Web服务器。它支持最新的Java EE标准,并提供了丰富的特性,如会话管理、安全性和集群部署等。Tomcat在大型企业级应用中广泛利用。
2、Jetty

Jetty是一个轻量级的Java Web服务器,具有高效的事件处理机制和多线程模型。它支持多种协议,如HTTP/2、WebSocket和HTTP/1.1。Jetty的启动速度快,适用于小型到中型应用。
3、Undertow

Undertow是WildFly应用服务器中的嵌入式Web服务器,后来被独立出来成为了一个单独的项目。它是一个高性能的异步事件驱动的Web服务器,支持HTTP/2、WebSocket和Java Servlet 4.0。Undertow具有低延迟、高吞吐量和优秀的扩展性。对于大多数Spring Boot应用来说,Undertow是一个很好的选择。
总结:

二、什么是HTTP/2协议

HTTP/2是HTTP协议的第二个主要版本,于2015年发布,用于在Web服务器和客户端之间传输数据。以下是关于HTTP/2的详细介绍:
1、定义

HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或h2c(非加密连接)。它是HTTP协议自1999年HTTP 1.1的改进版RFC发布后的首个更新,主要基于SPDY协议。多数主流浏览器已经在2015年底支持了该协议。
2、特性

3、优点

4、与HTTP/1.1的区别

总的来说,HTTP/2在性能、安全性和可用性方面都有显著的改进,可以使Web应用更加速速、高效和可靠。
三、集成Web服务器并开启HTTP/2协议

1、生成证书

虽然HTTP/2理论上可以在非加密连接上利用,但实际上全部主流浏览器都要求HTTP/2必须基于TLS(HTTPS)。这意味着HTTP/2险些总是与SSL/TLS一起利用。
keytool 是 Java Development Kit (JDK) 的一部分,用于管理密钥和证书。以下是一些常见的 keytool 命令示例,用于生成证书:
   keytool -genkeypair -alias wisely -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 -storepass pass1234 -keypass pass1234
  
  1. >keytool -genkeypair -alias wisely -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 -storepass pass1234 -keypass pass1234
  2. 您的名字与姓氏是什么?
  3.   [Unknown]:  budong
  4. 您的组织单位名称是什么?
  5.   [Unknown]:  budong   
  6. 您的组织名称是什么?
  7.   [Unknown]:  budong
  8. 您所在的城市或区域名称是什么?
  9.   [Unknown]:  hangzhou      
  10. 您所在的省/市/自治区名称是什么?
  11.   [Unknown]:  zhejiang         
  12. 该单位的双字母国家/地区代码是什么?
  13.   [Unknown]:  CN
  14. CN=budong, OU=budong, O=budong, L=hangzhou, ST=zhejiang, C=CN是否正确?
  15.   [否]:  y
  16. 正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 365 天):
  17.          CN=budong, OU=budong, O=budong, L=hangzhou, ST=zhejiang, C=CN
复制代码
2、新建springboot项目

新建springboot项目,把生成的mykeystore.jks文件文件放在resources目录下。部分代码如下:
  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. @SpringBootApplication
  4. public class Application {
  5.     public static void main(String[] args) {
  6.         SpringApplication.run(Application.class, args);
  7.     }
  8. }
复制代码
  1. import org.springframework.web.bind.annotation.RequestMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. @RequestMapping("/test")
  5. public class TestController {
  6.     @RequestMapping("/hello")
  7.     public String hello() {
  8.         return "Hello Tomcat!";
  9.     }
  10. }
复制代码
3、集成Web服务器

3.1 集成Tomcat

(1)设置pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>org.example</groupId>
  7.     <artifactId>webserver</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <parent>
  10.         <groupId>org.springframework.boot</groupId>
  11.         <artifactId>spring-boot-starter-parent</artifactId>
  12.         <version>2.3.5.RELEASE</version>
  13.         <relativePath/> <!-- lookup parent from repository -->
  14.     </parent>
  15.     <properties>
  16.         <maven.compiler.source>8</maven.compiler.source>
  17.         <maven.compiler.target>8</maven.compiler.target>
  18.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19.     </properties>
  20.     <dependencies>
  21.         <dependency>
  22.             <groupId>org.springframework.boot</groupId>
  23.             <artifactId>spring-boot-starter-web</artifactId>
  24.         </dependency>
  25.     </dependencies>
  26. </project>
复制代码
(2)设置application.yml
  1. server:
  2.   port: 8443
  3.   servlet:
  4.     context-path: /server1
  5.   ssl:
  6.     key-store: classpath:keystore.jks
  7.     key-store-password: pass1234
  8.     key-store-type: JKS
  9.     key-alias: wisely
  10.     key-password: pass1234
  11.   http2:
  12.     enabled: true
复制代码
(3)启动服务
服务启动后,在浏览器输入:https://127.0.0.1:8443/server1/test/hello
可以看到hello请求协议类型是h2,即HTTP/2。

如果利用Google浏览器,Network默认不表现Protocol,在表头这一行右键,选择需要表现的列。

3.2 集成Jetty

(1)设置pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>org.example</groupId>
  7.     <artifactId>webserver2</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <parent>
  10.         <groupId>org.springframework.boot</groupId>
  11.         <artifactId>spring-boot-starter-parent</artifactId>
  12.         <version>2.3.5.RELEASE</version>
  13.         <relativePath/> <!-- lookup parent from repository -->
  14.     </parent>
  15.     <properties>
  16.         <maven.compiler.source>8</maven.compiler.source>
  17.         <maven.compiler.target>8</maven.compiler.target>
  18.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19.     </properties>
  20.     <dependencies>
  21.         <dependency>
  22.             <groupId>org.springframework.boot</groupId>
  23.             <artifactId>spring-boot-starter-web</artifactId>
  24.             <exclusions>
  25.                 <exclusion>
  26.                     <groupId>org.springframework.boot</groupId>
  27.                     <artifactId>spring-boot-starter-tomcat</artifactId>
  28.                 </exclusion>
  29.             </exclusions>
  30.         </dependency>
  31.         <!-- Jetty Starter -->
  32.         <dependency>
  33.             <groupId>org.springframework.boot</groupId>
  34.             <artifactId>spring-boot-starter-jetty</artifactId>
  35.         </dependency>
  36.         <!-- HTTP/2 相关依赖 -->
  37.         <dependency>
  38.             <groupId>org.eclipse.jetty.http2</groupId>
  39.             <artifactId>http2-server</artifactId>
  40.         </dependency>
  41.         <!--<dependency>
  42.             <groupId>org.eclipse.jetty</groupId>
  43.             <artifactId>jetty-alpn-server</artifactId>
  44.         </dependency>-->
  45.         <dependency>
  46.             <groupId>org.eclipse.jetty</groupId>
  47.             <artifactId>jetty-alpn-java-server</artifactId>
  48.         </dependency>
  49.         <!-- 可选依赖,根据需求添加 -->
  50.         <!-- <dependency>
  51.             <groupId>org.eclipse.jetty.http2</groupId>
  52.             <artifactId>http2-client</artifactId>
  53.         </dependency>
  54.         <dependency>
  55.             <groupId>org.eclipse.jetty</groupId>
  56.             <artifactId>jetty-alpn-client</artifactId>
  57.         </dependency> -->
  58.     </dependencies>
  59. </project>
复制代码
(2)设置application.yml
  1. server:
  2.   port: 8443
  3.   servlet:
  4.     context-path: /server2
  5.   ssl:
  6.     key-store: classpath:keystore.jks
  7.     key-store-password: pass1234
  8.     key-store-type: JKS
  9.     key-alias: wisely
  10.     key-password: pass1234
  11.   http2:
  12.     enabled: true
  13.   jetty:
  14.     threads:
  15.       acceptors: 4
  16.       selectors: 8
复制代码
(3)启动服务
服务启动后,查看日志输出,打印出(ssl, alpn, h2, http/1.1),则表现h2启用成功。

在浏览器输入:https://127.0.0.1:8443/server2/test/hello
可以看到hello请求协议类型是h2,即HTTP/2。

(4)高级设置
除了可以在设置文件中设置Jetty参数外,还可以在设置类中通过编程方式进行设置。例如,你可以设置Jetty的线程池大小、SSL设置等。
  1. import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
  2. import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
  3. import org.eclipse.jetty.server.*;
  4. import org.eclipse.jetty.util.ssl.SslContextFactory;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.autoconfigure.web.ServerProperties;
  7. import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
  8. import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. @Configuration
  12. public class JettyConfig {
  13.     @Bean
  14.     @Autowired
  15.     public ConfigurableServletWebServerFactory configurableServletWebServerFactory(ServerProperties serverProperties) {
  16.         JettyServletWebServerFactory factory = new JettyServletWebServerFactory();
  17.         factory.addServerCustomizers(server -> {
  18.             if (serverProperties.getSsl() != null && serverProperties.getSsl().isEnabled()) {
  19.                 ServerConnector connector = (ServerConnector) server.getConnectors()[0];
  20.                 int port = connector.getPort();
  21.                 SslContextFactory sslContextFactory = connector.getConnectionFactory(SslConnectionFactory.class).getSslContextFactory();
  22.                 HttpConfiguration httpConfiguration = connector.getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration();
  23.                 // 配置SSL上下文工厂和HTTP/2连接工厂
  24.                 ConnectionFactory[] connectionFactories = new ConnectionFactory[]{
  25.                         new SslConnectionFactory(sslContextFactory, "alpn"),
  26.                         new ALPNServerConnectionFactory("h2", "h2-17", "h2-16", "h2-15", "h2-14"),
  27.                         new HTTP2ServerConnectionFactory(httpConfiguration)
  28.                 };
  29.                 // 创建新的ServerConnector并设置到服务器上
  30.                 ServerConnector serverConnector = new ServerConnector(server, connectionFactories);
  31.                 serverConnector.setPort(port);
  32.                 server.setConnectors(new Connector[]{serverConnector});
  33.             }
  34.         });
  35.         return factory;
  36.     }
  37. }
复制代码
把设置文件中的server.http2.enable=true开关注释掉,并重启服务。可见h2协议也开启了。

3.3 集成Undertow

(1)设置pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>org.example</groupId>
  7.     <artifactId>webserver3</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <parent>
  10.         <groupId>org.springframework.boot</groupId>
  11.         <artifactId>spring-boot-starter-parent</artifactId>
  12.         <version>2.3.5.RELEASE</version>
  13.         <relativePath/> <!-- lookup parent from repository -->
  14.     </parent>
  15.     <properties>
  16.         <maven.compiler.source>8</maven.compiler.source>
  17.         <maven.compiler.target>8</maven.compiler.target>
  18.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  19.     </properties>
  20.     <dependencies>
  21.         <dependency>
  22.             <groupId>org.springframework.boot</groupId>
  23.             <artifactId>spring-boot-starter-web</artifactId>
  24.             <exclusions>
  25.                 <exclusion>
  26.                     <groupId>org.springframework.boot</groupId>
  27.                     <artifactId>spring-boot-starter-tomcat</artifactId>
  28.                 </exclusion>
  29.             </exclusions>
  30.         </dependency>
  31.         <!-- Undertow服务器 -->
  32.         <dependency>
  33.             <groupId>org.springframework.boot</groupId>
  34.             <artifactId>spring-boot-starter-undertow</artifactId>
  35.         </dependency>
  36.     </dependencies>
  37. </project>
复制代码
(2)设置application.yml
  1. server:
  2.   port: 8443
  3.   servlet:
  4.     context-path: /server3
  5.   ssl:
  6.     key-store: classpath:keystore.jks
  7.     key-store-password: pass1234
  8.     key-store-type: JKS
  9.     key-alias: wisely
  10.     key-password: pass1234
  11.   http2:
  12.     enabled: true
复制代码
(3)启动服务
服务启动后,在浏览器输入:https://127.0.0.1:8443/server3/test/hello
可以看到hello请求协议类型是h2,即HTTP/2。

  把设置文件中的server.http2.enable=true开关注释掉,并重启服务,请求接口看到协议类型是http/1.1


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4