技术分享
🗒️将springboot项目升级到HTTP2
00 分钟
2020-7-1
2024-6-29
type
status
date
summary
slug
tags
category
password
URL
icon

背景介绍

最近想把一个项目升级到HTTP2,与升级HTTP2相关的各个组件的版本信息如下
  • springboot 2.1
  • tomcat 9.0
  • JDK 1.8
  • Ubuntu 18.04

准备工作

首先,查阅springboot官网上的文档,看如何升级到HTTP2,
notion image
文档中提到,springboot项目要支持HTTP2,将配置文件中的server.http2.enabled设置为true就可以了,但是要看具体的版本。除此之外,springboot中的HTTP2是要基于SSL协议的,也就是需要基于HTTPS进行升级,而不能直接从HTTP进行升级。接下来,我们看具体的情况。
notion image
文档中提到,如果我们项目中使用的http服务器是Undertow,且版本高于1.4.0,那么在JDK1.8环境下无需其它操作,直接修改上面的配置文件就可以。
notion image
使用Jetty的话,如果版本是9.4.8加入上述依赖后即可支持HTTP2。
notion image
文档中提到,Tomcat9.0是支持HTTP2的,但是需要JDK的版本是1.9,项目中使用的是JDK1.8,需要安装libtcnative库以及相应的依赖。否则的话只能使用基于SSL的HTTP1.1。 不管使用哪种方式,都需要基于SSL协议,因此,我们需要去为项目申请证书。 这里,我使用
来申请免费的证书。申请证书前,需要先准备好自己的域名和一个邮箱,在为域名申请证书的时候需要邮箱的账号。申请的过程中,FreeSSL需要你下载一个KeyManager软件,申请好的证书会存放到这个软件中。 打开软件后,选择你申请的那个证书,进行导出。导出界面如下所示
notion image
我选择导出为jks格式的,私钥加密密码需要设置一下并记住,因为一会儿会用到。 导出后,将jks文件复制到项目中的resources文件夹内。添加如下配置语句
notion image
key-store-password是密钥库的密码,key-password是密钥库内该证书的加密密码,这两个密码在这种情况下都是一样的,是在导出jks文件是自己设置的密码。 目前位置,准备工作就做好了,现在开始设置web服务器来支持HTTP2

配置Tomcat所需的库

这里,我选择文档中的第三种方法,即安装libtcnative库以及相应的依赖。 找到Tomcat的官方文档,里面有说明如何安装libtcnative库。 文档中提到,在安装libtcnative之前,需要先安装一下依赖。
  • APR library
  • OpenSSL libraries
  • JDK
除了安装官方文档中提到的这三个依赖外,实际安装时还需要提前安装gcc和Tomcat。 这里我使用的是Ubuntu18.04,在该环境下,以上依赖的安装方式如下所示;
如果以上步骤全部运行成功的话,我们会在tomcat的lib目录下看到libtcnative-1.so这个文件,然后执行tomcat的启动脚本
启动后,查看启动日志
如果有输出如下信息
notion image
证明依赖安装成功了。 如果没有出现此信息,那就把libtcnative-1.so文件所在路径加入到系统环境变量中,该变量生效后即可成功运行。 临时添加环境变量的方式,这种方式的环境变量仅在该终端下有效。
如果想设置永久的环境变量,可以把上面的语句添加到~/.bashrc(只对当前用户有效)或者profile文件(针对所有用户有效)。 然后我们就可以把项目打包部署到云主机上了。

项目打包部署

我的项目里有两个模块,每个模块里都有一个启动项,其中一个项目依赖于另一个项目。如果项目只有一个启动项,那么打包很容易。或者两个含有启动项的模块之间互相没有依赖关系,那样也很容易打包。 我在网上搜到一些方法,但是采用这些方法的话,都会报错,要不提示依赖缺失,要不提示主清单属性不存在。因此,我采用以下方法打包。 首先,假设模块A依赖模块B,即模块A中需要模块B中的某些类。在用maven打包时,先将模块B的pom文件中build的属性改为如下
除此之外,由于模块A在引入依赖时,会顺带引入模块B中的依赖,因此需要将模块B中A用不到的依赖给排除掉,否则也会报错。
在修改(复制粘贴)pom文件后clean时提示pom文件出错的,有可能是由非法的空格,建议仔细检查自己修改的部分。
然后执行clean操作后,用父工程中的pom文件进行打包操作,这样生成的模块A的jar文件就可以征程运行了。获得了模块A的jar文件后,复制到其它地方,然后将模块B中pom文件build的<skip>属性给注释掉,然后clean再用父工程的pom文件打包,即可获取B模块的jar文件。这样就可以正常部署到云服务器上了。 部署完成之后,可以在
网站检测自己的网站是否成功支持HTTP2。如下图所示
notion image
以上就是升级的全过程,有问题的话欢迎留言。

参考资料

  1. Tomcat官方文档
  1. Springboot官方文档
  1. Linux环境变量设置
  1. Tomcat中如何配置APR
  1. springboot多模块打包报错,找不到xxx包,找不到xxx类
  1. SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程
  1. maven中排除依赖传递 pom.xml的exclusions
 
 
上一篇
Generic Array Creation,泛型数组创建时提示出错
下一篇
SKNet解读