HTTP1.1升级HTTP2.0

HTTP1.1升级HTTP2.0

一,前言介绍
1.为什么要升级http2.0

HTTP2.0相比于HTTP1.x有以下几个优点:

  1. 二进制分帧:HTTP2.0将所有传输的信息分割为更小的消息和帧,并采用二进制格式对它们进行编码,这样可以更好地对数据进行压缩和解压缩,提高传输效率。

  2. 多路复用:HTTP2.0可以在一个连接上同时传输多个请求和响应,而HTTP1.x需要多个连接才能实现并发传输,这样可以减少TCP连接的数量,提高性能。

  3. 首部压缩:HTTP2.0使用HPACK算法对首部进行压缩,减少了首部的大小,提高了传输效率。

  4. 服务器推送:HTTP2.0支持服务器主动向客户端推送资源,减少了客户端的请求次数,提高了性能。

因此,升级到HTTP2.0可以提高网站的性能和用户体验,减少页面加载时间,提高响应速度。

2.安全性能对比

HTTP/2.0 相比 HTTP/1.1 在安全性和性能方面都有很大的改进。在安全性方面,HTTP/2.0 强制使用加密传输,即使是非敏感数据也会被加密,这样可以防止中间人攻击和窃听。在性能方面,HTTP/2.0 引入了多路复用技术,可以在同一个连接上同时传输多个请求和响应,避免了 HTTP/1.1 中的队头阻塞问题,从而提高了页面加载速度。此外,HTTP/2.0 还使用了头部压缩技术,减少了传输的数据量,进一步提高了性能。

下面是一个演示 HTTP/1.1 和 HTTP/2.0 性能对比的例子:

假设有一个网站,其中包含 10 个小图片和 1 个大图片,总共大小为 1MB。我们使用 Chrome 浏览器的开发者工具来模拟加载这个网站,并记录加载时间。

在 HTTP/1.1 中,浏览器会建立 6 个连接来加载这些资源,其中 1 个连接用于加载 HTML,另外 5 个连接用于加载图片。由于 HTTP/1.1 中的队头阻塞问题,每个连接只能同时传输一个请求和响应,因此加载时间较长。

在 HTTP/2.0 中,浏览器只需要建立一个连接来加载所有资源,使用多路复用技术可以同时传输多个请求和响应,因此加载时间更短。

根据测试结果,使用 HTTP/2.0 加载这个网站的时间比使用 HTTP/1.1 加载快了 40% 左右

3.版本要求

HTTP/2.0 是一种网络协议,它的实现与 JDK 版本和 Tomcat 版本有关。下面是一些常见的要求:

对于 JDK 版本:

  • JDK 9 及更高版本支持 HTTP/2.0 协议。

  • JDK 8 不直接支持 HTTP/2.0,但可以通过使用第三方库(如 Jetty 或 Netty)来实现支持。

对于 Tomcat 版本:

  • Tomcat 9.x 支持 HTTP/2.0。

  • Tomcat 8.x 不直接支持 HTTP/2.0,但可以通过使用适当的配置和插件来实现支持。

二,实践
1.命令

这个命令在resources下执行

keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks -validity 365 -keysize 2048

会生成这个文件放入到resources资源目录下

2.yml

yml文件配置编写

3.配置类

此配置类是用来解决升级之后带来的免更改代码

/**
 * http强制跳转https
 */
@Configuration
public class HttpProtocolConversionConfig {
​
​
    @Value("${server.port}")
    private Integer httpsPort;
    @Bean
    public ServletWebServerFactory servletContainer() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
            @Override
            protected void postProcessContext(Context context) {
                // 如果要强制使用https,请松开以下注释
                // SecurityConstraint constraint = new SecurityConstraint();
                // constraint.setUserConstraint("CONFIDENTIAL");
                // SecurityCollection collection = new SecurityCollection();
                // collection.addPattern("/*");
                // constraint.addCollection(collection);
                // context.addConstraint(constraint);
            }
        };
        tomcat.addAdditionalTomcatConnectors(createStandardConnector()); // 添加http
        return tomcat;
    }
​
    // 配置http
    private Connector createStandardConnector() {
        // 默认协议为org.apache.coyote.http11.Http11NioProtocol
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setSecure(false);
        connector.setScheme("http");
        // 这个我就不用解释了
        connector.setPort(80);
        connector.setRedirectPort(httpsPort); // 当http重定向到https时的https端口号
        return connector;
    }

猜你喜欢

转载自blog.csdn.net/qq_49841284/article/details/134502282