这是我参与「第三届青训营 -后端场」笔记创作活动的的第7篇笔记
GO-学习笔记
RPC框架
- RPC Remote Procedure Calls,远程函数调用
- 函数映射
- 数据转换成字节流
- 网络传输
- 优点
- 单一职责,利于分工协作
- 可扩展性强,资源使用率高
- 故障隔离,服务整体可靠性高
- 弊端
- 服务宕机
- 跨网络,保证消息可达性
- 流量突增导致服务器不能及时处理
结构
IDL
调用方和被调用方都要依赖这个文件- TLV编码层
- Tag,标签/类型
- Length,长度
- Value,值
- 协议层
- 特殊结束符,每个协议单元的结束
- 变长协议,定长部分描述不定长部分的长度
- 网络通信层
- sockets API,在应用层和传输层之间
关键指标
- 稳定性
- 熔断,保护调用方,防止被调用的服务出现问题,影响链路
- 限流,保护被调用方,防止大流量把服务压垮
- 超时控制,避免浪费资源在不可用的节点
- 请求成功率,负载均衡/重试
- 长尾请求,高于平均请求时间的请求,利用
backup request
,在请求超时时,在发送一个
- 易用性
- 开箱即用
- 周边工具
- 扩展性
- 中间件
- 参数
- 编解码层
- 协议层
- 网络传输层
- 代码生成工具插件扩展
- 观测性
- log(日志)/metric(计算、耗时)/tracing(追踪)
- 内置观测性服务
- 高性能
- 高吞吐、低延迟
- 连接池、多路复用、高性能编解码、高性能网络库
- 多请求类型
Kitex
整体架构
Kitex Core
核心组件Kitex Byted
公司内部集成设施Kitex Tool
代码生成工具
自研网络库
- 原生库的问题
- 无法感知连接状态
- 存在goroutine暴涨的风险,连接利用率低
- Netpoll
- epoll主动监听机制,事件推送
- goroutine池,复用goroutine
- 引入Nocopy Buffer,编解码层实现零拷贝
扩展性
- 灵活的自定义协议扩展
- 请求 ping-pong/streaming/Oneway
- 编解码 Codec Thrift/protobuf,Thrift更紧凑
- 应用层 Application TTHeader/HTTP2
- 传输层 Transport TCP/UDP/RDMA
优化
- 网络库
- 调度优化,epoll/gopoll(重用goroutine),降低同时运行协程数
- LinkBuffer 读写并行无锁,支持nocopy/高效扩缩容
- Pool,引入内存池和对象池,减少GC开销
- 编解码优化
- Codegen,预计算并预分配内存,减少内存操作次数;inline内联减少函数调用次数和避免不必要的反射;自研Thriftgo代码生成器,支持完善的Thrifit IDL语法和语义检查
- JIT,即时编译,代码运行时再去进行编解码;自研Thrift编解码器Frugal
合并部署
- 将亲和性强的服务实例调度到同一个无理解,远程调用RPC优化为本地IPC调用
- 中心化部署调度和流量控制
- 基于共享内存的通信协议
- 定制化的服务发现和连接池实现
- 定制化的服务启动和监听逻辑
笔记项目
Kitex
- RPC框架,接口式编程
IDL Interface Definition Language
接口定义语言- Kitex使用
Etcd
- 注册中心,类似
zookeeper
的角色,服务注册和调用
Opentracing
Jaeger
- 分布式追踪链路
- 每个服务的执行情况
项目
- 路径
bizdemo/easy_note
- 结构
dubbo
注册到zookeeper
,业务层直接调用
- 技术栈
项目目录
idl
统一接口,有kitex
自动生成pkg
errno
错误码contants
常量middleware
中间件扩展tracer
初始化Jaeger
bound
TLS限流
note/user
dal
数据库pack
类型转换rpc
相关,初始化user
的服务service
基础服务handler.go
实现rpc接口