我们 dubbogo 社区很高兴地宣布 Apache Dubbo-go v3.3.2 正式发布!
这个版本 面向生产环境,重心在内核稳定性。我们彻底收敛了旧配置体系,扩展了 Triple 协议与泛化调用能力,加强了应用级元数据和服务治理,同时集中修了并发安全、资源泄漏和热路径性能问题。
Dubbo-go 3.3.2 的改进主要集中在以下五个方向:
config 包和 Viper 依赖,统一为 Instance / Options APIDubbo-go 3.3.2 在生产可用性和工程成熟度上又往前走了一步。下面给出主要新特性,完整升级特性请访问 v3.3.2 Release Note。
Dubbo-go 3.3.2 把旧
dubbo.apache.org/dubbo-go/v3/config 包彻底移除了——这是社区跨多个版本做架构迁移的最终交付。运行时组件现在统一走
dubbo.NewInstance、各组件 Option 包和
global 下的配置类型。
主要变更:
config 包和根目录兼容桥接(
#3372、
#3448、
#3449)CustomConfig 和
InstanceOptions 的已解析配置快照,方便应用检查运行时配置(
#3481)> ⚠️
Breaking Change:如果应用直接导入了已删除的
config 包,升级前必须迁移到
dubbo.NewInstance 以及
global 下的配置类型。这是本次发布最需要优先处理的变更。
Triple 协议在 3.3.2 中新增了多项面向 HTTP 网关和跨语言互操作的能力。
泛化调用能力扩展:
Triple 泛化调用现在支持无需预生成桩代码的跨语言调用,并覆盖 Dubbo Java 互操作所需的封装格式:
protobuf-json 和
bean Generalizer(
#3170、
#3175)面向 HTTP 和云原生的能力增强:
底层传输优化:
底层 Triple Client 从「每个方法一个 Client」重构为「每个服务一个 Client」,每个服务管理的 Client 实例数量从 O(methods) 降为 O(1),大幅减少连接和内存开销。高层
client.Client 与生成的客户端 API 不受影响(
#3086)。
Dubbo-go 3.3.2 补齐了面向 Kubernetes 部署的能力缺口,并对路由与治理体系做了增强。
Kubernetes 探针与优雅停机:
路由与治理增强:
> 提示:优雅停机是本次发布的重构重点,属于「云原生生命周期」亮点的延伸。如果你的应用有自定义的关闭逻辑,建议升级后在测试环境验证完整的启停流程。
3.3.2 给应用级元数据补齐了生命周期和一致性能力,在复杂生产环境里更靠谱了:
3.3.2 同步刷新了配套工具链,并对代码生成和 CLI 脚手架做了改进。
配套工具版本:
| 工具 | 版本 |
|---|---|
protoc-gen-go-triple |
3.3.2 |
protoc-gen-triple-openapi |
3.3.2 |
dubbogo-cli |
1.0.1 |
imports-formatter |
1.0.11 |
关键变更:
protoc-gen-go-triple 默认生成现代的
NewXxx 和
RegisterXxxHandler API 风格,并在生成文件中记录生成器与
protoc 版本。迁移期间可通过
useOldVersion=true 生成旧版接口(
#3585)make proto-gen 生成协议代码,使用 Go 1.25 和稳定版 Dubbo-go v3.3.1 依赖,并将包装后的 EOF 识别为正常流结束。Linux CI 会端到端生成并编译新的 application 与 demo 项目(
#3585、
#3587)3.3.2 在并发安全、资源管理和热路径性能上做了集中修复,可以看作一次「内核加固」。
修复了以下路径的竞态条件:URL 克隆、共享扩展注册表、元数据状态、协议生命周期、Nacos 和 Directory 状态、一致性哈希、Round Robin 负载均衡、Sticky Invoker 和服务发现 Listener Map。几个典型的修复合在一起看:
hash.arguments 索引,接受非字符串请求参数不 panic(
#3430、
#3432)traceparent 传播中断和元数据 Provider 类型不匹配(
#3285、
#3433)减少了
common.URL、负载均衡、服务发现和 Triple Content-Type 处理中的内存分配与重复计算:
import ( "dubbo.apache.org/dubbo-go/v3/protocol/triple")
srv, _ := server.NewServer(
server.WithServerProtocol(
protocol.WithPort(20000),
protocol.WithTriple(),
),
)// 注册 Kubernetes 探针srv.RegisterProbe("liveness", func() bool { // 检查关键依赖是否存活
return true})
srv.RegisterProbe("readiness", func() bool { // 检查服务是否准备好接收流量
return true})
srv.RegisterProbe("startup", func() bool { // 检查启动初始化是否完成
return true})
srv.Serve()Go代码解读复制代码收起代码▲
import ( "net/http"
"dubbo.apache.org/dubbo-go/v3/protocol/triple")
mux := http.NewServeMux()
mux.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"status": "ok"}`))
})
srv, _ := server.NewServer(
server.WithServerProtocol(
protocol.WithPort(20000),
protocol.WithTriple(
triple.WithHTTPHandler(mux), // 在 Triple 端口上挂载 HTTP Handler
),
),
)
srv.Serve()Go代码解读复制代码收起代码▲
import ( "dubbo.apache.org/dubbo-go/v3/common/constant"
"dubbo.apache.org/dubbo-go/v3/generic")// 使用 protobuf-json 泛化器,无需预生成桩代码cli, _ := client.NewClient(
client.WithClientProtocolTriple(),
client.WithClientURL("tri://127.0.0.1:20000"),
)
genericCli := generic.NewGenericClient(cli, "com.example.UserService",
constant.ProtobufJSONGenericSerialization,
)
req := map[string]interface{}{ "userId": "003", "name": "dubbo-go",
}
resp, _ := genericCli.Invoke(context.Background(), "SayHello", req)Go代码解读复制代码收起代码▲
dubbo.apache.org/dubbo-go/v3/config 的应用必须迁移到
dubbo.NewInstance 和
global 下的配置类型protocol/triple/triple_protocol.Client 的代码需为调用显式传入 RPC 方法名;高层 API 不变(
#3086)Dubbo-go 3.3.2 是一次 内核加固、能力扩展的版本演进:
感谢社区的持续投入,我们期待与你一起推进 Dubbo-go 的下一步演进。
感谢所有参与 Dubbo-go 3.3.2 建设的社区成员(按字典序):
@04cb @Aetherance @Aias00 @Alanxtl @AlexStocks @AsperforMias @CAICAIIs @chaojixinren @eye-gu @fallintoplace @HarshMehta112 @HGD-coder @jieguo-coder @lesbass @mochengqian @MrSibe @nagisa-kunhah @nanjiek @NeverENG @Oxidaner @phpcyy @Qiao-yq @Saramanda9988 @Similarityoung @Snow-kal @Tsukikage7 @Vanillaxi @whimc1 @wyf027 @XnLemon @xxs588 @yangpixi @ywxzm03 @zbchi
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70037778/viewspace-3178080/ ,如需转载,请注明出处,否则将追究法律责任。