专栏名称: InfoQ
有内容的技术社区媒体。
目录
相关文章推荐
51好读  ›  专栏  ›  InfoQ

智谱清言微服务架构转型实践——基于 CloudWeGo 的技术演进

InfoQ  · 公众号  · 科技媒体  · 2025-05-22 13:07

正文

请到「今天看啥」查看全文


选择 CloudWeGo 的关键理由:性能、功能与社区支持

我们选择 CloudWeGo 作为开发框架有几个关键原因。

  • 优秀的性能与插件

首先,CloudWeGo 基于字节跳动开发的 netpoll 网络库,其性能在各项 Benchmark 测试中表现卓越,特别是 在高并发环境 下。这种 优异的性能 ,加上它支持的丰富插件,使得 CloudWeGo 成为一个非常有吸引力的选择。

  • 注重兼容性

其次,CloudWeGo 提供了 全面的微服务治理功能。它不仅模块化程度高,而且拥有一个功能丰富的插件生态,同时注重兼容性。对于已经熟悉 Gin 和 gRPC 的开发者来说,CloudWeGo 的 Hertz 和 Kitex 框架能够提供几乎无缝的过渡体验 。特别是 Kitex,它在使用上与 gRPC 相似,使得开发者可以轻松迁移而不需要大幅度修改现有代码。

另外,Kitex 和 Hertz 均提供了代码生成工具,可以一键生成 Thrift Protobuf 以及脚手架代码,减少不必要的代码开发。

  • 社区团队支持

最后,CloudWeGo 的社区支持是选择它的另一个重要原因。与传统的网络论坛相比,CloudWeGo 团队在飞书群内提供的即时响应和积极的问题解决态度为我们带来了更直接的交流体验。虽然 Gin 和 gRPC 拥有成熟的在线社区,但在飞书群中,我们能够得到更快速、更个性化的支持,这对于快速解决开发中遇到的问题非常关键。

image

因此,综合考虑性能、功能、兼容性以及社区支持,CloudWeGo 成为我们的首选开发框架。这不仅能提升我们的开发效率,还能确保技术实施的顺畅和高效。

image

这是从官网获取的 Benchmark 测试图表,从中可以看出 netpool 框架在 QPS 和 TP99 指标上表现优异。

其他组件选型

在项目中的其他组件选型方面,我们主要关注配置中心和服务中心的选择。

  • 配置中心:Nacos vs Apollo

对于配置中心,Go 语言开发中常见的选项包括 Nacos 和 Apollo。鉴于 Apollo 的配置较为复杂且许多特性在我们的应用场景中并非必需,我们选择了 Nacos。Nacos 不仅提供配置中心功能,还整合了服务中心的功能,具体可以分为 naming 和 config 两部分。对于日志和链路追踪,我们采用了阿里云提供的 SLS 和 Arms,这些工具能有效支持我们的监控和故障排查需求。

  • 子服务定义

接下来,我们定义了几个关键的子服务:

  • HTTP 服务 :基于 Hertz 框架,分为 Rest 和 Admin Rest。Rest 服务主要服务于面向消费者的客户端业务,而 Admin Rest 专用于后台管理系统的接口。

  • RPC 服务 :使用 Kitex 框架的 Protobuf 协议,适用于内部通信需求。

  • 后台进程 :包括 Task 和 Worker。Task 主要处理定时任务,而 Worker 设计以支持扩容,例如作为 Kafka consumer。

  • 统一的 SDK

    • Common 库 :这是一个包含多种基础组件的通用库,如网络库、数据库接口(Mongo、MySQL)、Redis、MQ 和日志配置中心等。Go 1.18 对泛型的支持使得在 util 工具集中加入了大量针对 slice 的工具函数,类似于 JavaScript 中的 map、reduce、filter 方法,这些工具函数支持函数式编程,提高了代码的可用性和清晰度。

    • Support 库 :这是一个高度集成的内部库,整合了 Comment 和 IDL,提供多种中间件功能,如鉴权、限流、签名和公共参数等。它还包括 RPC 代理客户端,使业务开发无需每次都自行处理客户端调用,而可以直接利用 Support 库简化开发过程。

通过这样的组件和服务定义,我们确保了项目的模块化和高效性,同时也便于未来的扩展和维护。

框架搭建实践
配置中心和入参处理

关于配置中心的设计,我们设定了每个数据集必须实现的三个接口:Name、FileType 和 Init。Nacos 利用 namespace、group 和 dataid 三个参数来确定一个唯一的数据集。其中,namespace 用于区分不同的服务环境,group 用来区分不同的服务,而 dataid 用于区分具体的数据集。在这里,name 对应于 dataid,而 group 则设定了配置加载的优先级。

例如,在配置体系中,具有相同服务名或仓库名的配置项将被归入同一个 group,例如







请到「今天看啥」查看全文