转 Spring Boot With Http2 
原文链接 http://www.jianshu.com/p/3d7ac535d6a0

拓展链接 http://www.jianshu.com/p/9710585258fb

 
作者 whthomas 关注
2017.02.07 22:56* 字数 661 阅读 378评论 0喜欢 6

HTTP/2是第二代的HTTP协议,大家可以通过https://http2.akamai.com/demo来感受下Http2的提速。

Spring Boot的web容器选择中已经有UndertowJetty两个容器可以支持HTTP/2了,这个例子中我选择了Undertow作为Spring Boot的web容器。

制作一份证书

虽然Http2没有强制要求使用TLS,但当前几乎所有浏览器均只支持 HTTP/2 Over TLS。这样做一方面更安全,另一方面利用 TLS的加密机制可以更好地穿透网络中间节点。所以在我们模拟一个Http2服务之前,我们需要产生一份本地的Https证书为后面的试验做准备。

Java自带了一个密钥管理工具--keytool,利用这个工具,我们可以产生一份自签名的证书。

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"

执行这条命令之后,在执行命令的目录下会产生一个keystore.p12PKCS12证书,很快我们就会在Spring Boot中使用到这份证书。

不能落下的ALPN

ALPN是Application Layer Protocol Negotiation的缩写,是 HTTP/2 的一种协议协商机制:

  1. 客户端发起请求,只有请求报头,期望与服务端建立连接。
  2. 服务端如果支持HTTP/2,会返回一个Upgrade请求,与客户端协商是否切换到HTTP/2。
  3. 当双方都支持HTTP/2的情况下,HTTP协议会使用HTTP/2,而当出现问题时,则使用HTTP/1.1。

为了让JVM支持这种机制,需要引入Jettyalpn_boot,并在项目启动的过程前使用命令:

java -Xbootclasspath/p:<path_to_alpn_boot_jar> ...

对于不同版本的JDK,也需要采用不同版本的alpn_boot,详情可以参见:http://www.eclipse.org/jetty/documentation/9.4.x/alpn-chapter.html#alpn-versions

启动一个Http2服务

Http2的这个例子是基于之前undertow的Demo做的,在配置类中务必添加这个配置,来启用undertow中的Http2功能:

@Bean UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() {     UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory();     factory.addBuilderCustomizers(builder -> builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true));     return factory; }

application.properties中添加Https的相关配置:

server.port=8443 server.ssl.key-store={path}/keystore.p12 server.ssl.key-store-password=password server.ssl.keyStoreType=PKCS12 server.ssl.keyAlias=undertow server.ssl.protocol=TLSv1.2

我们编写一个可以被访问的Controller:

@RestController @RequestMapping("/test") public class HiController {      @RequestMapping("/hello")     public String hello() {         return "world";     }  }

启动Application类时,VM的参数中需要记得加入alpn_boot的配置。

此时打开Chrome,访问https://localhost:8443/test/hello

通过Chrome访问Http2服务

由于我们产生的证书是自签名的证书,并不会被浏览器认可,所以会被标记成不安全,但是并不影响我们对的TLS使用,通过chrome的插件可以看到网站已经采用了HTTP/2。

最新文章

  1. winfrom 捕获是否点击关闭按钮关闭的窗体
  2. 第三十六章 metrics(4)- metrics-graphite
  3. Bulk Insert的用法 .
  4. 中石油-高精度除法-java版
  5. Android Studio 常用快捷键以及设置
  6. 《MFC游戏开发》笔记二 建立工程、调整窗口
  7. N - 畅通工程再续 - hdu 1875
  8. (NO.00002)iOS游戏精灵战争雏形(二)
  9. 【HDFS API编程】删除文件
  10. 14-03 java BigInteger类,BigDecimal类,Date类,DateFormat类,Calendar类
  11. 大数据-08-Sqoop入门
  12. [转]cron表达式详解
  13. Gerrit 使用规范
  14. rssh RSA(非对称密钥)
  15. 数据分析-pandas基础入门(一)
  16. java将字符串存入GridF并通过id或文件名查询
  17. python 面试题3
  18. 【Unity笔记】协程Coroutine的简单优化
  19. openal 基础知识3
  20. KVM到KVM之v2v迁移

热门文章

  1. Eclipse 创建文件快捷菜单、避免格式化时自动换行、.properties文件中文乱码、在线安装FreeMarker
  2. DispatcherTimer
  3. DevExpress学习01——下载与安装
  4. B/S与C/S的差别
  5. TP自动生成模块目录
  6. vue Watcher分类 computed watch
  7. 设置python 命令行交互程序自己主动补齐
  8. [Python]网络爬虫(六):一个简单的百度贴吧的小爬虫
  9. Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
  10. Google Hack的一些整理