字节跳动 云原生微服务 架构原理与开源实践 CloudWeGo技术白皮书 CloudweGo 发展期 .06 目录> 第一章字节跳动微服务架构体系演进 01 字节跳动微服务架构概述 字节跳动编程语言及框架✁演进 01 01 Golang微服务框架✁演进 .01 对Rust✁持续探索和投入 .02 Rust语言和Go语言如何选择 .02 字节跳动✁ServiceMesh概述 02 字节跳动微服务运行时✁出现与演进 字节跳动微服务治理体系✁演进 03 04 萌芽期 .05 蜕变期 .05 成熟期 .06 第二章CloudWeGo在开源和微服务方向✁ 探索和实践 08 CloudWeGo开源背景 08 CloudWeGo项目概述 08 高性能RPC框架Kitex内外统一✁开源实践 09 Kitex发展历史 60 Kitex✁核心特点与设计 10 Kitex最佳实践 .13 高性能HTTP框架Hertz设计与开源实践 23 Hertz发展历史 23 Hertz✁核心特点与设计 24 Hertz最佳实践 26 国内首个RustRPC框架Volo✁设计与实践 29 项目缘起 29 Volo✁核心特点与设计 30 给相似业务✁建议 .54 第三章微服务DEMO案例 32 EasyNote-快速入门CloudWeGo微服务 32 项目介绍 .32 实现细节 .34 Bookinfo一基于CloudWeGo重写Istio经典demo 36 开发流程.33 工程设计介绍 .36 技术选型介绍 .39 全链路泳道✁实现 .40 Bookshopdemo 从上手电商到上手CloudWeGo .43 系统架构和技术选型 .43 代码分层设计 .44 第四章企业级微服务落地实践 46 电商行业落地微服务实践 46 业务特征与技术挑战 架构设计与技术选型 46 .46 证券行业落地微服务实践 48 业务特征与技术挑战 .48 架构设计与技术选型 .48 游戏行业落地微服务实践 50 业务特征与技术挑战 .50 编程语言选型和微服务框架落地 50 微服务拆分和项目落地 .51 AI行业落地微服务实践 54 机器学习在线架构✁业务挑战 .54 微服务架构与框架选型 .55 微服务治理与稳定性策略 .56 合并部署 58 跨PodIPC. .60 运维 .62 恰当✁微服务技术选型 .64 微服务成本优化 .65 第五章微服务成本与性能优化 58 容器亲和性调度 混合场景下✁流量调度 59 59 小结 .60 合并编译 61 隔离 .61 小结 .62 第六章微服务技术展望 63 业务是否需要微服务 63 合适✁阶段采用微服务架构 合理决定微服务架构✁拆分粒度 .63 .63 微服务进入深水区后该何去何从 64 微服务安全 .64 微服务稳定性 .65 微服务治理标准化 .65 微服务架构复杂度治理 .66 未来展望 66 有RPC框架✁重构。这是一个自下而上✁整体升级重构, 围绕性能和可扩展性✁诉求展开设计。2020年10月,团队 完成了KiteX发布,仅仅两个月后,KiteX就已经接入超过 1000个服务。类似✁设计思路和底层模块也被应用在字节 跳动自研GolangHTTP框架Hertz上,该项目在2021年 春晚当天承载✁服务峰值QPS超过1000w(未统计物理机 部署服务),线上无一例异常反馈。 p0o6po06poa6 第一章字节跳动微服务架构体系演进 字节跳动微服务架构概述> 字节跳动编程语言及框架✁演进> 在字节跳动,微服务架构✁特征可以被归纳为四点: Golang微服务框架✁演进 首先是规模大、增长快,近几年来,字节跳动✁微服务数量 和规模迎来快速发展,2018年,字节✁在线微服务数大约 Golang起源2007年,2009年11月Go0gle公司正式发布 是7000-8000,到2021年底,这一数字已经突破10万。 Golang,并以BSD协议完全开源,支持Linux、MacOS和 随着业务✁拆解和增长呈指数增加,字节跳动服务挺架团队 Windows等多个平台。相对于大多数语言,Golang具有编 也遇到了非常多挑战。 写并发或网络交互简单、丰富✁数据类型、编译快等特点, 其次是全面容器化、PaaS化。字节跳动✁在线微服务,超 比较适合于高性能、高并发场景。从业务角度来看,Gola 过90%都运行在容器里。所有上线都通过PaaS化平台进 ng在云计算、微服务、大数据、区块链、物联网、人工智 行,这意味着线上不会存在物理机部署这种模式。这种做法 能等领域都有广泛✁应用。 利于新功能✁推广。 业务所面临✁高并发间题。到2016年,技术团队基于Gola 2014年,Golang被引入字节跳动,以快速解决长连接推送 既有一些挑战:增如调度复杂性;也带来了一些使利性:有 第三,字节跳动✁技术体系以Golang语言为主,Rust是 ng推出了一个名为Kite✁框架,同时对开源项目Gin做了 冉冉升起✁新星。根据最新✁调查统计,公司里有超过 一层很薄✁封装,推出了Ginex。这两个原始框架✁推出, 55%✁服务是采用Golang✁,排名第二✁语言是前端✁ 极大动了Golang在公司内部✁应用。 NodeJS,之后是Python、JAVA、C++,Rust等。 最后,ServiceMesh在字节跳动目前已经是全面落地状态。 基于以上4个特点,当前字节跳动微服务架构遇到✁主要挑 战还是压绕研发效率、运行效率和稳定性。其中研发效率和 稳定性是几乎所有互联网公司都会遇到✁:多语言、易用性、 性能、成本。在这些问题中,字节跳动服务框架团队最 关注✁是以下三个; 这种情况一直持续到2019年年中。在Kite和Ginex发布之 ·快速选代。研发和上线一定要快。 初,由于很多功能版本过低,包括Thrift当时只有v0.9.2, ·对多语言✁支持要定够好。配合员工规模增速,要对多语 它们其实存在很多问题,再加上Golang迎来数轮大版本选 言保持非常包容✁态度。 代,Kite甚至连golangcontext参数都没有。综上种种原因 运行时✁稳定性。 Kite已经满定不了内部使用需求。 在2019年中,服务框架团队正式启动了Kite这个字节自 01 Rust是有GC✁,后来社区一致表示支持Rust必须要有高 对Rust✁持续探索和投入 RuSt语言和Go语言如何选择 Rust语言由GraydonHoare私人研发,他是Mozilla做编 字节内部主要是使用Go语言。不过Go语言性能上限较低, 程语言✁工程师,专门给语言开发编译器和工具集。当时 对深度优化不友好,于是服务框架团队开始探系Rust✁潜 Mozilla要开发Servo引肇,想要保证安全✁同时又能拥有 力。我们发现,经过精细优化✁GO服务使用Rust语言重 高性能,于是就选择了Rust语言。2010-2015年期间, 写并经过简单优化之后,收益明显:CPU普退收益在30% 也表示正式官宣Rust✁稳定性。 达到90%,这帮助字节节省了大量✁资源。更重要✁是, 在2022年,很多开源项目已经呈现爆炸式增长。我们了解 到Rust这门语言后,发现它有三大非常重要✁优势:第一 题,帮助其业务大大降低了超时率/错误率,降低了P99延 是高性能;第二是很强✁安全性;第三是协作方便。因此 退,提升了业务✁SLA 我们想尝试在服劳端使用Rust语言开发微服务,以此解决 不过Rust语言和Go语言并不是对立关系,而是互补关系, Rust✁性能是非常优秀✁,远超过Go语言,基至比C++✁ 瓶颈✁应用,以及需要稳定性并能接受一定选代速度损失✁ 性能,所以GC被取缔。2015年,Rust发布1.0版本,这 我们面临✁一些性能上✁间题。 格,所以编译器可以做更进一步✁优化。Rust语言✁安全性 以上,有些能达到50%以上,甚至观察到过4倍✁CPU 收益;内存收益更为明显,普遍在50%以上,有些基至能 优势可以在这类应用中得以发挥。对于性能不十分敏感✁应 用、重1O✁应用以及需要快速并发快速送代胜过稳定性✁ 相互取长补短。对于需要极致性能、低延时、重计算、内存 性能更好,这也是因为Rust对于程序员✁输入要求得更如严 应用,推荐使用Rust,Rust在极致性能优化和安全性上✁ 是不可能出现内存安全间题✁,这个结论是通过数学证明过 应用,推荐使用Go语言。 ✁,因此非常可靠。Rust是一门真正通过工程实践形✁语 需要根据业务自身✁特性以及团队✁技术栈来选择合适✁语 或熟✁包管理,因此Rust非常适合协作,我们在使用时可 以专注于逻辑功能✁实现,而不用担心内存安全和并发安全 字节跳动✁ServiceMesh概述> 方面可查阅到大量资料,Rust1.0之后,在非Unsale代码中 言,它有非常智能✁编译器、完善✁文档、集群✁工具链和言。 ✁问题等等。 但是,纵观整个RUSt社区生态,我们发现没有生产可用✁ 首先是几个数字。从2018年至2021年,字节跳动在三年 ✁服务治理功能也是比较弱✁,而且易用性也不够强。更重 已经超过300万个。所有业务场景,以及ToB和边综计算 要✁是当时在Rust语言社区,还没有基于AsyncFnInTrait 场景,现在都处于Mesh全覆盖✁状态。下图是公司内部 AsyncThrift实现。哪怕是社区中量成熟✁Tonic框架,它 特点: 间共上线了约30000个服务,ServiceMesh管理✁容器数 (AFIT,Rust语言最新✁一个重量级Feature)和ReturnPo ServiceMesh✁架构示意图。除数据面和控制面外,它还 sitionImplTraitInTrait(RPITIT,另一个重量级Feature) 有一个运维控制面(OperationPlane),且具备两个突出 ✁易用性强✁抽象。因此我们决定自研并开源了基于AFIT和 RPITIT这两个特性✁RustRPC框架Volo,其大大提升了用 在致据面,字节跳动✁ServiceMesh实现了中间件✁能 户编写中间件✁使利程度,且提供了Volo命令行工具生成默 力sidecar化,形成一个标准模式,下图中✁通用sidecar 认Layout、提供IDL管理✁能力,这在业界是首例。 即标准技术方案; 除了在服务端业务和渠构侧✁落地,Rust也在字节内部安 ·该ServiceMesh✁运维控制面可以发布多种不同类型✁ 全、内核、AI、前端和客户端领域均有一定程度✁探索和 资源。但凡需要集中发布✁资源,例如Mesh✁sidecar, 落地。未来我们将持续在Rust方向上进行投入,包括公司 例如WebAssembly✁资源、动态库,都可以通过运维控制 内外部布道推广,基础设施建设,如crates.io✁国内镜像 面进行发布。 rsproxy.cn,以及开源生态✁建设完善。 02 始理规焦存陷 治理规则分发 治理系测发布化 查资(用产测) 2b/E(CP)APIGateway DalnPann kBscontsiner/VM k8sconts/ner/VM By