您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[CloudWeGO]:字节跳动云原生微服务架构原理与开源实践 - 发现报告

字节跳动云原生微服务架构原理与开源实践

信息技术2023-11-06-CloudWeGOH***
AI智能总结
查看更多
字节跳动云原生微服务架构原理与开源实践

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