跳转到内容

v1.10.2

发布于 2026-05-31 - GitHub Release

MCP:为工具处理程序选择性注入 HTTP 请求元数据(#5550

Section titled “MCP:为工具处理程序选择性注入 HTTP 请求元数据(#5550)”

MCP 服务新增 WithRequestMetadataExtractor 选项。启用后,HTTP 请求元数据(请求头、查询参数和路径变量)会被提取并注入每个处理程序的 context.Context。处理程序可通过以下辅助函数读取这些信息:

server := mcp.NewMcpServer(conf, mcp.WithRequestMetadataExtractor(mcp.DefaultRequestMetadataExtractor))
server.AddTool(tool, func(ctx context.Context, req *mcp.ServerRequest) (*mcp.ToolResult, error) {
tenantID, _ := mcp.HeaderFromContext(ctx, "X-Tenant-ID")
userID, _ := mcp.QueryFromContext(ctx, "user_id")
// ...
})

可用的辅助函数包括 RequestMetadataFromContextHeaderFromContextQueryFromContextPathFromContext。该功能完全向后兼容,现有的 NewMcpServer(c) 调用不受影响。

Go 1.26 强制执行 RFC 3986 URI 解析,并拒绝在 URI authority 部分使用逗号分隔的主机。此前 BuildDiscovTarget 会生成 etcd://host1:2379,host2:2379/key 形式的 URI,导致使用多端点 etcd 服务发现的 gRPC 服务无法在 Go 1.26 及更高版本运行。

etcd 目标 URL 格式现将主机放在路径中,并将 etcd key 放在查询参数中:

# 修复前(无法在 Go 1.26 运行):
etcd://host1:2379,host2:2379/my-service-key
# 修复后(符合 RFC 3986,适用于所有 Go 版本):
etcd:///host1:2379,host2:2379?key=my-service-key

discov:重复 etcd PUT 事件导致的无界内存增长(#5580

Section titled “discov:重复 etcd PUT 事件导致的无界内存增长(#5580)”

修复了两个会让长期运行 zRPC 服务内存无限增长的问题:

  • 冗余的 OnAdd 调用handleWatchEvents 此前会对每个 etcd PUT 事件调用 OnAdd,无论值是否变化,例如租约续期或 watch 重连。现在会跳过重复 PUT;值变化时依次触发 OnDelete(old)OnAdd(new),以保持监听器状态一致。
  • addKv 中的无界切片增长:此前无条件将 key 添加到内部 container.values 切片,使单个 etcd key 随时间累积数千个重复项。addKv 现在会提前忽略完全重复的项,并在 key 移动到新服务器地址时清理旧项。

完整变更日志https://github.com/zeromicro/go-zero/compare/v1.10.1…v1.10.2