专栏目录
- 是时候升级java11了-01-jdk11优势和jdk选择
- 是时候升级java11了-02-升级jdk11踩坑记
- 是时候升级java11了-03虚拟机Jvm参数设置
- 是时候升级java11了-04微服务内http2通信之http2 Clear Text(h2c)
- 是时候升级java11了-05微服务内h2c通信的阻碍和问题解决
前言
看过前面几篇文章的同学是否也在尝试将Jdk升级到Java11呢?今天笔者要讲解的是微服务内部升级到 HTTP/2.0 协议。
http2优势想必大家都知晓,在这不做过多的介绍。说起 HTTP/2.0 大家所熟知的应该是 Over TLS 版,现有支持HTTP/2.0的浏览器都是实现的 Over TLS 版,
今天带领大家了解 HTTP/2.0 的另一个版本 HTTP/2.0 Clear Text。
HTTP/2.0 Clear Text
HTTP/2.0 Cleartext,简称 h2c(后文将使用这个简称)。使用101 改变协议协商升级为 HTTP2 协议,采用 http2 不做加密,非常适合微服务内部的请求。
享受 http2 的多路复用,降低 tls 对服务器 cpu 的压力(加解密非常费 CPU),而且微服务内部 tls 也增加了证书的维护成本。
升级 h2c
Spring boot 容器笔者使用的是 Undertow,网关使用的 Spring cloud gateway,今天我们主要讲解这2个组件的升级到 h2c。
- Undertow 升级到 h2c 打开 Undertow 官网:undertow.io,我们可以看到首页上有这也一个说明:
google 翻译一下:支持HTTP升级,以允许通过HTTP端口多路复用多个协议。
/**
* Undertow http2 h2c 配置
*
* @author L.cm
*/
@Configuration
@ConditionalOnClass(Undertow.class)
@AutoConfigureBefore(ServletWebServerFactoryAutoConfiguration.class)
public class UndertowHttp2Configuration {
@Bean
public ServletWebServerFactory servletWebServerFactory() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
// 开启 undertow http2
factory.addBuilderCustomizers(builder -> builder.setServerOption(ENABLE_HTTP2, true));
return factory;
}
}
- spring cloud gateway 升级到 h2c
spring cloud gatewayserver 也是支持h2c的配置比较容易,只需开启配置即可,具体逻辑可以查看下图源码。
server:
ssl:
enabled: false
http2:
enabled: true
测试 h2c
上文介绍了服务端如何开启 h2c,但是是否开启成功只有测试过才知道。
最简单的方法就是基于 java11 的 HttpClient 来测试一番。
public static void main(String[] args) throws IOException, InterruptedException {
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8081"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.version()); // HTTP_2
System.out.println(response.body()); // test
}
后言
看到这里大家是不是跃跃欲试。当然,很多事情也不是那么一帆风顺。后面的一篇文章将会继续帮助大家趟坑。
等等好像有什么不对,我们的专栏不是 java11 么?怎么变成了 h2c?
别着急后面一篇文章将为大家解密,喜欢我们的文章的朋友记得关注我们。
声明
本系列文章由微服务核心组件mica作者如梦技术整理撰写, 如有参考或者转载,请保留原作者和注明出处。