当前位置: 首页 > 科技观察

字节跳动开源微服务中间件CloudWeGo

时间:2023-03-15 13:48:10 科技观察

9月8日,字节跳动官方宣布开源CloudWeGo。这是一套以Go语言为核心的中间件合集,专注于微服务通信和治理,具有高性能、可扩展、高可靠等特点。据介绍,作为项目维护者,字节跳动基础架构团队主要在CloudWeGo开源库上推动项目迭代。未来团队将坚持对内对外维护一套代码,统一迭代演进,逐步共享更多内部微服务。实践。项目地址:https://github.com/cloudwego项目官网:www.cloudwego.ioCloudWeGo首批开放了四个项目,主要是RPC框架Kitex和网络库Netpoll。KitexKitex是一个高性能、可扩展性强的Golang微服务RPC框架。字节跳动使用Golang作为其主要的业务开发语言。早在2016年,基础架构团队就开始基于Golang开发内部框架Kite,并于2019年开始围绕性能和扩展性进行重构,使其更好地满足业务发展和技术系统演进的需求。2020年10月,Kitex正式上线。虽然是一个全新的框架,但是经过一年的上线应用,字节跳动内部超过50%的Golang微服务已经迁移到Kitex。以下是Kitex的一些特点:高性能:Kitex默认集成了自研网络库Netpoll作为网络传输模块,其性能相比使用gonet有显着优势;除了网络库带来的性能优势,Kitex还实现了ThriftcodecOptimization,在之前的性能优化实践文章中有介绍。性能数据请参考https://github.com/cloudwego/kitex-benchmark。可扩展性:Kitex采用模块划分设计,提供更多扩展接口和默认扩展实现。用户还可以根据自己的需要自定义扩展。Kitex不与Netpoll耦合,开发者可以选择其他网络库进行扩展使用。消息协议:RPC消息协议默认支持Thrift、KitexProtobuf、gRPC。Thrift支持Buffered和Framed二进制协议;KitexProtobuf是Kitex定制的Protobuf消息协议,协议格式类似于Thrift;gRPC支持gRPC消息协议,可以和gRPC通信。此外,用户还可以扩展自己的消息协议。传输协议:传输协议封装了RPC互通的消息协议。传输协议还可以透明地传输用于服务治理的元信息。Kitex支持的传输协议有TTHeader和HTTP2。TTHeader可以与Thrift和KitexProtobuf结合使用;HTTP2目前主要是配合gRPC协议使用,未来也会支持Thrift。多种消息类型:支持PingPong、Oneway、Two-wayStreaming。其中Oneway目前只支持Thrift协议,bidirectionalStreaming只支持gRPC,未来会考虑支持Thrift的bidirectionalStreaming。服务治理:支持服务注册/发现、负载均衡、断路器、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块。大部分都提供了默认的扩展,用户可以选择集成。代码生成工具:Kitex内置代码生成工具,支持生成Thrift、Protobuf、脚手架代码。NetpollNetpoll是字节跳动内部一个Golang高性能、I/O非阻塞网络库,专注于RPC场景。RPC通常处理逻辑比较重(业务逻辑、编解码),耗时长,不能像Redis那样串行处理(必须异步)。Go的标准库net设计了BIO(BlockingI/O)模式的API。RPC框架设计为了保证异步处理,需要为每个连接分配一个goroutine。当空闲连接较多时,会产生大量空闲goroutine,增加了调度开销。此外,net.Conn没有提供检查连接活动的API,因此很难设计出高效的连接池。池中的无效连接无法及时清理,复用效率低下。开源社区目前缺乏专注于RPC解决方案的Go网络库。类似的项目如:evio、gnet等,都是面向Redis、Haproxy等场景的。因此,Netpoll应运而生。它借鉴了evio和Netty的优秀设计,性能卓越,更适合微服务架构。ThriftgoThriftgo是一个用Go语言实现的ThriftIDL解析器和代码生成器。它支持全面的ThriftIDL语法和语义检查。与ApacheThrift官方的Golang代码生成相比,Thriftgo做了一些bug修复,支持插件机制。用户可以根据自己的需要进行定制。定义生成的代码。Kitex的代码生成工具是一个Thriftgo插件。CloudWeGo还将在近期开源另一个Thriftgo插件thrift-gen-validator,支持IDLValidator进行字段值校验,解决开发者需要自己实现代码校验逻辑的负担。弥补了Thrift的不足。Thriftgo虽然目前只支持GolangThrift代码的生成,但其定位是支持各种语言的Thrift代码生成。如果以后有需要,我们会考虑生成其他语言的代码。我们还将尝试将其回馈给ApacheThrift社区。Netpoll-http2Netpoll-http2基于Golang标准库golang.org/x/net/http2的源代码将gonet替换为Netpoll。Kitex目前使用它来支持gRPC协议。需要HTTP2的外部开发者也可以使用这个库。前面说过,字节跳动会坚持对内对外维护一套代码。为遵守长期投资承诺,其基础架构团队将Netpoll等与内部生态不耦合的项目直接迁移至CloudWeGo开源库,并调整了内部对开源库的依赖。对于需要将治理能力集成到微服务系统中的Kitex,基于其可扩展性,他们拆分了内外部代码,将Kitex的核心代码迁移到了开源库中,并在内部库中封装了一层shell来实现确保内部用户感知不到升级。集成内部治理功能的模块作为Kitex扩展保存在内部库中。字节跳动基础架构团队表示,未来经过内部验证稳定性的新特性,将继续迁移到开源库中。谈到CloudWeGo的未来规划,字节跳动基础设施团队表示:“CloudWeGo不仅仅是一个开源项目,它也是一个真正的超大规模企业级实践项目。通过开源,我们希望CloudWeGo能够丰富云原生社区的Golang工具体系,为更多的开发者和企业构建云原生的大规模分布式系统,提供现代的、资源高效的技术解决方案。“未来,他们将进一步推动CloudWeGo改进:继续开源其他内部项目。开源更多字节跳动常用的Golang项目,如HTTP框架Hertz、基于共享内存的IPC通信库ShmIPC等,为开发者提供更多场景的服务需求支持,逐步开源成熟稳定的特性,CloudWeGo主要项目提供对Byte内部微服务的支持,很多新特性还在内部验证中。序列化,支持非生成代码等。结合内外部用户需求,不断迭代。项目开源后,会根据开发者的需求进行迭代。例如,在过去的一个月里,团队收到了大量的请求来自开发者关于Protobuf的介绍。提供良好的支持,他们已经在准备Kitex对Protobuf的支持的性能优化。本文转自fromOSCHINA本文标题:字节跳动开源微服务中间件CloudWeGo本文地址:https://www.oschina.net/news/159372/bytedance-opensource-cloudwego信息来源:https://mp.weixin.qq。com/s/43yN06UUcia-yWdJ50ghrw