要使用HTTP/2需要注意以下几点
TLS
,但当前几乎所有浏览器均只支持 HTTP/2 Over TLS。所以在使用之前我们需要先制作一张证书。tomcat
或jetty
,它们并不能直接支持HTTP/2,但是undertow
可以。具体可以参考Spring Boot的文档:https://docs.spring.io/spring-boot/docs/2.0.5.RELEASE/reference/htmlsingle/#howto-configure-http2在本文的例子中使用的是
undertow
使用JDK自带的keytool
,证书类型为:PKCS12
keytool -genkey -alias undertow -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -dname "CN=localhost, OU=localhost, O=localhost, L=Zhengzhou, ST=Henan, C=CN"
输入密钥库口令:
再次输入新口令:
执行时会要求输入证书口令,这里输入的是123456
。执行完命令后会在执行的文件夹生成一个keystore.p12
的文件。
keytool的详细用法: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html
常见的证书格式及其说明参考:http://www.cnblogs.com/xq1314/archive/2017/12/05/7987216.html
spring boot默认使用的是tomcat,我们需要先将tomcat
移除,然后换成undertow
。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-tomcatartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-undertowartifactId>
dependency>
如果不移除tomcat依赖会一直以Tomcat作为容器启动。
然后将刚才生成的keystore.p12
拷贝到src/main/resources
下。然后在application.yml
中配置服务器信息。
server:
port: 8443 # 端口
compression:
enabled: true
http2:
enabled: true # 启用http2
ssl:
enabled: true
key-store: classpath:keystore.p12 # 启用http2
key-store-password: 123456 # 证书密码
key-store-type: PKCS12 # 证书类型
protocol: TLSv1.2 # 协议类型
key-alias: undertow
这时如果启动服务器,是只支持https
的。
@SpringBootApplication
public class RabbitmqProducerApplication implements WebServerFactoryCustomizer<UndertowServletWebServerFactory> {
public static void main(String[] args) {
SpringApplication.run(RabbitmqProducerApplication.class, args);
}
@Override
public void customize(UndertowServletWebServerFactory factory) {
factory.addBuilderCustomizers((UndertowBuilderCustomizer) builder -> {
builder.addHttpListener(8080, "0.0.0.0");
});
}
}
这里增加8080
端口的监听,配置参考:
启动后可以看到控制台打印出如下信息:
INFO 4288 --- [ main] o.s.b.w.e.u.UndertowServletWebServer : Undertow started on port(s) 8443 (https) 8080 (http) with context path ''
增加一个测试控制器
@RestController
@RequestMapping("/log")
public class LogController {
private Logger logger = LoggerFactory.getLogger(LogController.class);
@GetMapping("/info")
public String info() {
logger.info("Info log");
return "info";
}
}
访问:https://localhost:8443/log/info,观察控制台protocol
为h2
,说明这次请求使用的是HTTP/2
协议。
再次请求
观察两次请求的size,一次是236
一次是69
,这是因为HTTP/2
的头部压缩技术。
访问:http://localhost:8080/log/info,观察控制台可以看到使用的仍然是HTTP/1.1
协议
而且数据包要比HTTP/2
的数据包大,并且无论刷新多少次,大小是不变的。