今天,字节跳动正式宣布开源 CloudWeGo 。这是一套以 Go 语言为核心、专注于微服务通信与治理的中间件集合,具有高性能、可扩展、高可靠的特点 。
项目地址:https://github.com/cloudwego
作为项目维护方,字节跳动基础架构团队已推进项目以 CloudWeGo 开源库为主进行迭代,未来,团队将坚持内外维护一套代码,统一迭代演进,并逐步分享更多内部微服务最佳实践 。
CloudWeGo 概述多年来,在亿级流量背后,字节跳动基础架构团队开发的技术底座支撑着庞大的微服务生态系统,从 2018 年至今,团队维护的在线微服务数量增长了近 600%,超过 5 万 。面对这样的规模和增速,提高性能、可扩展性和稳定性成了构建 CloudWeGo 的核心 。
CloudWeGo 第一批开源了四个项目,以 RPC 框架 Kitex 和网络库 Netpoll 为主,关于它们的技术实践,可以参考此前发布的两篇文章:《字节跳动 Go RPC 框架 KiteX 性能优化实践》《字节跳动在 Go 网络库上的实践》 。
KitexKitex 是一个 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点 。
字节跳动使用 Golang 作为主要业务开发语言 。早在 2016 年,基础架构团队就已经开始基于 Golang 开发内部框架 Kite,并在 2019 年围绕性能和可扩展启动重构,使其能更好地满足业务发展和技术体系演进需求 。
2020 年 10 月,Kitex 正式上线 。虽然是一个全新的框架,但经过一年的线上应用,目前字节跳动内部已有超过 50% 的 Golang 微服务迁移到了 Kitex 。
下面是 Kitex 的一些特性:
- 高性能:Kitex 默认集成自研网络库 Netpoll 作为网络传输模块,性能相较使用 go net 有显著优势;除了网络库带来的性能收益,Kitex 对 Thrift 编解码也做了优化,这在之前的性能优化实践文章中有介绍 。关于性能数据,可参考 https://github.com/cloudwego/kitex-benchmark 。
- 扩展性:Kitex 设计上做了模块划分,提供了较多的扩展接口以及默认的扩展实现,使用者也可以根据需要自行定制扩展 。Kitex 未耦合 Netpoll,开发者可选择其他网络库扩展使用 。
- 消息协议: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、Oneway、双向 Streaming 。其中 Oneway 目前只对 Thrift 协议支持,双向 Streaming 只对 gRPC 支持,后续会考虑支持 Thrift 的双向 Streaming 。
- 服务治理:支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成 。
- 代码生成工具:Kitex 内置代码生成工具,可支持生成 Thrift、Protobuf 以及脚手架代码 。
RPC 通常有较重的处理逻辑(业务逻辑、编解码),耗时长,不能像 redis 一样采用串行处理(必须异步) 。而 Go 的标准库 net 设计了 BIO(Blocking I/O) 模式的 API,为了保证异步处理,RPC 框架设计上需要为每个连接都分配一个 goroutine,这在空闲连接较多时,产生大量的空闲 goroutine,增加调度开销 。此外,net.Conn 没有提供检查连接活性的 API,很难设计出高效的连接池,池中的失效连接无法及时清理,复用低效 。开源社区目前缺少专注于 RPC 方案的 Go 网络库 。类似的项目如:evio、gnet 等,均面向 Redis、Haproxy 这样的场景 。
因此 Netpoll 应运而生,它借鉴了 evio 和 Netty 的优秀设计,具有出色的性能,更适用于微服务架构 。
ThriftgoThriftgo 是 Go 语言实现的 Thrift IDL 解析和代码生成器,支持完善的 Thrift IDL 语法和语义检查,相较 Apache Thrift 官方的 Golang 生成代码,Thriftgo 做了一些问题修复且支持插件机制,用户可根据需求自定义生成代码 。
Kitex 的代码生成工具就是 Thriftgo 的插件,CloudWeGo 近期也会开源另一个 Thriftgo 的插件 thrift-gen-validator,支持 IDL Validator,用于字段值校验,解决开发者需要自行实现代码校验逻辑的负担,弥补 Thrift 缺失的能力 。
推荐阅读
- 分流|重磅消息!25年首次教育大改革,5月1日正式“取消普职分流”
- 小米|小米MIUI重大调整!开发版切换正式版将无需清除数据
- 小米智能眼镜正式发布 小米发布智能眼镜概念新品
- SQL入门 | 如何查询数据?
- 小米|小米正式加入CCC董事会!推进数字车钥匙发展与应用
- 电影|终等来了!《阿凡达2》正式官宣 卡梅隆大作上映时间确定
- 门锁|首发2299元 萤石北斗星视频锁DL30V正式发布:配2K高清摄像头
- 戴尔|革命性CAMM DDR5内存正式发布:单条轻松128GB、还薄了57%
- 铁路正式工收入高吗?
- 婴儿囟门不跳动可正常