微服务框架 Kitex 的设计、实践及开源
如果无法正常显示,请先停止浏览器的去广告插件。
1. 微服务框架 Kitex 的设计、实践及开源
字节跳动服务框架 杨芮
2. 主讲人
目目前主要负责字节跳动 Golang
微服务框架的设计开发。
QCon 2021 明星讲师。
3. 目
录
01. 字节 Go 微服务框架的演进
02. Kitex 框架设计概述和功能特性
03. Kitex 开源和在字节内的实践
04. 总结和展望
4. 01
字节 Go 微服务框架的演进
5. 字节微服务及 Golang 框架演进
引入 Golang
2014
Kite/Ginex
发布
2015
服务化开启
Thrift + HTTP
Golang RPC 框架: Kite -> Kitex
Golang HTTP 框架: Ginex -> Hertz
Service Mesh
2016
2019
Kitex 启动
Kitex 发布
20年底 1w+
服务接入;
Hertz 立项
2020
Kitex 线上服务 5w+;
Mesh 覆盖 90%+服务;
Hertz 开源
2021
Kitex 开源;
Hertz 发布
2022
6. 旧框架 Kite 的问题
n 能力扩展受限
• Kite 强耦合 Thrift、无法横向扩展协议
• 无法优雅支持其他特性,如新的交互方式
n 维护成本高
• 生成代码逻辑重,难改造
• 多仓库维护
n 用户使用体验不佳
• IDL 定义约束
• 代码生成工具依赖 Apache Thrift
n 性能优化难
•
受限于与 Thrift 的深度耦合,网络模型还是编解码层
面,优化成本高
n 网络库优化诉求
•
感知连接状态 & 连接多路复用
业务场景复杂,需求也会多样化
接入入服务及调用用量量逐年年增⻓长
不不做好准备,后面面会越来越难维护
7. Kitex 框架及其核心依赖
字节接入 线上服务 5w+
峰值 QPS 上亿
Kitex
Netpoll
Thriftgo
ü 面向 RPC 场景 ü Thrift IDL 解析和代码生成器
ü 可感知连接状态 ü 支持完善的 Thrift IDL 语法和语义
ü 提供高性能的 LinkBuffer 支持
NoCopy 的读写接口
ü 支持内存池、协程池
检查
ü 支持插件机制,可根据需求自定义
生成代码
8. 02
Kitex 框架设计概述和功能特性
9. 框架设计的关键要素
扩展性
易用性
功能
丰富度
高性能
10. Kitex 框架设计概述 – 模块划分
Ø Kitex 核心
API 定义、核心逻辑实现以及对各
API 的默认扩展
Ø Kitex Byted
与字节内部基础能力集成的扩展
实现
Ø Kitex Tool
IDL 解析和代码生成器
11. Kitex 框架设计概述 – 模块层级
12. Kitex 框架设计概述 – 扩展性
•
协议、通信、服务治理(注册、发现、限流…)、监控、异常处理、元信息处理、诊断…
13. Kitex 框架设计概述 – 扩展性
Ø Netpoll 扩展示例
14. Kitex 框架设计概述 – 易用性
•
无论是 Thrift、Kitex Protobuf、gRPC,一样的使用体验
$ kitex -service mydemo greet.thrift
$ kitex -service mydemo -type protobuf greet.proto
• 实现 handler
15. Kitex 框架设计概述 – 易用性
• RPC直连调用测试代码
• 编译 & 启动服务
$ ./build.sh
$ ./output/bootstrap.sh
2022/05/26 15:03:01.405923 server.go:77: [Info]
KITEX: server listen at addr=[::]:8888
•
测试
$ go test -v -run TestGreetService
2022/05/29 15:03:10.006479 client_test.go:20: [Info]
Hello Kitex!
16. Kitex 框架设计概述 – 功能丰富度
• 内置:通用的内置到框架,也支持扩展定制
• 如负载均衡、熔断、限流、超时、重试、连接池、监控埋点、日志
• 扩展:非通用的扩展完善
• 如服务注册发现、指标监控、链路跟踪、配置
17. Kitex 框架设计概述 – 高性能
Ø Thrift
18. Kitex 框架设计概述 – 高性能
Ø Protobuf
注意:以上是各框架对 Protobuf 支持的压测,但并非使用一个协议,gRPC 协议基于 HTTP2 处理复杂性更高。
后面有对针对 gRPC 协议的压测数据。
19. Kitex 功能特性 – 协议、通信
20. Kitex 功能特性 – Thrift 高性能编解码
Ø Thrift ‒ FastWrite/Read
结合 Netpoll NoCopy API 重新设计的 Thrift 生成代码,减少函数调用、内
存拷⻉,优化生成代码提升 inline 效果。
21. Kitex 功能特性 – Thrift 高性能编解码
Ø Frugal
无需生成编解码代码,基于 JIT 的高性能动态 Thrift 编解码器~
结合 Kitex 在大部分场景性能表现优于生成代码的编解码
22. Kitex 功能特性 – Protobuf 高性能编解码
Ø Protobuf ‒ FastWrite/Read
参考 Thrift 的 FastWrite/Read 实现,重新设计了 Protobuf 生成代码,避免反射和拷⻉的开销。
目前内置在 Kitex,后续考虑拆分开源。
• Protobuf Benchmark 官方对比测试
• FastWrite: (ns/op) ↓41.5% ,(B/op) ↓4.5%
• FastWrite: (ns/op) ↓67.8% ,(B/op) ↓83.9%
23. Kitex 功能特性 – Protobuf 高性能编解码
Ø Protobuf ‒ FastWrite/Read
• gRPC 协议 Unary 请求压测对比
Kitex 也在针对低并发场景优化性能
24. Kitex 功能特性 – Thrift Validator
Ø thrift-gen-validator
thriftgo 工具的插件,根据 Thrift IDL 中定义的注解描述约束给对应的 struct 生成 IsValid() error
方法,校验值的合法性。
$ kitex --thrift-plugin validator -service a.b.c youridl.thrift
25. Kitex 功能特性 – 泛化调用
Ø 网关场景
Ø 网关泛化调用 - 没有生成代码,没有业务数据结构
开源的一些泛化方式
Kitex 泛化方式:基于 idl 中的注解映射
26. Kitex 功能特性 – 泛化调用
Ø HTTP -> Thrift 泛化调用
27. Kitex 功能特性 – 泛化调用
Ø 泛化调用相关的扩展实现
有需求也会考虑 Protobuf 泛化调用
28. Kitex 功能特性 – 可视化-细粒度监控埋点
29. Kitex 功能特性 – 可视化-细粒度监控埋点
• 结合链路跟踪展示详细 RPC 调用信息
30. Kitex 功能特性 – 可视化-细粒度监控埋点
• 服务端 Tracer 展示
31. Kitex 功能特性 – 可视化-细粒度监控埋点
• 调用端 Tracer 展示
32. Kitex 功能特性 – 可视化-服务信息查询
Ø 框架 Debug 运行时状态查询 & pprof
http://ip:18888/kitex/runtime
http://ip:18888/debug/pprof
33. Kitex 功能特性 – 信息透传
Ø Metainfo
• Golang 组件通用的元信息透传基础库
• github.com/bytedance/gopkg/cloud/metainfo
34. Kitex 功能特性 – 信息透传
Ø MetaHandler
35. 03
Kitex 开源和在字节内的实践
36. Kitex 开源
Kitex 不是为了开源而实现的,但它的实现是面向开源的~
37. Kitex 字节内部的实践
Ø 如何与内部基础设施集成
38. Kitex 字节内部的实践
Ø ShmIPC-应用在 ServiceMesh 和 IPC 场景
• 根据环境变量开启,用戶无需感知
39. Kitex 字节内部的实践
Ø 微服务合并部署
非合并微服务调用
合并微服务调用
40. Kitex 字节内部的实践
Ø 微服务合并部署
• 初始化条件判断 - 合并模式
• 监听多个地址
• 单独的服务发现
• 单独的连接池策略略(ShmIPC)
• 多通信方方式:Shm、UDS、TC
41. 04
总结和展望
42. 总结
Ø 字节 Golang 框架的演进和遇到的问题
Ø 框架设计的关键要素:扩展性、易用性、功能丰富度、高性能
Ø Kitex 框架设计概述,并介绍了部分特有的功能特性
43. 展望
Ø 与社区同学共建,持续丰富社区生态
Ø 结合工程实践,为微服务开发者提供更多便利
Ø 完善好 BDThrift 生态,同时也会优化 Protobuf/gRPC
Ø 更多特性支持或开源,ShmIPC、Proxyless、 Quic、Protobuf 泛化…
44. CloudWeGo 开源项目
www.cloudwego.io
…
服务框架
Kitex
Hertz
Rust 框架
…
基础库
Netpoll
Thriftgo
Sonic
Frugal
45. THANKS
CloudWeGo 公众号