HTTP2.0特性
通俗易懂篇:https://www.cnblogs.com/yingsmirk/p/5248506.html
深入了解篇:https://www.jianshu.com/p/67c541a421f9
HTTP/2连接是建立在TCP连接之上的应用层协议,客户端是TCP连接的发起者。

HTTP/2使用和HTTP/1.1一样的 URI schemes:"http" 和 "https",并且还是共享同样的默认端口:http的80,https的443。这意味着,对于"http" 和 "https"确定其是否支持HTTP/2协议的方式是不同的。

在官方文档中,为HTTP/2协议定义了两个版本:h2 和 h2c:

h2版本的协议是建立在TLS层之上的HTTP/2协议,这个标志被用在TLS应用层协议协商(TLS-ALPN)域和任何其它的TLS之上的HTTP/2协议。
h2c版本是建立在明文的TCP之上的HTTP/2协议,这个标志被用在HTTP/1.1的升级协议头域和其它任何直接在TCP层之上的HTTP/2协议。
搭建带有证书的h服务端:https://
要使用HTTP/2需要注意以下几点

1.虽然HTTP/2没有明确要求必须使用TLS,但当前几乎所有浏览器均只支持 HTTP/2 Over TLS。所以在使用之前我们需要先制作一张证书。

2.如果您的项目中用的是tomcat或jetty,它们并不能直接支持HTTP/2,但是undertow可以。具体可以参考Spring Boot的文档:https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#howto-configure-http2

3.我们制作的证书是不被浏览器认可的,所以会有安全提示,不能用于生产环境。

在本文的例子中使用的是undertow。

1.制作证书:

使用JDK自带的keytool,证书类型为:PKCS12

打开cmd 输入下面的命令:

keytool -genkey -alias undertow -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -dname "CN=localhost, OU=localhost, O=localhost, L=hangzhou, ST=zhejiang, C=CN"

输入密钥库口令:

再次输入新口令:

执行时会要求输入证书口令,这里输入的是123456。执行完命令后会在执行的文件夹生成一个keystore.p12的文件。

keytool

-genkey

-alias undertow (别名)

-storetype PKCS12 (证书类型)

-keyalg RSA (算法)

-keysize 2048 (秘钥长度)

-keystore keystore.p12 (指定生成证书的位置和证书名称)

-dname "

CN=localhost,(姓名姓氏)

OU=localhost,(组织单位)

O=localhost,(组织名称)

L=hangzhou,(所在城市或者区域名称)

ST=zhejiang,(所在的省/市/自治区名称)

C=CN"(该单位的双字母国家/地区代码)

keytool的详细用法:

https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html

常见的证书格式及其说明参考:

http://www.cnblogs.com/xq1314/archive/2017/12/05/7987216.html

配置Web容器
spring boot默认使用的是tomcat,我们需要先将tomcat移除,然后换成undertow。

在搭建好的springboot项目中引入  注意springboot在2.0版本才开始支持http2,springboot2.0 支持的jdk最低版本为java8

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-web</artifactId>

<exclusions>

<exclusion>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-tomcat</artifactId>

</exclusion>

</exclusions>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-undertow</artifactId>

</dependency>

如果不移除tomcat依赖会一直以Tomcat作为容器启动。

然后将刚才生成的keystore.p12拷贝到src/main/resources下。

然后在application.properties中配置服务器信息。

#端口号
server.port=8443
#ip地址
server.address=0.0.0.0

#启用HTTP响应压缩
server.compression.enabled=true
# 启用http2
server.http2.enabled=true
# 启用ssl
server.ssl.enabled=true
#证书位置
server.ssl.key-store=classpath:keystore.p12
# 证书密码
server.ssl.key-store-password=123456
# 证书类型
server.ssl.key-store-type= PKCS12
# 协议类型
server.ssl.protocol=TLSv1.2
server.ssl.key-alias=undertow
这时如果启动服务器,是只支持https的。

@SpringBootApplication
public class DemoApplication implements WebServerFactoryCustomizer<UndertowServletWebServerFactory>{

   public static void main(String[] args) {
      SpringApplication.run(DemoApplication.class, args);
   }

   @Override
   public void customize(UndertowServletWebServerFactory undertowServletWebServerFactory) {
      undertowServletWebServerFactory.addBuilderCustomizers(new UndertowBuilderCustomizer() {
         @Override
         public void customize(Undertow.Builder builder) {
            builder.addHttpListener(8080, "0.0.0.0");
         }

      });
   }
}
这里增加8080端口的监听,配置参考:

https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#howto-configure-webserver

https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#howto-enable-multiple-listeners-in-undertow

启动后可以看到控制台打印出如下信息:

测试
增加一个测试控制器

浏览器访问:https://192.168.110.117:8443/someData

观察两次请求的size,一次是92一次是70,这是因为HTTP/2的头部压缩技术。

浏览器访问:http://localhost:8080/someData   HTTP/1.1协议 而且数据包要比HTTP/2的数据包大,并且无论刷新多少次,大小是不变的。

搭建h2c服务端:http://

从Spring boot 2.0的官方文档上看,明确写明了“Spring boot 不支持h2c —— HTTP/2协议的明文版本”,于是就想其它办法来支持h2c。

首先,想的是通过外置的tomcat配置来支持h2c,因为tomcat8.5中的server.xml配置中,有HTTP/2协议相关的配置:

这里显示要添加证书,明显支持的是基于TLS层之上的h2版本的HTTP/2协议,但是从配置上可以禁用SSL,于是就尝试了一下,果然成功了。配置成如下示例,就支持h2c了:

<Connector port="5080" protocol="HTTP/1.1" connectionTimeout="20000">

<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /></Connector>

tomcat容器自身是支持多个connector的配置的,查看springboot2.0是否支持同时配置多个Connector

文档中示例是通过 java configure 的方式配置一个https的connector,在application.properties中不支持配置多个connector。

因此模仿这外置tomcat配置h2c的方式,在Spring boot 2.0 的内置tomcat中通过java configure的方式配置h2c协议,具体代码如下:

新建一个springboot项目,加入以下配置即可

/

**
 * h2c协议
 * @return
 */
@Bean
public ServletWebServerFactory servletContainer() {
   TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
   tomcat.addAdditionalTomcatConnectors(createH2cConnector());
   return tomcat;
}

private Connector createH2cConnector() {
   Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
   Http2Protocol upgradeProtocol = new Http2Protocol();
   connector.addUpgradeProtocol(upgradeProtocol);
   //connector.setScheme("http");
   connector.setPort(5080);

   return connector;
}
这时启动我们的Spring boot应用,会发现最后的启动日志有两个端口

因为浏览器只支持h2 所以使用curl 验证h2c的服务端 或者用wireshark抓包查看

检查你的curl是否支持http2

从上面的 Features 信息发现,我的curl工具是支持HTTP/2协议的。

下面开始验证我Spring boot 的服务在5080端口是否是h2c,具体如下:

输入curl -v  --http2 "http://192.168.110.117:5080/someData"

从结果看 已经验证通过。

springboot搭建http2服务器和h2c服务器 h2 的http/https 请求服务器的更多相关文章

  1. 搭建https本地服务器:如何得到被所有客户端认可的ssl证书

    https,作为http的加密版,作用还是很大的:能够提升网站搜索权重,让你的网站更安全,而且如果你的网站没有使用https的话,将无法作为移动设备原生应用的api接口.可见掌握为网站启用https的 ...

  2. 10分钟搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟程序猿无疑心中会激动一番(或许这是判断是否是一个标准阿猿的标准吧)! 首先自己从宏观把控一下,通过上网科普自 ...

  3. Node.js 搭建 https 协议 服务器

    var https = require('https'); //创建服务器 https var fs = require('fs'); //文件系统的模块 const hostname = '127. ...

  4. 搭建服务器集群——Windows7系统中nginx与IIS服务器搭建集群实现负载均衡

    转载:https://www.cnblogs.com/xiongze520/p/10308720.html 分布式,集群,云计算机.大数据.负载均衡.高并发······当耳边响起这些词时,做为一个菜鸟 ...

  5. 基于SpringBoot搭建应用开发框架(二) —— 登录认证

    零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...

  6. springBoot 搭建web项目(前后端分离,附项目源代码地址)

    springBoot 搭建web项目(前后端分离,附项目源代码地址)   概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端 ...

  7. SpringBoot 搭建简单聊天室

    SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...

  8. springboot搭建一个简单的websocket的实时推送应用

    说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...

  9. Mui.ajax请求服务器正确返回json数据格式

    ajax: mui.ajax('http://server-name/login.php',{ data:{ username:'username', password:'password' }, d ...

  10. python——请求服务器(http请求和https请求)

    一.http请求 1.http请求方式:get和post get一般用于获取/查询资源信息,在浏览器中直接输入url+请求参数点击enter之后连接成功服务器就能获取到的内容,post请求一般用于更新 ...

随机推荐

  1. html5新标签 画布 canvas 替代了 flash

    绘制矩形边框,和填充不同的是绘制使用的是strokeRect, 和strokeStyle实现的 绘制路径 绘制路径的作用是为了设置一个不规则的多边形状态 路径都是闭合的,使用路径进行绘制的时候需要既定 ...

  2. [Vue warn]: Error in v-on handler (Promise/async): "TypeError: Object(...) is not a function"

    引用外部发文件时候,只是部分引用,所以原本是解构方式引用的,我忘记加{ }了

  3. excel导出功能的实现流程说⼀下?

    导出的话,我们因为到处的数据量不⼤,所以直接采取的时候前端主导的⽅案,参考的现成⽅案实现的 导出 ⼤概得流程就是 1. 调⽤后端接⼝得到要导出的数据 2. 把数据简单处理⼀下转化成导出插件需要的格式 ...

  4. 14 Positional Encoding (为什么 Self-Attention 需要位置编码)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  5. 08 ELMo模型(双向LSTM模型解决词向量多义问题)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  6. jmeter使用beanshell完成签名计算,附与python代码对比

    签名计算过程: 1.ticket计算:时间戳加+随机数字拼接后md5加密 2.组装公共参数+ticket+时间戳+业务参数 beanshell代码实现: import java.util.*;impo ...

  7. "开源"是什么?为啥这么火?一定免费吗?

    ​ 在科技快速发展的今天,"开源"一词频频出现在我们的视野中.究竟什么是开源?为何它能在技术圈引发如此热潮? 开源软件到底有什么魅力?它是如何改变软件开发和使用的方式的?开源软件是 ...

  8. Java 线程池获取池中所有线程列表的方法

    在Java中,获取线程池中所有线程列表并不是一个直接支持的功能,因为线程池的设计通常是为了隐藏和管理底层的线程细节,从而提供更高层次的抽象和并发控制能力.然而,通过一些反射和技巧,我们仍然可以获取到线 ...

  9. 01 Eclipse使用Maven慢的问题解决

    1. Eclipse 使用的是内置的 Maven Eclipse 有可能使用了内置的 Maven,而不是独立安装的 Maven.如果使用 Eclipse 内置的 Maven,默认的 settings. ...

  10. DRF请求的生命周期

    作为一个工作3年左右的码农,在各种框架的摸爬滚打中,我也接触了不少前端后端的技术栈,其中DRF算是我后端日常工作中的用得最多的框架.今天就简单聊聊DRF请求的生命周期.由于篇幅原因,我在此篇文章中只是 ...