转 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。

springboot http2的更多相关文章

  1. SpringBoot标准Properties

    # =================================================================== # COMMON SPRING BOOT PROPERTIE ...

  2. springboot application.properties 常用完整版配置信息

    从springboot官方文档中扒出来的,留存一下以后应该会用到 # ================================================================= ...

  3. java框架之SpringBoot(2)-配置

    规范 SpringBoot 使用一个全局的配置文件,配置文件名固定为 application.properties 或 application.yml .比如我们要配置程序启动使用的端口号,如下: s ...

  4. SpringBoot全局配置文件

    SpringBoot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到r ...

  5. spring boot http2

    项目已启动的情况下,启动单元测试报端口has binded 可以使用server.port=-1 禁用端口绑定来启动单元测试 https://docs.spring.io/spring-boot/do ...

  6. SpringBoot常用应用程序属性

    参考地址: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.h ...

  7. http2及server push

      本文主要研究下java9+springboot2+undertow2启用http2及server push maven <parent> <groupId>org.spri ...

  8. SpringBoot嵌入式Tomcat的自动配置原理

    在读本篇文章之前如果你读过这篇文章SpringBoot自动装配原理解析应该会更加轻松 准备工作 我们知道SpringBoot的自动装配的秘密在org.springframework.boot.auto ...

  9. SpringBoot以WAR包部署遇到的坑---集合贴

    ⒈忽略tomcat的context-path 方式一: 停止tomcat服务,删除tomcat安装目录的webapps目录下的ROOT目录,将打成的WAR包重命名为ROOT.war,重启tomcat服 ...

随机推荐

  1. Android ProgressBar具体解释以及自己定义

       版本号:1.0 日期:2014.5.16 版权:© 2014 kince 转载注明出处   这一次主要说一下Android下的进度条.为什么是它呢,由于最近被其各种美轮美奂的设计所倾倒,计划逐渐 ...

  2. 8. 利用反射机制, ListArray,intent来实现多Activity的切换

    package com.example.thenewboston; import android.app.ListActivity; import android.content.Intent; im ...

  3. MFC 小知识总结二

    1 UpdateData 不能及时更新控件内容 原因: UpdateData是通过数据交换实现改变控件显示的.改变了之后必需要调用一次OnPaint才干实现刷新. 因此,若是在一个函数里重复多次调用有 ...

  4. libcurl 接口调用方式

    http://hi.baidu.com/tracyu1026/item/bb6d5def4292b10b570f1d48 libcurl提供了一组C语言API函数直接调用.首先需要提到的两个函数就是c ...

  5. IE hack 汇总

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 【转】Html.RenderPartial与 Html.RenderAction的区别

    Html.RenderPartial与Html.RenderAction 这个两个方法都是用于把MVC用户控件嵌入到View中. Html.RenderPartial是直接将MVC用户控件嵌入到界面上 ...

  7. oracle 批量更新之将一个表的数据批量更新至另一个表

      oracle 批量更新之将一个表的数据批量更新至另一个表 CreationTime--2018年7月3日17点38分 Author:Marydon Oracle 将一个表的指定字段的值更新至另一个 ...

  8. idea 配置多个tomcat

      1.打开设置窗口 File-->Settings 2.启用tomcat 3.run-->edit configuration: 3.点击左上角+号-->找到Tomcat Serv ...

  9. 统计一个文件中出现字符'a'的次数

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #统计一个文件中出现字符'a'的次数 #http://www.cnblogs.com/hongten/p/ho ...

  10. Android API之java.lang.String

      boolean java.lang.String.contains(CharSequence cs) String字符串是否包含CharSequence(cs).