CloudWeGo:云原生时代的微服务中间件
——罗广明
CloudWeGo开源负责人
一、项目总体介绍
CloudWeGo 是字节跳动基础架构团队的开源项目,是一套可快速构建企业级云原生架构的中间件集合。企业级意味着项目面向企业级用户,从企业内部孵化出来,其特点是微服务通信与治理同时具备高性能、可扩展、高可靠三个突出性能,同时也非常注重用户体验和软件易用性。
CloudWeGo 项目都在字节内部经过大规模落地实践验证,开源后每一个功能迭代也会第一时间在内部经过使用验证,是真正的企业级落地项目,且开源用户和字节内部业务使用同一套服务框架。
CloudWeGo 提供的各个子项目和相关功能,尤其是协议支持和服务治理等能力都是为真正解决真实业务痛点而研发,每一行代码优化都能实实在在为用户带来性能和用户体验上的提升。
此外, CloudWeGo 子项目的研发设计也借鉴了业界知名开源项目的设计思路,同时将其他开源项目作为上游依赖。我们将 CloudWeGo 开源,希望以此回馈开源社区,为开源社区贡献一份自己的力量,壮大开源社区生态。
CloudWeGo 在第一阶段开源了四个项目,分别是 Kitex、Netpoll、Thfitgo、Netpoll-http2。
Netpoll 是字节跳动内部自研的高性能、I/O 非阻塞、专注于 RPC 场景的网络框架,借鉴了业界开源的 evio 和 netty 的优秀设计,具有非常出色的性能,更适用于微服务架构。同时 Netpoll 还提供了很多特性,推荐在 RPC 框架中作为底层网络库使用,享受其特性带来的性能收益。
Thfitgo 是由 Go 语言实现的Thfit解析和代码生成器。支持非常完善的Thfit IDL 语法和语义检查。相比于 Apache Thfit官方的功能实现代码,Thfitgo 做了问题修复,并且支持灵活插件机制,问题修复和语法语义检查部分内容当前也正在积极地反馈提交给上游Apache Thfit 社区。
Netpoll-http2是基于 Netpoll网络库 HTTP/2 的实现。简而言之就是将 Golang 标准库里源码对于Go 的使用替换为 netpoll,在 Kitex 里集成 Netpoll之后可以提供对 gRPC 的协议支持。
除这上述四个主要项目,CloudWeGo 还相继开源了相关附属项目和中间件能力的支持补充,满足用户需求,提升用户使用体验。比如,CloudWeGo 提供了kitex-examples 库,其中包含非常丰富的、开箱即用的生产级别用例,包括服务治理、 tracing链路追踪等。此外,还提供了 benchmark 仓库,方便于用户基于仓库自行做 kitex 和 netpoll 压测。同时开源了thrift-gen-validator,支持 IDL 的语法语义检测用于做字段值校验,从而弥补 thrift 原生缺失的能力。
截止到2022年5月,Kitext 已经收获 4300 star,netpoll收获 2600 star ,整个 CloudWeGo 组织收获 star 数超 7000 。
CloudWeGo 的开源有几个关键时间节点。 2021 年 9 月正式对外发布CloudWeGo 项目开源,并在后续持续发版迭代,修复 bug ,开发新功能。2022 年后,发版节奏趋于稳定,每两个月会发布一个中版本。
预计今年将发布Kitex 1.0.0 版本,这也意味着我们对外部正式承诺项目功能的稳定性和完备性,用户可以放心将其投入生产环境。
CloudWeGo 的用户包括字节内部众多核心业务,如抖音、今日头条、飞书等,。此外项目开源以来也逐步吸引了诸多外部企业用户的关注,很多企业正在测试 CloudWeGo ,也有部分企业已经将 CloudWeGo 相关技术应用到生产环节,比如森马。
二、CloudWeGo-Kitex 介绍
上图为 Kitex项目架构,主要由三个部分构成,分别是 Kitex Tool、Kitex Core以及依赖的第三方库。其中 Kitex Core是携带一整套微服务通信和治理能力的 RPC 框架,也是 Kitex 的核心部分;Kitex Tool 是命令行工具,能够在命令行生成代码以及服务脚手架,可以提供非常便捷的开发体验;Second Party Pkg 是 Kitex 依赖的子项目 netpoll、Netpoll-http2 的底层网络库;除此之外,还有 KitexByted 部分,它是字节内部的基础设施扩展集合,Kitex 通过这一套扩展集合支撑起内部业务发展。这也说明,字节内部与外部共同依赖这一套 Kitex Tool、Kitex Core。
Kitex 项目最重要的特性是高性能和可扩展性,这也是贯穿整个 CloudWeGo 项目非常核心的特点。
高性能方面,Kitex 框架默认集成了字节自研的网络库 netpoll ,而 netpoll 性能相较于 Go 语言原生 gonet 有着非常显著的优势。除了网络库带来收益之外,我们还对 Thift 编解码做了较多优化,感兴趣的读者可以观看字节以往发布的优化实践博客,也可以通过 Kitex benchmark 仓库了解相关性能、测试数据和场景介绍。
扩展性方面, Kitex 在设计上做了非常明确的模块划分,提供了很多扩展接口以及默认扩展实现。使用者既可以根据自己的需求自行定制相关扩展,也可以结合默认扩展实现开箱即用的效果。另外 Kitex 并没有硬耦合 Netpoll 网络库,开发者如果确有其他需求,也可以使用其他网络库扩展。
Kitex 的其他功能及特性还包括:
消息协议:RPC 消息协议默认支持 Thrift 和 Kitex 定制的 Protobuf 协议以及 gRPC 协议。其中 Thrift 支持 Buffered 和 Framed二进制协议,Kitex Protobuf是 Kitex 自定义的 Protobuf 协议,格式类似于 Thrift ,gRPC 则是针对 gRPC 消息协议的支持,可以实现与 gRPC 框架互通。除此之外,用户也可以按需扩展自己的消息协议。
传输协议:封装了上面的消息协议进行 RPC 互通,传输协议可以额外透传其他元信息用于服务治理。Kitex 支持的传输协议有 TTheader 和http2, TTheader可以与 Thrift 和 Kitex Protobuf 结合使用。http2 目前主要结合 gRPC协议使用,后续会实现 Thrift 协议的支持。
多消息类型:目前支持 PingPong、one way、双向 streaming 等多种消息类型。其中Oneway 目前只对 Thrift 协议支持,双向Streaming 只对 gRPC 支持,后续会考虑支持Thrift 的双向 Streaming。
服务治理:支持服务注册 / 发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。如果用户有其他诉求,比如需要集成自己的内部注册中心、内部链路追踪实现、内部中心化限流接口等,都可以通过扩展实现,能够轻松地加载到业务代码中。
代码生成工具:可支持生成Thrift、Protobuf以及脚手架代码。原生 Thrift代码由本次一起开源的Thriftgo生成, Kitex 对 Thrift 的优化也由 Kitex2 作为插件支持。
归功于 Kitex 强大的扩展能力,比如服务治理能力、服务注册发现、监控调用链、日志,CloudWeGo Kitex 团队在开源之际针对其原生能力都提供了默认实现,其他功能则由开源社区开发者自发地完成相关能力的对接和支持。
上图为 Kitex 生态扩展的汇总,几乎囊括了业界所有主流服务注册与发现所需的对接注册中心,比如 Consul、Nacos、etcd等。在可观测性方面也先后支持了OpenTracing 和 OpenTelemetry,未来计划主推 OpenTelemetry的实现和对接。
Kitex 开源之后,也在积极地探索与业界主流公有云的微服务产品做集成和对接。当前,阿里云已经对 Kitex 提供了很好的支持,旨在为用户提供微服务平台开发基座,保障开源用户能够在有需求的情况下快速上云,同时保障服务稳定和平滑,也尽量保障用户的使用体验。
阿里云微服务引擎 MSE和应用实时监控 ARMS 已经对 Kitex 框架实现了集成和对接,更多其他能力也在持续对接当中。此外,火山引擎相关微服务产品也在相关规划中,完成后将陆续开源。
CloudWeGo 联合阿里云、哔哩哔哩、Nacos 社区、 Spring Cloud Alibaba 社区以及 Dubbo 社区等合作讨论服务治理标准化和规范化相关事宜,共同成立发起了 OpenSergo 项目。 OpenSergo 项目天然支持 Spring Cloud 和 Apache、 Dubbo 等主流 Java 微服务框架,也支持 Kratos和 CloudWeGo Kitex 以及 Spring CloudAlibaba 等框架。
OpenSergo 统一了治理规则,用户不必再绑定到某具体开源方案上,也无需绑定固定云厂商提供服务,不同数据面和控制面只需对接 OpenSergo 即可无缝对接现有的服务治理体系。
对于 CloudWeGo Kitex而言,支持或对接 OpenSergo 服务体系,除了可以和其他开源框架在服务治理侧打平,也方便不同框架之间做相互迁移,并且服务侧的能力不会损失,还可以在阿里云微服务引擎等产品和基础设施上快速上云。
Easy Note 是 Kitex 项目的最佳实践之一。它是笔记服务,使用 Kitex 来实现服务间 RPC 调用。入口处基于Hertz 对外提供 http 接口,入口层以及服务间的 RPC 通信完全使用 CloudWeGo技术栈,既可以对外提供 http接口,又能够保障内部 RPC 调用;既能支持 Thrift 通信,又能支持 Protobuf 通信协议。
第一版本的服务注册与发现使用了 ETCD 作为中心,第二版本将替换成 Nacos,这也从侧面说明 Kitex 应用可以很方便地进行服务注册中心的选型和迁移。 ORM 库使用 Gorm 框架,网络库使用 netpoll ,调用链追踪使用Jaeger 同时通过 OpenTelemetry进行埋点和数据上报,证明了 Kitex 可以与周边生态库做很好的结合。
此外,Easy Note 还使用了很多 Kitex 的其他功能,包括 Middleware 机制、限流、请求超时重试等服务治理能力以及基于 Thrift 连接多路复用等。
感兴趣的用户可点击 http://github.com/cloudwego/kitex-examples,查看样例更多详情,也可以参考样例快速构建自己的微服务。
三、CloudWeGo 开源实践
CloudWeGo 开源之初就非常重视官网建设和用户体验,官网默认支持英语页面文档,支持所有页面进行中英文切换,方便不同用户群体使用。同时官网的所有文档以及手册、介绍都非常完备,包括了从 0 到 1 快速帮助新手上手等。
官网数据显示, CloudWeGo 的官网用户遍布全球多个国家,主要分布在中国、美国以及新加坡等地区,目前累计独立访问用户已超 20000。
CloudWeGo 在开源社区建设方面也有一定的经验,提供了非常完备的社区参与机制和身份晋升制度。开源爱好者可以通过开源社区加入到项目中来,同时也可以根据自己贡献度情况,成为晋升成为 Community Member 、Committer 。此外,在角色基础之上,还可晋升为项目 Approver ,能够行使代码 review 以及合并等权利。感兴趣的同学可以通过访问 CloudWeGo 组织下的Community仓库查看文档,了解更多详情。
此外,CloudWeGo 非常注重社区 Committer 的培养和贡献激励。社区贡献者在晋升成为社区Member 或者 Committer 的过程中,有社区管理委员会及字节跳动资深研发工程师进行一对一指导,晋升流程公开透明,由管理会成员提名,再由CloudWeGo 开源委员公开在 github 上面投票通过。
目前 CloudWeGo 已经培养出 5 位 Committer ,他们也为社区发展做出非常重要的贡献。
2022 年起,为了缩短与开发者的距离、更好地倾听来自于开发者的心声和诉求、建议,我们将定期组织社区例会(目前为两周一次),同时为保证会议高效性,当前主要面向社区贡献者开放,感兴趣的社区贡献者可以与社区联系,参与到例会中,共同为社区发展谏言献策,讨论技术方案或进行Q&A。
除了社区建设,我们也在积极探索与外部其他机构的合作。CloudWeGo 于 2021年 10 月正式加入 CNCF Landscape,为全球用户在 RPC 框架领域的技术选型提供新选择,进一步丰富全球云原生领域的开源生态。
同时,CloudWeGo 也在积极参与国内开源社区与生态合作。我们加入了信通院可信开源社区,是可信开源社区的第一批预备成员,未来将积极参与信通院主导的可信开源社区测评。