字节跳动 Golang RPC 框架的演进
-## Kite 的缺陷 +### Kite 的缺陷 Kite 作为字节跳动第一代 Golang RPC 框架,主要存在以下缺陷: @@ -36,33 +38,33 @@ Kite 作为字节跳动第一代 Golang RPC 框架,主要存在以下缺陷: 因此,业务的快速发展和需求场景的多样化,催生了新一代 Golang RPC 框架 [Kitex][Kitex]。 -## Kitex +### Kitex [Kitex][Kitex] 的架构主要包括四个部分:Kitex Tool、Kitex Core、Kitex Byted、Second Party Pkg。 -* Kitex Core 是一个携带了一套微服务治理功能的 RPC 框架,它是 [Kitex][Kitex] 的核心部分。 -* Kitex Byted 是一套结合了字节跳动内部基础设施的拓展集合。通过这一套拓展集合,[Kitex][Kitex] 能够在内部支持业务的发展。 -* Kitex Tool 是一个命令行工具,能够在命令行生成我们的代码以及服务的脚手架,可以提供非常便捷的开发体验。 -* Second Party Pkg,例如 [Netpoll][Netpoll], Netpoll-http2,是 [Kitex][Kitex] 底层的网络库,这两个库也开源在 CloudWeGo 组织中。 +- Kitex Core 是一个携带了一套微服务治理功能的 RPC 框架,它是 [Kitex][Kitex] 的核心部分。 +- Kitex Byted 是一套结合了字节跳动内部基础设施的拓展集合。通过这一套拓展集合,[Kitex][Kitex] 能够在内部支持业务的发展。 +- Kitex Tool 是一个命令行工具,能够在命令行生成我们的代码以及服务的脚手架,可以提供非常便捷的开发体验。 +- Second Party Pkg,例如 [Netpoll][Netpoll], Netpoll-http2,是 [Kitex][Kitex] 底层的网络库,这两个库也开源在 CloudWeGo 组织中。 ![image](/img/blog/Evolution_Kitex_High-performance/Architecture_design.png) +Kitex 的架构设计
总的来说, [Kitex][Kitex] 主要有五个特点:面向开源、功能丰富、灵活可拓展、支持多协议、高性能。 -## 面向开源 +### 面向开源 由于之前已经体验过了 Kite 维护的各种问题,我们在立项之初就考虑到了未来可能会开源 [Kitex][Kitex]。因此,我们设计的第一个宗旨就是不将 [Kitex][Kitex] 和公司内部的基础设施进行强耦合或者硬编码绑定。 Kitex Core 是一个非常简洁的框架,公司内部的所有基础设施都以拓展的方式注入到 Kitex Core 里。即使我们现在已经开源了,它也以这种形式存在。 公司内部基础设施的更新换代,和 [Kitex][Kitex] 自身的迭代是相互独立的,这对于业务来说是非常好的体验。同时,在 [Kitex][Kitex] 的接口设计上,我们使用了 Golang 经典的 Option 模式, 它是可变参数,通过 Option 能够提供各种各样的功能,这为我们的开发和业务的使用都带来了非常大的灵活性。 -## Kitex 的功能特性 - -### 治理能力 +### Kitex 的功能特性 +#### 治理能力 [Kitex][Kitex] 内置了丰富的服务治理能力,例如超时熔断、重试、负载均衡、泛化调用、数据透传等功能。业务或者外部的用户使用 [Kitex][Kitex] 都是可以开箱即用的。 如果你有非常特殊的需求,你也可以通过我们的注入点去进行定制化操作,比如你可以自定义中间件去过滤或者拦截请求,定义跟踪器去注入日志、去注入服务发现等。 @@ -81,37 +83,40 @@ Kitex Core 是一个非常简洁的框架,公司内部的所有基础设施都 业务方使用时,不需要感知很多东西去配置,只需要添加一个 Suite 就足够了,这点非常方便一些中台方或者第三方去做定制。 ![image](/img/blog/Evolution_Kitex_High-performance/Suite.png) +示例
-### 多协议 +#### 多协议 [Kitex][Kitex] 网络层基于高性能网络库 [Netpoll][Netpoll] 实现。在 [Netpoll][Netpoll] 上,我们构建了 Thrift 和 Netpoll-http2;在 Thrift 上,我们还做了一些特殊的定制,例如,支持 Thrift 的泛化调用,还有基于 Thrift 的连接多路复用。 ![image](/img/blog/Evolution_Kitex_High-performance/Multi-protocol.png) +多协议
-### 代码生成工具 +#### 代码生成工具 和 [Kitex][Kitex] 一同出现的,还有我们开发的一个简单易用的命令行工具 kitex。如果我们写了一个 IDL,只需要提供一个 module 参数和一个服务名称,kitex 就会为你生成服务代码脚手架。 目前 [Kitex][Kitex] 支持了 Protobuf 和 Thrift 这两种 IDL 的定义。命令行工具内置丰富的选项,可以进行项目代码定制;同时,它底层依赖 Protobuf 官方的编译器,和我们自研的 Thriftgo 的编译器,两者都支持自定义的生成代码插件。 -## Kitex 的性能表现 +### Kitex 的性能表现 字节跳动内部 RPC 框架使用的协议主要都是基于 Thrift,所以我们在 Thrift 上深耕已久。结合自研的 [Netpoll][Netpoll] 能力,它可以直接暴露底层连接的 buffer。 在此基础上,我们设计出了 FastRead/FastWrite 编解码实现,测试发现它具有远超过 apache thrift 生成代码的性能。整体而言,[Kitex][Kitex] 的性能相当不错,今年 1 月份的数据如下图所示, 可以看到,[Kitex][Kitex] 在使用 Thrift 作为 Payload 的情况下,性能优于官方 gRPC,吞吐接近 gRPC 的两倍;此外,在 [Kitex][Kitex] 使用定制的 Protobuf 协议时,性能也优于 gRPC。 ![image](/img/blog/Evolution_Kitex_High-performance/Kitex_gRPC.png) +Kitex/gRPC 性能对比(2022 年 1 月数据)
-## Kitex:一个 demo +### Kitex:一个 demo 下面简单演示一下 [Kitex][Kitex] 是如何开发一个服务的。 @@ -119,6 +124,7 @@ Kitex/gRPC 性能对比(2022 年 1 月数据) 编写完这个 demo.thrift 文件之后,就可以使用 [Kitex][Kitex] 在命令行生成指定的生成代码。如图所示,只需要传入 module name,service name 和目标 IDL 就行了。 ![image](/img/blog/Evolution_Kitex_High-performance/IDL.png) +定义 IDL
@@ -127,11 +133,13 @@ Kitex/gRPC 性能对比(2022 年 1 月数据) 接下来需要通过 go mod tidy 把依赖拉下来,然后用 build.sh 构建,就可以启动服务了。[Kitex][Kitex] 默认的接听端口是 8888。 ![image](/img/blog/Evolution_Kitex_High-performance/Handler.png) +定义 Handler 方法
![image](/img/blog/Evolution_Kitex_High-performance/Compile_run.png) +编译、运行
@@ -140,24 +148,26 @@ Kitex/gRPC 性能对比(2022 年 1 月数据) 这里同样是 import 刚刚生成的生成代码,创建 Client、指定服务名字、构成相应的参数,填上“ Hello,word!” ,然后就可以调用了。 ![image](/img/blog/Evolution_Kitex_High-performance/Client.png) +编写 Client
-# Kitex 在字节内部的落地 +## Kitex 在字节内部的落地 -## 与内部基础设施的集成 +### 与内部基础设施的集成 谈到落地,第一步就是 [Kitex][Kitex] 和字节跳动内部的基础设施进行结合。字节跳动内部的所有基础设施都是以依赖的方式注入到 [Kitex][Kitex] 的。 我们将日志、监控、tracing 都定义为 tracer,然后通过 WithTracer 这个 Option 将其注入到 [Kitex][Kitex] 里;服务发现是 WithResolver;Service Mesh 则是 WithProxy 等。 字节跳动内部的基础设施都是通过 Option 被注入到 [Kitex][Kitex] 的,而且所有的 Option 都是通过前面说的 Suite 打包,简单地添加到业务的代码里完成。 ![image](/img/blog/Evolution_Kitex_High-performance/Integration.png) +与内部基础设施的集成
-## 内部落地的经典案例:合并部署 +### 内部落地的经典案例:合并部署 这里介绍一个内部落地的经典案例:合并部署。其背景是,在开发微服务时,由于业务拆分和业务场景的多样化,微服务容易出现过微的情况。 当服务数量越来越多,网络传输和序列化开销就会越来越大,变得不可忽视。因此,[Kitex][Kitex] 框架需要考虑如何减小网络传输和序列化的开销。 @@ -172,22 +182,23 @@ Kitex/gRPC 性能对比(2022 年 1 月数据) 那么,它的效果如何呢?在 2021 年的实践过程中,我们对抖音的某个服务约 30% 的流量进行了合并,服务端的 CPU 的消耗减少了 19%, TP99 延迟下降到 29%,效果相当显著。 ![image](/img/blog/Evolution_Kitex_High-performance/Merge_deployment.png) +内部落地的经典案例:合并部署
-## 微服务框架推进的痛点 +### 微服务框架推进的痛点 -* 升级慢 +- 升级慢 大家可能好奇 [Kitex][Kitex] 在字节跳动内部推广是不是很顺畅?其实并不是。作为一个相对而言比较新的框架, [Kitex][Kitex] 和其它新生项目一样,在推广的过程中都会遇到同样的问题。 特别是, [Kitex][Kitex] 作为一个 RPC 框架,我们提供给用户的其实是一个代码的 SDK, 我们的更新是需要业务方的用户去感知、升级、部署上线,才能最终体现在他们的服务逻辑里,因此具有升级慢的问题。 -* 召回慢 +- 召回慢 同时,因为代码都是由研发人员编写,如果代码出现了 bug,我们就需要及时地去感知定位问题,通知负责人去更新版本。因此,会有召回慢的问题。 -* 问题排查困难 +- 问题排查困难 业务方的用户在写代码时,他们其实往往关注的是自己的业务逻辑,他们不会深入理解一个框架内部的实现。所以如果出现问题,他们往往会不知所措,需要依赖我们的业务同学才能进行相应的问题排查。所以会有问题排查困难的问题。 @@ -207,31 +218,31 @@ Kitex/gRPC 性能对比(2022 年 1 月数据) ![image](/img/blog/Evolution_Kitex_High-performance/Number_of_AccessServices.png) -# Kitex 的开源实践 +## Kitex 的开源实践 开源工作主要包括代码、文档和社区运营三个层面。 **代码层面** -* 代码拆分、脱敏; -* 内部仓库引用开源仓库,避免内外多副本同时维护; -* 在开源过程中确保内部用户平滑切换、体验无损; +- 代码拆分、脱敏; +- 内部仓库引用开源仓库,避免内外多副本同时维护; +- 在开源过程中确保内部用户平滑切换、体验无损; **文档层面** -* 重新梳理用户文档,覆盖方方面面; -* 建立详尽的用例仓库(CloudWeGo/Kitex-examples)。 +- 重新梳理用户文档,覆盖方方面面; +- 建立详尽的用例仓库(CloudWeGo/Kitex-examples)。 **社区运营** -* 官网建设; -* 组建用户群,进行答疑解惑; -* 飞书机器人对接 Github 的 Issue 管理、PR 管理之类的业务,可以快速响应; -* 对优秀贡献者进行奖励。 +- 官网建设; +- 组建用户群,进行答疑解惑; +- 飞书机器人对接 Github 的 Issue 管理、PR 管理之类的业务,可以快速响应; +- 对优秀贡献者进行奖励。 在以上努力下,[CloudWeGo/Kitex](https://github.com/cloudwego/kitex) 仓库目前收获了 4.1k+ stars;[kitex-contrib](https://github.com/kitex-contrib) 获得多个外部用户贡献的仓库;CloudWeGo 飞书用户群近 950 个用户…… -# 未来展望 +## 未来展望 首先,我们仍然会持续向开源社区反馈最新的技术进展。例如在 Thrift 协议上,虽然对 Thrift 的编解码已经做到非常极致的优化了,我们还在探索利用 JIT 手段来提供更多的性能提升; 在 Protobuf 上,我们会补足短板,将在 Thrift 方面的优化经验迁移到 Protobuf 上,对 Protobuf 的生成代码和编解码进行优化; [Kitex][Kitex] 后续也会进一步融入云原生社区,所以也在考虑支持 xDS 协议。 diff --git a/content/zh/blog/news/Go_HTTP_Hertz_Design/index.md b/content/zh/blog/news/Go_HTTP_Hertz_Design/index.md index 5b4e24e310..95a4e99829 100644 --- a/content/zh/blog/news/Go_HTTP_Hertz_Design/index.md +++ b/content/zh/blog/news/Go_HTTP_Hertz_Design/index.md @@ -1,6 +1,7 @@ --- date: 2022-06-21 title: "字节跳动开源 Go HTTP 框架 Hertz 设计实践" +projects: ["Hertz"] linkTitle: "字节跳动开源 Go HTTP 框架 Hertz 设计实践" keywords: ['Go', 'HTTP', 'Hertz', '架构设计', "功能特性"] description: "本文介绍了字节跳动开源 Go HTTP 框架 Hertz 的项目起源、架构设计、功能特性以及性能表现。" diff --git a/content/zh/blog/news/Hertz_Benchmark/index.md b/content/zh/blog/news/Hertz_Benchmark/index.md index 7b2cdfbe02..5905095e52 100644 --- a/content/zh/blog/news/Hertz_Benchmark/index.md +++ b/content/zh/blog/news/Hertz_Benchmark/index.md @@ -1,6 +1,7 @@ --- date: 2023-02-24 title: "HTTP 框架 Hertz 实践入门:性能测试指南" +projects: ["Hertz"] linkTitle: "HTTP 框架 Hertz 实践入门:性能测试指南" keywords: ["CloudWeGo", "Hertz", "HTTP 框架", "性能测试"] description: "本文旨在分享开发者在压测 Hertz 需要了解的场景和技术问题,并且基于当前最新版本对多个框架进行了压测对比,提供了性能参考数据,有助于用户更好地结合真实 HTTP 场景对 Hertz 进行调优,使之更贴合业务需要、发挥最佳性能。" diff --git a/content/zh/blog/news/Hertz_Open_Source/index.md b/content/zh/blog/news/Hertz_Open_Source/index.md index 7ca381c09c..e34fbe9f0b 100644 --- a/content/zh/blog/news/Hertz_Open_Source/index.md +++ b/content/zh/blog/news/Hertz_Open_Source/index.md @@ -1,6 +1,7 @@ --- date: 2022-06-21 title: "超大规模的企业级微服务 HTTP 框架 — Hertz 正式开源!" +projects: ["Hertz"] linkTitle: "超大规模的企业级微服务 HTTP 框架 — Hertz 正式开源!" keywords: ["hertz", "微服务", "http", "go", "golang", "开源"] description: "本文介绍了字节跳动正式开源超大规模的企业级微服务 HTTP 框架 — Hertz。" diff --git a/content/zh/blog/news/Hertz_Stream_Based_Design/index.md b/content/zh/blog/news/Hertz_Stream_Based_Design/index.md index 478de2a9cc..98ba7a8ad3 100644 --- a/content/zh/blog/news/Hertz_Stream_Based_Design/index.md +++ b/content/zh/blog/news/Hertz_Stream_Based_Design/index.md @@ -1,6 +1,7 @@ --- date: 2023-08-02 title: "Hertz 支持 QUIC & HTTP/3" +projects: ["Hertz"] linkTitle: "Hertz 支持 QUIC & HTTP/3" keywords: ['Go', 'Hertz', 'QUIC', 'HTTP/3', '接口设计'] description: "本文介绍了 Hertz 为支持 QUIC & HTTP/3 在网络传输层和协议层提供的接口设计方案。" diff --git a/content/zh/blog/news/Kitex_Proxyless_OpenTelemetry/index.md b/content/zh/blog/news/Kitex_Proxyless_OpenTelemetry/index.md index 47ca0cb488..b1d9619875 100644 --- a/content/zh/blog/news/Kitex_Proxyless_OpenTelemetry/index.md +++ b/content/zh/blog/news/Kitex_Proxyless_OpenTelemetry/index.md @@ -1,6 +1,7 @@ --- date: 2022-11-08 title: "Kitex Proxyless 之流量路由:配合 Istio 与 OpenTelemetry 实现全链路泳道" +projects: ["Kitex"] linkTitle: "Kitex Proxyless 之流量路由:配合 Istio 与 OpenTelemetry 实现全链路泳道" keywords: ["CloudWeGo", "Proxyless", "流量路由", "全链路泳道", "Bookinfo"] description: "本文主要介绍了基于 Kitex Proxyless 实现流量路由,从而在 biz-demo 中使用 Kitex 和 Hertz 重写 bookinfo 项目,实现的目的是以实战的方式演示如何使用 xDS 实现全链路的流量泳道。" diff --git a/content/zh/blog/news/Kitex_perf_optimize_practices/index.md b/content/zh/blog/news/Kitex_perf_optimize_practices/index.md index 0fc4497548..c48c495412 100644 --- a/content/zh/blog/news/Kitex_perf_optimize_practices/index.md +++ b/content/zh/blog/news/Kitex_perf_optimize_practices/index.md @@ -1,6 +1,7 @@ --- date: 2021-09-23 title: "字节跳动 Go RPC 框架 Kitex 性能优化实践" +projects: ["Kitex"] linkTitle: "字节跳动 Go RPC 框架 Kitex 性能优化实践" keywords: ["Kitex", "性能优化", "Netpoll", "Thrift", "序列化"] description: "本文介绍了字节跳动 Go RPC 框架 Kitex 的性能优化实践,包括 Netpoll、Thrift、序列化等方面的优化。" diff --git a/content/zh/blog/news/Kitex_performance_testing/index.md b/content/zh/blog/news/Kitex_performance_testing/index.md index f635db8ef8..a2ef44416d 100644 --- a/content/zh/blog/news/Kitex_performance_testing/index.md +++ b/content/zh/blog/news/Kitex_performance_testing/index.md @@ -1,6 +1,7 @@ --- date: 2021-11-24 title: "RPC 框架 Kitex 实践入门:性能测试指南" +projects: ["Kitex"] linkTitle: "RPC 框架 Kitex 实践入门:性能测试指南" keywords: ["Kitex", "性能测试", "压测", "RPC"] description: "本文介绍了如何使用 Kitex 进行性能测试,以及如何分析测试结果,有助于用户更好地结合真实 RPC 场景对 Kitex 进行调优,使之更贴合业务需要、发挥最佳性能。" diff --git a/content/zh/blog/news/Microservices_OpenSource_CloudWeGo/index.md b/content/zh/blog/news/Microservices_OpenSource_CloudWeGo/index.md index ef0b71b776..629c282674 100644 --- a/content/zh/blog/news/Microservices_OpenSource_CloudWeGo/index.md +++ b/content/zh/blog/news/Microservices_OpenSource_CloudWeGo/index.md @@ -1,8 +1,9 @@ --- date: 2022-05-26 title: "从 CloudWeGo 谈云原生时代的微服务与开源" +projects: ["CloudWeGo"] linkTitle: "从 CloudWeGo 谈云原生时代的微服务与开源" -keywords: ["CloudWeGo","微服务","开源"] +keywords: ["CloudWeGo", "微服务", "开源"] description: "本文将从 CloudWeGo 的角度,介绍云原生时代的微服务与开源的关系,以及 CloudWeGo 在微服务开源领域的探索与实践。" author: GuangmingLuo --- @@ -32,10 +33,10 @@ CloudWeGo 是字节跳动基础架构团队开源出来的项目,它是一套 CloudWeGo 在第一阶段开源了四个项目: -* [Kitex][Kitex]:高性能、强可扩展的 Golang RPC 框架 -* [Netpoll][Netpoll]:高性能、I/O 非阻塞、专注于 RPC 场景的网络框架 -* [Thriftgo][Thriftgo]:Golang 实现的 thrift 编译器,支持插件机制和语义检查 -* Netpoll-http2:基于 [Netpoll][Netpoll] 的 HTTP/2 实现 +- [Kitex][Kitex]:高性能、强可扩展的 Golang RPC 框架 +- [Netpoll][Netpoll]:高性能、I/O 非阻塞、专注于 RPC 场景的网络框架 +- [Thriftgo][Thriftgo]:Golang 实现的 thrift 编译器,支持插件机制和语义检查 +- Netpoll-http2:基于 [Netpoll][Netpoll] 的 HTTP/2 实现 除了这几个主要项目外,CloudWeGo 紧随其后陆续开源了 [**Kitex-benchmark**](https://github.com/cloudwego/kitex-benchmark)、[**Netpoll-benchmark**](https://github.com/cloudwego/netpoll-benchmark)、 [**Thrift-gen-validator**](https://github.com/cloudwego/thrift-gen-validator)、[**Kitex-examples**](https://github.com/cloudwego/kitex-examples) 、[**Netpoll-examples**](https://github.com/cloudwego/netpoll-examples)等项目。 @@ -43,7 +44,7 @@ CloudWeGo 在第一阶段开源了四个项目: 鉴于文章篇幅有限,下文将重点介绍 CloudWeGo 核心项目 [Kitex][Kitex]。 从**演进历史**来看,2014 年,字节跳动技术团队引入 Golang 解决长连接推送业务面临的高并发问题,两年后,内部技术团队基于 Golang 推出了一个名为 Kite 的框架,同时对开源项目 Gin 做了一层很薄的封装,推出了 Ginex。 -这两个框架极大推动了 Golang 在公司内部的应用。此后,围绕性能和可扩展性设计,字节跳动重构 Kite,并在次年 10 月完成并发布Kitex,投入到内部应用中。据悉,截至 2021 年 9 月,线上有 3w+ 微服务使用 Kitex,大部分服务迁移新框架后可以收获 CPU 和延迟上的收益。 +这两个框架极大推动了 Golang 在公司内部的应用。此后,围绕性能和可扩展性设计,字节跳动重构 Kite,并在次年 10 月完成并发布 Kitex,投入到内部应用中。据悉,截至 2021 年 9 月,线上有 3w+ 微服务使用 Kitex,大部分服务迁移新框架后可以收获 CPU 和延迟上的收益。 ![image](/img/blog/Microservices_Open_CloudWeGo/Framework.PNG) @@ -55,13 +56,13 @@ CloudWeGo 在第一阶段开源了四个项目: ![image](/img/blog/Microservices_Open_CloudWeGo/Functions_Features.PNG) -* **高性能**:网络传输模块 [Kitex][Kitex] 默认集成了自研的网络库 [Netpoll][Netpoll],性能相较使用 go net 有显著优势;除了网络库带来的性能收益,[Kitex][Kitex] 对 Thrift 编解码也做了深度优化。关于性能数据可参考 [kitex-benchmark](https://github.com/cloudwego/kitex-benchmark)。 -* **扩展性**:[Kitex][Kitex] 设计上做了模块划分,提供了较多的扩展接口以及默认的扩展实现,使用者也可以根据需要自行定制扩展,更多扩展能力参见 CloudWeGo [官网文档](https://www.cloudwego.io/zh/docs/kitex/tutorials/framework-exten/)。[Kitex][Kitex] 也并未耦合 [Netpoll][Netpoll],开发者也可以选择其它网络库扩展使用。 -* **消息协议**:RPC 消息协议默认支持 Thrift、Kitex Protobuf、gRPC。Thrift 支持 Buffered 和 Framed 二进制协议;Kitex Protobuf 是 [Kitex][Kitex] 自定义的 Protobuf 消息协议,协议格式类似 Thrift;gRPC 是对 gRPC 消息协议的支持,可以与 gRPC 互通。除此之外,使用者也可以扩展自己的消息协议。 -* **传输协议**:传输协议封装消息协议进行 RPC 互通,传输协议可以额外透传元信息,用于服务治理,[Kitex][Kitex] 支持的传输协议有 TTHeader、HTTP2。TTHeader 可以和 Thrift、Kitex Protobuf 结合使用;HTTP2 目前主要是结合 gRPC 协议使用,后续也会支持 Thrift。 -* **多消息类型**:支持 PingPong、Oneway、双向 Streaming。其中 Oneway 目前只对 Thrift 协议支持,双向 Streaming 只对 gRPC 支持,后续会考虑支持 Thrift 的双向 Streaming。 -* **服务治理**:支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。 -* **[Kitex][Kitex] 内置代码生成工具,可支持生成 Thrift、Protobuf 以及脚手架代码**。原生的 Thrift 代码由本次一起开源的 [Thriftgo][Thriftgo] 生成,[Kitex][Kitex] 对 Thrift 的优化由 Kitex Tool 作为插件支持。Protobuf 代码由 Kitex 作为官方 protoc 插件生成 ,目前暂未单独支持 Protobuf IDL 的解析和代码生成。 +- **高性能**:网络传输模块 [Kitex][Kitex] 默认集成了自研的网络库 [Netpoll][Netpoll],性能相较使用 go net 有显著优势;除了网络库带来的性能收益,[Kitex][Kitex] 对 Thrift 编解码也做了深度优化。关于性能数据可参考 [kitex-benchmark](https://github.com/cloudwego/kitex-benchmark)。 +- **扩展性**:[Kitex][Kitex] 设计上做了模块划分,提供了较多的扩展接口以及默认的扩展实现,使用者也可以根据需要自行定制扩展,更多扩展能力参见 CloudWeGo [官网文档](https://www.cloudwego.io/zh/docs/kitex/tutorials/framework-exten/)。[Kitex][Kitex] 也并未耦合 [Netpoll][Netpoll],开发者也可以选择其它网络库扩展使用。 +- **消息协议**:RPC 消息协议默认支持 Thrift、Kitex Protobuf、gRPC。Thrift 支持 Buffered 和 Framed 二进制协议;Kitex Protobuf 是 [Kitex][Kitex] 自定义的 Protobuf 消息协议,协议格式类似 Thrift;gRPC 是对 gRPC 消息协议的支持,可以与 gRPC 互通。除此之外,使用者也可以扩展自己的消息协议。 +- **传输协议**:传输协议封装消息协议进行 RPC 互通,传输协议可以额外透传元信息,用于服务治理,[Kitex][Kitex] 支持的传输协议有 TTHeader、HTTP2。TTHeader 可以和 Thrift、Kitex Protobuf 结合使用;HTTP2 目前主要是结合 gRPC 协议使用,后续也会支持 Thrift。 +- **多消息类型**:支持 PingPong、Oneway、双向 Streaming。其中 Oneway 目前只对 Thrift 协议支持,双向 Streaming 只对 gRPC 支持,后续会考虑支持 Thrift 的双向 Streaming。 +- **服务治理**:支持服务注册/发现、负载均衡、熔断、限流、重试、监控、链路跟踪、日志、诊断等服务治理模块,大部分均已提供默认扩展,使用者可选择集成。 +- **[Kitex][Kitex] 内置代码生成工具,可支持生成 Thrift、Protobuf 以及脚手架代码**。原生的 Thrift 代码由本次一起开源的 [Thriftgo][Thriftgo] 生成,[Kitex][Kitex] 对 Thrift 的优化由 Kitex Tool 作为插件支持。Protobuf 代码由 Kitex 作为官方 protoc 插件生成 ,目前暂未单独支持 Protobuf IDL 的解析和代码生成。 简单总结一下,CloudWeGo 不仅仅是一个开源的项目,也是一个真实的、超大规模的**企业级**最佳实践。它源自企业,所以天生就适合在企业内部落地;它源自开源,最终也拥抱了开源,从 Go 基础库,到 Go 网络库和 Thrift 编译器,再到上层的服务框架,以及框架拥有的所有企业级治理能力,均对外开放开源。 @@ -103,11 +104,11 @@ CloudWeGo 在第一阶段开源了四个项目: [Kitex][Kitex] 大部分服务治理模块都是通过 Middleware 集成,熔断也是一样。[Kitex][Kitex] 提供了一套 CBSuite,封装了服务粒度的熔断器和实例粒度的熔断器。 -* **服务粒度熔断**:按照服务粒度进行熔断统计,通过 WithMiddleware 添加。服务粒度的具体划分取决于 Circuit Breaker Key,即熔断统计的 Key,初始化 CBSuite 时需要传入 **GenServiceCBKeyFunc**。 +- **服务粒度熔断**:按照服务粒度进行熔断统计,通过 WithMiddleware 添加。服务粒度的具体划分取决于 Circuit Breaker Key,即熔断统计的 Key,初始化 CBSuite 时需要传入 **GenServiceCBKeyFunc**。 默认提供的是 `circuitbreaker.RPCInfo2Key`,该 Key 的格式是 `fromServiceName/toServiceName/method`,即按照方法级别的异常做熔断统计。 -* **实例粒度熔断**:按照实例粒度进行熔断统计,主要用于解决单实例异常问题,如果触发了实例级别熔断,框架会自动重试。 +- **实例粒度熔断**:按照实例粒度进行熔断统计,主要用于解决单实例异常问题,如果触发了实例级别熔断,框架会自动重试。 -**熔断器的思路很简单根据 RPC 成功或失败的情况,限制对下游的访问**。通常熔断器分为三个时期:CLOSED、OPEN、HALFOPEN。当RPC 正常时,为 CLOSED; +**熔断器的思路很简单根据 RPC 成功或失败的情况,限制对下游的访问**。通常熔断器分为三个时期:CLOSED、OPEN、HALFOPEN。当 RPC 正常时,为 CLOSED; 当 RPC 错误增多时,熔断器会被触发,进入 OPEN;OPEN 后经过一定的冷却时间,熔断器变为 HALFOPEN;HALFOPEN 时会对下游进行一些有策略的访问, 然后根据结果决定是变为 CLOSED,还是 OPEN。总的来说三个状态的转换大致如下图: @@ -135,8 +136,8 @@ CloudWeGo 在第一阶段开源了四个项目: [Kitex][Kitex] 提供三类重试:超时重试、Backup Request,建连失败重试。其中建连失败是网络层面问题,由于请求未发出,框架会默认重试,下面重点介绍前两类重试的使用。需要注意的是,因为很多的业务请求不具有**幂等性**,这两类重试不会作为默认策略,用户需要按需开启。 -* **超时重试**:错误重试的一种,即客户端收到超时错误的时候,发起重试请求。 -* **Backup Request**:客户端在一段时间内还没收到返回,发起重试请求,任一请求成功即算成功。Backup Request 的等待时间 `RetryDelay` 建议配置为 TP99,一般远小于配置的超时时间 `Timeout`。 +- **超时重试**:错误重试的一种,即客户端收到超时错误的时候,发起重试请求。 +- **Backup Request**:客户端在一段时间内还没收到返回,发起重试请求,任一请求成功即算成功。Backup Request 的等待时间 `RetryDelay` 建议配置为 TP99,一般远小于配置的超时时间 `Timeout`。 ![image](/img/blog/Microservices_Open_CloudWeGo/Timeout.png) @@ -150,14 +151,14 @@ CloudWeGo 在第一阶段开源了四个项目: [Kitex][Kitex] 默认提供了两种负载均衡算法实现: -* **WeightedRandom**:这个算法使用的是基于权重的随机策略,也是 [Kitex][Kitex] 的默认策略。它会依据实例的权重进行加权随机,并保证每个实例分配到的负载和自己的权重成比例。 -* **ConsistentHash**:一致性哈希主要适用于对上下文(如实例本地缓存)依赖程度高的场景,如希望同一个类型的请求打到同一台机器,则可使用该负载均衡方法。 +- **WeightedRandom**:这个算法使用的是基于权重的随机策略,也是 [Kitex][Kitex] 的默认策略。它会依据实例的权重进行加权随机,并保证每个实例分配到的负载和自己的权重成比例。 +- **ConsistentHash**:一致性哈希主要适用于对上下文(如实例本地缓存)依赖程度高的场景,如希望同一个类型的请求打到同一台机器,则可使用该负载均衡方法。 ConsistentHash 在使用时,需要注意如下事项: -* 下游节点发生变动时,一致性哈希结果可能会改变,某些 Key 可能会发生变化; -* 如果下游节点非常多,第一次冷启动时 Build 时间可能会较长,如果 RPC 超时短的话可能会导致超时; -* 如果第一次请求失败,并且 Replica 不为 0,那么会请求到 Replica 上;而第二次及以后仍然会请求第一个实例。 +- 下游节点发生变动时,一致性哈希结果可能会改变,某些 Key 可能会发生变化; +- 如果下游节点非常多,第一次冷启动时 Build 时间可能会较长,如果 RPC 超时短的话可能会导致超时; +- 如果第一次请求失败,并且 Replica 不为 0,那么会请求到 Replica 上;而第二次及以后仍然会请求第一个实例。 ### **可观测性** @@ -187,10 +188,10 @@ ConsistentHash 在使用时,需要注意如下事项: 此外,在大规模场景下,针对服务治理新功能的研发需求决策,我们往往还需要考虑以下因素: -* **性能:** 大部分业务很在意,也是团队一直努力的重点; -* **普遍性**:需要评估是不是所有业务都需要的能力; -* **简洁**: 通俗说,我们不太希望引入太多的线上问题或者太复杂的使用说明文档; -* **ROI**:功能迭代、产品升级需要考虑整体投资回报率。 +- **性能:** 大部分业务很在意,也是团队一直努力的重点; +- **普遍性**:需要评估是不是所有业务都需要的能力; +- **简洁**: 通俗说,我们不太希望引入太多的线上问题或者太复杂的使用说明文档; +- **ROI**:功能迭代、产品升级需要考虑整体投资回报率。 ## **04 CloudWeGo 的开源之路** @@ -239,7 +240,6 @@ CloudWeGo 在 2021 年底收录进入 CNCF Landscape,丰富了 CNCF 在 RPC 从功能研发计划来看,以 [Kitex][Kitex] 为例,将继续以内外部用户需求为驱动力,持续开发新的功能并迭代完善已有的功能。其中,包括支持连接预热、自定义异常重试、对 Protobuf 支持的性能优化,支持 xDS 协议等。 - 从开源生态来看,目前 [Kitex][Kitex] 已经完成了诸多开源项目的对接,未来也将会按需支持更多开源生态。 此外,CloudWeGo 也在和国内外主流公有云厂商进行合作对接,提供开箱即用、稳定可靠的微服务托管与治理产品的基座;CloudWeGo 也积极与国内外软件基金会开展合作和交流,探索新的合作模式。 diff --git a/content/zh/blog/news/Monoio_Open_Source/index.md b/content/zh/blog/news/Monoio_Open_Source/index.md index cab901802b..a3f65099e2 100644 --- a/content/zh/blog/news/Monoio_Open_Source/index.md +++ b/content/zh/blog/news/Monoio_Open_Source/index.md @@ -1,6 +1,7 @@ --- date: 2023-04-17 title: "字节开源 Monoio :基于 io-uring 的高性能 Rust Runtime" +projects: ["Monoio"] linkTitle: "字节开源 Monoio :基于 io-uring 的高性能 Rust Runtime" keywords: ["CloudWeGo", "Monoio", "io-uring", "开源", "Rust"] description: "本文介绍了 Rust 异步机制、Monoio 的设计概要、Runtime 对比选型和应用等。" @@ -8,13 +9,16 @@ author: CloudWeGo Rust Te --- ## 概述 + 尽管 Tokio 目前已经是 Rust 异步运行时的事实标准,但要实现极致性能的网络中间件还有一定距离。为了这个目标,[CloudWeGo][CloudWeGo] Rust Team 探索基于 io-uring 为 Rust 提供异步支持,并在此基础上研发通用网关。 本文包括以下内容: + 1. 介绍 Rust 异步机制; 2. [Monoio][Monoio] 的一些设计精要; 3. Runtime 对比选型与应用。 ## Rust 异步机制 + 借助 Rustc 和 llvm,Rust 可以生成足够高效且安全的机器码。但是一个应用程序除了计算逻辑以外往往还有 IO,特别是对于网络中间件,IO 其实是占了相当大比例的。 程序做 IO 需要和操作系统打交道,编写异步程序通常并不是一件简单的事情,在 Rust 中是怎么解决这两个问题的呢?比如,在 C++里面,可能经常会写一些 callback ,但是我们并不想在 Rust 里面这么做,这样的话会遇到很多生命周期相关的问题。 @@ -24,6 +28,7 @@ Rust 允许自行实现 Runtime 来调度任务和执行 syscall;并提供了 ![image](/img/blog/Monoio_Open_Source/1_2_zh.png) ### Example + 这里从一个简单的例子入手,看一看这套系统到底是怎么工作的。 当并行下载两个文件时,在任何语言中都可以启动两个 Thread,分别下载一个文件,然后等待 thread 执行结束;但并不想为了 IO 等待启动多余的线程,如果需要等待 IO,我们希望这时线程可以去干别的,等 IO 就绪了再做就好。 @@ -94,6 +99,7 @@ pub enum Poll