将springboot项目升级到HTTP2

标签: 采坑日志  学习笔记  maven  tomcat  springboot  HTTP2  maven打包

背景介绍

最近想把一个项目升级到HTTP2,与升级HTTP2相关的各个组件的版本信息如下

  • springboot 2.1
  • tomcat 9.0
  • JDK 1.8
  • Ubuntu 18.04

准备工作

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

配置Tomcat所需的库

这里,我选择文档中的第三种方法,即安装libtcnative库以及相应的依赖。
找到Tomcat的官方文档,里面有说明如何安装libtcnative库。
文档中提到,在安装libtcnative之前,需要先安装一下依赖。

  • APR library
  • OpenSSL libraries
  • JDK

除了安装官方文档中提到的这三个依赖外,实际安装时还需要提前安装gcc和Tomcat。
这里我使用的是Ubuntu18.04,在该环境下,以上依赖的安装方式如下所示;

sudo apt update
sudo apt install build-essential #安装gcc及相关依赖,完成后可用gcc -version测试是否安装成功
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.tar.gz #下载tomcat9.0
tar -zxvf apache-tomcat-9.0.36.tar.gz #解压解包
apt-get install libapr1.0-dev libssl-dev  #安装官方文档中提到的依赖文件
wget https://downloads.apache.org/tomcat/tomcat-connectors/native/1.2.24/source/tomcat-native-1.2.24-src.tar.gz #下载tomcat native
tar -zxvf tomcat-native-1.2.24-src.tar.gz  #解压解包
cd tomcat-native-1.2.24-src/native  #进入到该目录下
#下面这个是官网给的例子,自己根据实际情况进行修改,如果复制过去运行出错的话,自己直接在终端里手动输入以下命令即可运行成功。
./configure --with-apr=/usr/bin/apr-1-config \    #apr的安装路径 
            --with-java-home=/home/jfclere/JAVA/jdk1.7.0_80/ \   #JDK的安装路径
            --with-ssl=yes \    #这个不用改
            --prefix=$CATALINA_HOME   #Tomcat的安装路径
make && make install   #构建安装

如果以上步骤全部运行成功的话,我们会在tomcat的lib目录下看到libtcnative-1.so这个文件,然后执行tomcat的启动脚本

./startup.sh

启动后,查看启动日志

cd logs   #进入tomcat文件夹的logs文件夹内
cat catalina.out    #查看该日志文件

如果有输出如下信息
在这里插入图片描述
证明依赖安装成功了。
如果没有出现此信息,那就把libtcnative-1.so文件所在路径加入到系统环境变量中,该变量生效后即可成功运行。
临时添加环境变量的方式,这种方式的环境变量仅在该终端下有效。

export PATH=$PATH:/home/ourhrms/apache-tomcat-9.0.36/lib

如果想设置永久的环境变量,可以把上面的语句添加到~/.bashrc(只对当前用户有效)或者profile文件(针对所有用户有效)。
然后我们就可以把项目打包部署到云主机上了。

项目打包部署

我的项目里有两个模块,每个模块里都有一个启动项,其中一个项目依赖于另一个项目。如果项目只有一个启动项,那么打包很容易。或者两个含有启动项的模块之间互相没有依赖关系,那样也很容易打包。
我在网上搜到一些方法,但是采用这些方法的话,都会报错,要不提示依赖缺失,要不提示主清单属性不存在。因此,我采用以下方法打包。
首先,假设模块A依赖模块B,即模块A中需要模块B中的某些类。在用maven打包时,先将模块B的pom文件中build的属性改为如下

<plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>org.hrms.HrserverApplication</mainClass>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>

除此之外,由于模块A在引入依赖时,会顺带引入模块B中的依赖,因此需要将模块B中A用不到的依赖给排除掉,否则也会报错。在修改(复制粘贴)pom文件后clean时提示pom文件出错的,有可能是由非法的空格,建议仔细检查自己修改的部分。
然后执行clean操作后,用父工程中的pom文件进行打包操作,这样生成的模块A的jar文件就可以征程运行了。获得了模块A的jar文件后,复制到其它地方,然后将模块B中pom文件build的属性给注释掉,然后clean再用父工程的pom文件打包,即可获取B模块的jar文件。这样就可以正常部署到云服务器上了。
部署完成之后,可以在HTTP2检测网站检测自己的网站是否成功支持HTTP2。如下图所示
在这里插入图片描述
以上就是升级的全过程,有问题的话欢迎留言。

参考资料

  1. Tomcat官方文档
  2. Springboot官方文档
  3. Linux环境变量设置
  4. Tomcat中如何配置APR
  5. springboot多模块打包报错,找不到xxx包,找不到xxx类
  6. SpringBoot+Maven多模块项目(创建、依赖、打包可执行jar包部署测试)完整流程
  7. maven中排除依赖传递 pom.xml的exclusions
版权声明:本文为luxinfeng666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luxinfeng666/article/details/107067260