ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Hertz v0.10.4 版本解读:WithListener 自定义监听器、Client TLS 空闲连接回收与连接劫持修复全解析

Hertz v0.10.4 版本解读:WithListener 自定义监听器、Client TLS 空闲连接回收与连接劫持修复全解析 Hertz v0.10.4 版本解读WithListener 自定义监听器、Client TLS 空闲连接回收与连接劫持修复全解析【免费下载链接】hertzGo HTTP framework with high-performance and strong-extensibility for building micro-services.项目地址: https://gitcode.com/GitHub_Trending/he/hertz本文围绕 Hertz v0.10.4 的发布变更清单展开逐条解读本次版本中的新功能、缺陷修复与依赖调整并结合仓库源码给出对应的实现位置与调用关系。读完本文你将掌握如何为 Hertz Server 注入预先创建的net.Listener、理解Client.CloseIdleConnections对 TLS 连接池的回收逻辑以及连接劫持hijack数据完整性修复对 HTTP 适配层使用者的实际意义。本次版本概览完整变更见 changelog/v0.10.4.md可归纳为五个部分类别条目关联 PRFeaturesserver 新增WithListener选项支持传入预创建的net.Listener#1444Fixesclient 修复Client.CloseIdleConnections不关闭 TLS 连接的问题#1467Fixesbinding 修复开启disableNormalizing时 Header 绑定不正确的问题#1470Fixesadaptor 修复ServeHTTP返回后连接被过早关闭、以及劫持连接时未先 flush 导致的数据丢失#1462 / #1459Fixestagexpr 修复FakeBool对不支持类型触发 panic 的问题#1448Improvementstagexpr/validator 移除 phonenumbers 依赖phone()校验恒返回 true#1455Deps升级 sonic v1.15.0、netpoll v0.7.2、gopkg v0.1.3移除 phonenumbers 与 golang/protobuf—对应提交范围覆盖v0.10.3..v0.10.4从 CHANGELOG 的 Commits 列表可以看到本次版本同时包含了发布流程相关的工作例如为支持 go1.26 更新依赖#1477、新增发布脚本#1476等这些属于工程化内容与运行期行为无直接关系。新功能WithListener注入自定义 Listenerv0.10.4 在 Server 侧最重要的功能是新引入的WithListener选项。其文档注释与实现位于 pkg/app/server/option.go// WithListener sets the listener to use. // // If set, the server will use this listener instead of creating a new one. // This is useful for custom listener implementations or testing. // Note: This will update Network and Addr based on the listeners address, // and reset ListenConfig since its not needed when a listener is provided. // // WARNING: Custom net.Listener implementations may not be supported by cloudwego/netpoll. // If your custom listener doesnt support netpoll, you need to explicitly set the transporter to the standard library: // // WithListener(customListener), WithTransport(standard.NewTransporter) func WithListener(ln net.Listener) config.Option { return config.Option{F: func(o *config.Options) { o.Listener ln o.Network ln.Addr().Network() o.Addr ln.Addr().String() o.ListenConfig nil }} }从源码实现看这个选项做了三件关键的事直接使用传入的 Listenero.Listener ln之后Server 不再自行创建监听器适用于自定义监听器实现例如带特殊文件描述符处理的 listener或单元测试场景如注入net.Pipe等测试用连接。自动回填 Network 与 Addr从ln.Addr()推导出Network和Addr使用者无需再重复配置监听地址避免配了 Listener 却还在用旧的 Addr这类不一致。清空ListenConfig既然监听器已就绪原先控制net.Listen行为的配置ListenConfig就没有意义会被置为nil。使用时有一个需要注意的限制注释中明确警告自定义net.Listener实现未必受cloudwego/netpoll支持。如果自定义 listener 不支持 netpoll需要显式搭配标准库传输器hb, err : hertz.New( hertz.WithListener(customListener), hertz.WithTransport(standard.NewTransporter), )相关行为可在 pkg/app/server/option_test.go 与 pkg/app/server/hertz_test.go 中找到对应测试覆盖。修复一CloseIdleConnections现在会关闭 TLS 连接changelog/v0.10.4.md 记录了 client 侧的修复FixClient.CloseIdleConnectionsnot closing TLS connections (#1467)。查看 pkg/app/client/client.go 中的实现可以看到修复后的行为// CloseIdleConnections closes any connections which were previously // connected from previous requests but are now sitting idle in a // keep-alive state. It does not interrupt any connections currently // in use. func (c *Client) CloseIdleConnections() { c.mLock.Lock() for _, v : range c.m { v.CloseIdleConnections() } for _, v : range c.ms { v.CloseIdleConnections() } c.mLock.Unlock() }关键细节在于Client内部维护了两个 host client 映射c.m存放普通连接的 HostClientc.ms存放 TLS 连接的 HostClientDo路径中按isTLS分别入表见 pkg/app/client/client.go 附近的入池逻辑。修复前只处理了其中一个映射导致调用CloseIdleConnections后 TLS 空闲连接仍驻留在池中无法被及时回收。修复后在持有mLock的情况下同时遍历两个映射逐一关闭且不中断正在使用中的连接——这与方法注释中描述的语义仅回收 keep-alive 空闲连接保持一致。此外Client 本身还有周期性清理机制cleaner协程每 10 秒扫描一次把满足ShouldRemove条件的 host client 从池中移除并关闭见 pkg/app/client/client.go。CloseIdleConnections的修复与这套定期清理互为补充前者提供即时回收入口后者兜底长期空闲连接。修复二binding 在disableNormalizing下的 Header 绑定问题changelog 记录了 Fix header binding withdisableNormalizingenabled (#1470)对应提交说明为 use GetAll for header disableNormalizing。Header 绑定的解析逻辑集中在 pkg/app/server/binding 包内。该修复的背景是开启disableNormalizing即禁用 Header 名称规范化后Header 可能以原始大小写出现且存在多个同语义值。此前绑定逻辑在关闭规范化时对 Header 取值路径不够健壮修复后改用获取全部同名值的GetAll方式处理保证在关闭规范化的模式下也能正确读取 Header。如果你依赖原始 Header 拼写例如代理网关、自定义协议头场景并开启了disableNormalizing升级到 v0.10.4 后绑定结果会更符合预期。修复三adaptor 连接劫持的两处数据正确性问题v0.10.4 对标准net/http适配层adaptor做了两处与连接劫持hijack相关的修复两者都影响需要接管原始连接的高阶用法如 WebSocket、自定义长连接协议经 pkg/common/adaptor 转发时的场景flush 后再 hijack避免数据丢失#1459原实现在将连接交给业务方之前没有把已缓冲的响应数据刷写到底层连接可能导致劫持瞬间存在未发送的数据丢失。修复后在 hijack 之前先执行 flush。相关行为可在 pkg/common/adaptor/response_test.go 等 adaptor 测试文件中追溯验证。hijack 后连接不再被过早关闭#1462原先ServeHTTP返回后框架仍会回收已劫持的连接导致业务侧接管的连接意外断开修复后被劫持的连接在ServeHTTP返回后依然保持可用生命周期完全交由业务方管理。这两项修复共同保证了劫持语义的完整性数据先完整送达连接再真正移交。修复与改进tagexpr 与校验器FakeBoolpanic 修复#1448tagexpr表达式校验框架中FakeBool此前对不支持的类型会直接 panic修复后改为返回 false避免了单个非法字段值导致请求处理整体崩溃。表达式与选择器的实现位于 internal/tagexpr 包。移除 phonenumbers 依赖#1455tagexpr/validator内置校验器原先依赖github.com/nyaruka/phonenumbers实现phone()校验。本次版本移除了该第三方依赖phone()校验改为恒返回 true即仅保留语法占位不再做真实号码有效性判断依赖项在 go.mod 中同步移除。如果生产环境依赖phone()做真实号码校验需要自行在 internal/tagexpr/validator 的自定义函数机制上补充实现。依赖变更本次版本同时调整了若干关键依赖升级后需留意其对运行环境的影响依赖变更说明github.com/bytedance/sonicv1.14.0 → v1.15.0JSON 序列化加速库sonic 路径见 pkg/common/json/sonic.gogithub.com/cloudwego/netpollv0.7.0 → v0.7.2默认网络传输层实现github.com/bytedance/gopkgv0.1.1 → v0.1.3配套工具包github.com/nyaruka/phonenumbers移除见上文校验器改动github.com/golang/protobuf移除旧版 golang/protobuf 依赖下线CHANGELOG 中同时注明了 update deps for supporting go1.26 (#1477)说明本轮依赖更新包含对新版本 Go 工具链的适配升级前建议确认本地 Go 环境满足依赖要求。升级建议若你在用标准库 listener例如带自定义Accept限流、代理 socket 的封装对接 Hertz可以升级到 v0.10.4 改用WithListener一步注入并注意非 netpoll 兼容的自定义 listener 需搭配WithTransport(standard.NewTransporter)依赖CloseIdleConnections做连接即时回收尤其是 HTTPS 出向调用的客户端此版本修复后行为才符合回收所有空闲连接的语义依赖phone()校验做真实号码合法性判断的业务需自行补齐自定义校验函数使用 adaptor 做 HTTP 互操作且涉及连接劫持的场景建议尽快升级以获得 flush-before-hijack 与连接生命周期修复。【免费下载链接】hertzGo HTTP framework with high-performance and strong-extensibility for building micro-services.项目地址: https://gitcode.com/GitHub_Trending/he/hertz创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表