HTTP1.1升级HTTP2.0
一,前言介绍
1.为什么要升级http2.0
HTTP2.0相比于HTTP1.x有以下几个优点:
-
二进制分帧:HTTP2.0将所有传输的信息分割为更小的消息和帧,并采用二进制格式对它们进行编码,这样可以更好地对数据进行压缩和解压缩,提高传输效率。
-
多路复用:HTTP2.0可以在一个连接上同时传输多个请求和响应,而HTTP1.x需要多个连接才能实现并发传输,这样可以减少TCP连接的数量,提高性能。
-
首部压缩:HTTP2.0使用HPACK算法对首部进行压缩,减少了首部的大小,提高了传输效率。
-
服务器推送: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; }