拓展連接 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。