Hertz 0.5.0 发布: 支持 HTTP3 & 基于 IDL 的 client 代码生成

2023-03-08 19:44:52 浏览数 (1)

Hertz 0.5.0 版本中,除了常规迭代优化之外,我们还带来了多个重要 feature。

网络层和协议层支持基于流的接口

https://github.com/cloudwego/hertz/pull/467

在 Hertz v0.5.0 版本中,我们进一步加强了Hertz 传输层 & 协议可扩展能力,支持无缝对接基于流的传输层协议 QUIC,以及在此之上构建的 HTTP3 协议。

此外,我们在此基础上还增加和完善了 "ALPN"(应用层协议协商)、"QUIC/TLS parallel monitoring"(QUIC/TLS并行监听)、"Alt-Svc"(备选服务) 等功能。

主要变更

  • 传输层

我们在保证兼容性能的基础之上增加了一个针对基于流(stream-based)的网络连接接口抽象 ,同时调整传输层和协议层的交互逻辑,实现针对连接类型的分发正确的协议层处理(protocol server)。

针对需要同时监听监听 TCP(TLS)以及 UDP(QUIC) 的场景我们提供了一个 WithAltTransporter选项,方便将备用 transporter 传递到主 transporter 中,便于实现 QUIC/TLS 并行监听的能力。

  • 协议层

支持添加基于流的协议层实现(protocol server)StreamServer,以便于在新增的基于流的传输层扩展之上构建对应处理协议(HTTP/3)。

为了便捷的实现为某个主协议(HTTP/3)配置备选服务元信息,ProtocolSuite对外暴露 接口。

同时,我们也为 StreamConn设计了 ALPN 能力,以便于在 QUIC 内提供协议协商的能力。

  • 通用层

同时我们在通用层中新增了能够与 Golang 标准 Handler进行转换的辅助函数,以便于快速的将基于 Golang 标准 Handler 实现移植到 Hertz 中来。在之后提供的基于 quic-go 的 QUIC & HTTP/3 扩展中,就用到了这个函数提供的能力。

  • Feature 状态

Hertz 核心库能力已经发布,具体实现后续将以扩展包的形式发布,欢迎试用~

更多详细的设计说明可以参考:https://www.cloudwego.io/zh/docs/hertz/reference/stream_based_design/

脚手架工具支持生成 hertz client 代码

https://github.com/cloudwego/hertz/pull/471

在脚手架工具(Hz)的 v0.5.0 的版本,我们支持了基于 IDL 自动生成 hertz client 代码的功能,并实现了类 RPC 调用形式的 HTTP 请求一键调用。

使用方法:

具体详见:https://github.com/cloudwego/hertz-examples/tree/main/hz_client

1. 定义 IDL

namespace go toutiao.middleware.hzClient struct QueryReq { 1: string QueryValue (api.query="query1"); } struct Resp { 1: string Resp; } service Hertz121 { Resp QueryMethod(1: QueryReq request) (api.get="/query", api.handler_path="get"); }( api.base_domain="http://127.0.0.1:8888"; )

2. 生成代码

可基于上述IDL,分别生成 server 和 client 端代码:

server:

hz new --idl=psm.thrift --handler_by_method -t=template=slim

client:

hz client --idl=psm.thrift --model_dir=hertz_gen -t=template=slim --client_dir=hz_client

3. 调用 client 代码发起 HTTP 请求,实现 client 端和 server 端的互通

开源项目

  实践项目代码开源:https://gitee.com/damon_one/microservice-k8s

0 人点赞