【翻译】开源的CloudWeGo

ByteDance架构团队最初在CloudWeGo的博客上发表的客座文章

背景介绍

ByteDance自豪地宣布推出开源软件CloudWeGo。它专注于微服务通信和治理,提供高性能、强可扩展性和高可靠性,能够快速构建企业级云原生架构。

ByteDance使用Golang作为主要的开发语言,并支持数万个Golang微服务的可靠通信。经过海量流量下的实践,我们在微服务方面经验丰富,因此我们决定提供开源软件,以丰富社区的生态。

我们建立了CloudWeGo项目,将内部的微服务系统逐步开源,并尽量使项目对外部用户友好,我们内部的项目也将以这个开源项目为库,进行迭代开发。CloudWeGo将遵循一个重要原则,即对内对外维护一套代码,将它们作为一个整体进行迭代。由于我们需要将内部用户透明地迁移到开放源码库,我们最初并没有追求任何宣传。然而,令人欣慰的是,在一个月内,Kitex获得了1.2千颗星,Netpoll获得了700多颗星,这都是有机的。

CloudWeGo不仅是一个对外的开源项目,也是一个真正的超大规模的企业级实践项目。

我们期待通过CloudWeGo丰富云原生社区的Golang产品体系,帮助其他公司快速便捷地构建云原生架构。我们也希望能够吸引开源社区的开发者,共同维护和完善这个项目,提供多场景的支持,丰富产品功能。

由于CloudWeGo下的项目依赖于许多内部的基本工具库,我们也将内部使用的基本Golang工具库开源,并将其维护在bytedance/gopkg。

CloudWeGo

首先,CloudWeGo中包含的两个主要项目是KitexRPC框架和Netpoll网络库。我们选择不过早地公布这些项目,以确保我们的开源技术已经准备就绪,并在推出时得到充分的验证。

Kitex

Kitex[kaɪt'eks]是一个高性能强扩展性的Golang RPC框架,在Bytedance中使用。在Kitex之前,Golang的内部框架是Kite,它与Thrift强耦合--它的代码生成部分涵盖了代码中复杂的逻辑。

由于这些因素,很难从网络模型或编解码器层面对框架进行优化。

增加新的功能将不可避免地导致更多臃肿的代码,并会阻碍迭代的进程。相反,我们设计了一个新的框架,Kitex,来解决这些问题。虽然Kitex是一个新的框架,但它已经在内部在线应用了一年多。目前,Bytedance中超过50%的Golang微服务使用Kitex。

Kitex的特点包括。

  • 高性能

Kitex集成了Netpoll,这是一个高性能的网络库,比go net有明显的性能优势。Kitex还对Thrift的编解码器进行了一些优化,其细节可以在这里找到。用户也可以参考这个网站的性能结果。

  • 可扩展性

Kitex采用了模块化设计,提供了许多默认实现的接口供用户定制。用户可以通过扩展或注入这些接口来满足他们的需求。关于Kitex的可扩展性,请参考官方文档。对于他们的网络库,开发者可以自由选择netpoll以外的其他网络库。

  • 多消息协议

关于RPC消息协议,Kitex默认支持ThriftKitex ProtobufgRPC。对于Thrift,它支持两种二进制协议,即缓冲式和框架式。Kitex Protobuf是Kitex定制的Protobuf消息协议,其协议格式与Thrift类似。gRPC消息协议使Kitex可以与gRPC进行交互。此外,Kitex允许开发者扩展他们自己的消息传输协议。

  • 多传输协议

传输协议封装了RPC通信的消息协议,并且能够透明地传输用于服务治理的元信息。Kitex支持两种传输协议,TTHeaderHTTP2。TTHeader可以与Thrift和Kitex Protobuf一起使用。目前,HTTP2主要与gRPC协议结合使用,未来将支持Thrift。

  • 多消息类型

Kitex支持PingPongOne-wayBidirectional Streaming。其中,One-way目前只支持Thrift协议,双向Streaming只支持gRPC,未来Kitex将支持Thrift的双向Streaming。

  • 服务治理

Kitex集成了服务治理模块,如服务注册、服务发现、负载均衡、断路器、速率限制、重试、监控、跟踪、日志、诊断等。这些模块中的大多数已经被提供了默认的扩展,用户可以自行选择要集成的模块。

  • 代码生成

Kitex有内置的代码生成工具,支持生成ThriftProtobuf和scaffold代码。原始的Thrift代码是由Thriftgo生成的,它现在已经开源了。Kitex对Thrift的优化由Kitex工具作为插件支持。Protobuf代码是由Kitex生成的,作为官方的protoc插件。目前,Protobuf IDL解析和代码生成没有被单独支持。

Netpoll

Netpoll是一个高性能、非阻塞的I/O网络框架,专注于RPC场景,由ByteDance开发。

RPC通常重在处理逻辑,包括业务逻辑和编解码,因此不能像Redis那样串行处理I/O。然而,Go的标准库网是为阻塞式I/O API设计的,所以RPC框架只能遵循One Conn One Goroutine的设计。由于在高并发情况下有大量的goroutine,这就增加了上下文切换的成本。此外,net.Conn没有检查Alive的API,所以很难为RPC框架做一个有效的连接池,因为池子里可能有大量的失败连接。

另一方面,开源社区目前缺乏专注于RPC场景的Go网络库。类似的库如evio和gnet都是专注于Redis和Haproxy等场景。

Netpoll的设计就是为了解决这些问题。它从evio和netty的设计中汲取了灵感,实现了出色的性能,并且更适合微服务架构。Netpoll还提供了一些功能。建议开发者使用Netpoll作为RPC框架的网络库。

Thriftgo

Thriftgo是thrift编译器在go语言中的一个实现,支持Thrift IDL的完整语法和语义检查。

与Apache Thrift的官方Golang代码生成相比,Thriftgo做了一些错误修复,并支持插件机制。用户可以根据自己的需要来定制生成的代码。

Thriftgo是Kitex的代码生成工具。CloudWeGo即将开源thrift-gen-validator,这是Thriftgo的一个插件,支持IDL Validator,用于字段验证,这是Thrift所不提供的。有了IDL验证器,开发者就不需要自己去实现代码验证逻辑。

虽然Thriftgo目前只支持Golang Thrift代码的生成,但它的定位是支持各种语言的Thrift代码生成。如果将来有需要,我们也会考虑支持其他编程语言的代码生成。同时,我们会努力将Thriftgo贡献给Apache Thrift社区。

维护

一个完整的微服务系统是建立在一个基本的云生态系统之上的。无论微服务如何发展,基于公有云、私有云或你自己的基础设施,都需要额外的服务(包括服务治理平台、监控、追踪、服务注册和发现、配置和服务网等)和一些定制标准来提供更好的服务治理。在Bytedance,我们有完整的内部服务来支持微服务系统,但这些服务在短期内是无法开源的。那么,CloudWeGo将如何在内部和外部维护一套代码,并将它们作为一个整体进行迭代?

CloudWeGo中的项目并不与内部生态相耦合。比如Netpoll是直接迁移到开源库,我们内部的依赖关系也调整到开源库。

Kitex的代码分为两部分,包括已经迁移到开源库的Kitex核心,以及封装好的内部库,将为内部用户提供透明升级。

对于使用Kitex的开源用户来说,他们也可以扩展Kitex并将Kitex整合到自己的微服务系统中。我们希望并期待更多的开发者为kitex-contrib贡献自己的扩展,为更多的用户提供帮助和便利。

未来的方向

  • 开源其他内部项目

我们将继续开源其他内部项目,如HTTP框架Hertz、基于共享内存的IPC通信库ShmIPC等,为微服务场景提供更多支持。

  • 开源验证和稳定的功能

CloudWeGo的主要项目为Bytedance的内部微服务提供支持。新的功能通常在内部进行验证,在相对成熟的情况下,我们会逐步开源,比如整合ShmIPC免序列化免代码生成等。

  • 结合内部和外部需求,进行迭代

在推出开源软件后,除了支持内部用户外,我们也希望CloudWeGo能够为外部用户提供良好的支持,帮助大家快速构建自己的微服务系统。因此,我们会根据内部和外部用户的需求进行迭代。

在最初的反馈之后,用户对Protobuf表现出更强烈的需求。尽管Kitex支持多种协议,但Bytedance的内部RPC通信协议是Thrift。支持Protobuf、Kitex Protobuf或与gRPC的兼容性只是为了满足少数内部用户的需求,所以[对Protobuf]的性能还没有被优化。在代码生成方面,我们没有做任何优化,目前直接利用Protobuf的官方二进制。

Gogo/protobuf是一个优秀的开源库,它可以根据生成的代码优化Protobuf的序列化性能,但不幸的是,该库目前已经停止维护,这就是Kitex没有选择gogo的原因。为了满足开发者不断增长的需求,我们正计划开展Kitex对Protobuf支持的性能优化工作。

欢迎大家提交问题和PR,共同建设CloudWeGo。我们很高兴有更多的开发者加入,同时也期待CloudWeGo能够帮助越来越多的企业快速构建云原生架构。如果有企业客户想在你们的内部项目中采用CloudWeGo,我们可以提供技术支持。如果您有任何问题,请随时在Github上提出问题。

你可能感兴趣的:(翻译)