如今 HTTP/2 已在主流网站与浏览器中大面积普及,相比 HTTP/1.1 的队头阻塞,它通过多路复用、头部压缩(HPACK)与服务端推送显著降低了延迟、提升了吞吐。基于 wastnet,只需几行代码就能启用 h2——其 HTTP/2 协议栈完全自研、零第三方依赖,并支持直接加载 PEM 证书,免去繁琐的 TLS 配置。
下面从零开始,5 分钟搞定一个 HTTP/2 服务。
引入依赖
<dependency>
<groupId>io.github.wycst</groupId>
<artifactId>wastnet-core</artifactId>
<version>1.0.1</version>
</dependency>
零第三方依赖,仅依赖 JDK 本身。
准备证书
wastnet 对 PEM 与 JKS 两种证书格式都原生支持。最快的方式是直接用项目测试模块里已准备好的证书:PEM 位于 wastnet-test/src/main/resources/cert/(cert.pem + server.pem),JKS 位于 wastnet-test/src/main/resources/server.keystore(密码 123456)。
写服务代码
一个最小可运行的 HTTP/2 服务只需要几行:
package io.github.wycst.wastnet.examples.http;
import io.github.wycst.wastnet.http.*;
import io.github.wycst.wastnet.http.handler.HttpRequestHandler;
public class Http2QuickStart {
public static void main(String[] args) throws Exception {
HTTPServer.of(8443)
.pemSSL("cert/cert.pem", "cert/server.pem")
.h2()
.requestHandler((request, response) -> {
response.contentType(HttpHeaderValues.TEXT_PLAIN_UTF8)
.body("Hello HTTP/2 from wastnet!");
})
.start();
}
}
关键点就2个:
pemSSL(cert, key):直接加载 PEM 证书与私钥,免密钥库转换。
h2():开启 HTTP/2(h2)支持。
注意:HTTP/2(h2)依赖 ALPN 协商,需运行在 JDK 9 及以上才能生效。在 JDK 8 下 ALPN 不可用,wastnet 会自动降级为 HTTP/1.1 继续服务,代码无需改动。
如果你使用 JKS 密钥库(如 keytool 生成的 server.keystore),wastnet 同样支持,只需改用 sslContext(...) 加载构建好的 SSLContext 即可(可参考 HttpServerTest.java),h2 能力完全一致。
启动并验证
用 JDK 9+ 运行 Http2QuickStart,框架会在启动后自动打印 banner:
wastnet/1.0.1 started in 312 ms
>> Local: https://localhost:8443/
(若不需要 banner,可通过 startupBannerEnabled(false) 关闭。)
浏览器访问 https://localhost:8443/(自签名证书会有安全提示,继续访问即可),打开开发者工具 Network 面板,可以看到协议列显示为 h2。
也可用命令行验证:
curl --http2 https://localhost:8443/ -k
加一点路由
实际项目里一般不会只有一个路径。wastnet 通过 HttpRouterHandler 作为路由入口,支持精确匹配、前缀匹配与正则匹配:
import io.github.wycst.wastnet.http.handler.HttpRouterHandler;
import io.github.wycst.wastnet.http.handler.HttpRoute;
// 路由入口:以 "/" 为根路径
HttpRouterHandler router = new HttpRouterHandler("/");
// 精确匹配
router.exactRoute("/user", (path, request, response) -> {
response.body("user path");
});
// 前缀匹配(/api 及其子路径)
router.route("/api", (path, request, response) -> {
response.body("api prefix: " + path);
});
// 挂载路由并启动
HTTPServer.of(8443)
.pemSSL("cert/cert.pem", "cert/server.pem")
.h2()
.requestHandler(router)
.start();
完整示例入口
以上代码对应 wastnet 测试模块中的真实可运行示例,可直接参考:
- PEM 方式:
wastnet-test/src/main/java/io/github/wycst/wastnet/examples/http/MiniNginxHttp2.java
- 证书位于
wastnet-test/src/main/resources/cert/cert.pem 与 server.pem
- JKS 方式:
wastnet-test/src/main/java/io/github/wycst/wastnet/examples/http/HttpServerTest.java
- 密钥库位于
wastnet-test/src/main/resources/server.keystore(密码 123456)
wastnet 基于 Apache 2.0 协议完全开源、免费使用。5 分钟,一个自研 HTTP/2 服务就已经跑起来了。
相关链接