拓展连接 http://www.jianshu.com/p/9710585258fbhtml
HTTP/2是第二代的HTTP协议,你们能够经过https://http2.akamai.com/demo来感觉下Http2
的提速。java
Spring Boot
的web容器选择中已经有Undertow
和Jetty
两个容器能够支持HTTP/2了,这个例子中我选择了Undertow
做为Spring Boot
的web容器。web
虽然Http2
没有强制要求使用TLS
,但当前几乎全部浏览器均只支持 HTTP/2 Over TLS。这样作一方面更安全,另外一方面利用 TLS
的加密机制能够更好地穿透网络中间节点。因此在咱们模拟一个Http2服务以前,咱们须要产生一份本地的Https证书为后面的试验作准备。chrome
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.p12
的PKCS12
证书,很快咱们就会在Spring Boot中使用到这份证书。安全
ALPN是Application Layer Protocol Negotiation的缩写,是 HTTP/2 的一种协议协商机制:网络
Upgrade
请求,与客户端协商是否切换到HTTP/2。为了让JVM支持这种机制,须要引入Jetty
的alpn_boot
,并在项目启动的过程前使用命令:oracle
java -Xbootclasspath/p:<path_to_alpn_boot_jar> ...
对于不一样版本的JDK,也须要采用不一样版本的alpn_boot
,详情能够参见:http://www.eclipse.org/jetty/documentation/9.4.x/alpn-chapter.html#alpn-versionsapp
Http2的这个例子是基于以前undertow的Demo作的,在配置类中务必添加这个配置,来启用undertow
中的Http2
功能:eclipse
@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
因为咱们产生的证书是自签名的证书,并不会被浏览器承认,因此会被标记成不安全,可是并不影响咱们对的TLS
使用,经过chrome的插件能够看到网站已经采用了HTTP/2。