这是我参与「第五届青训营 」笔记创作活动的第9天
简介
微服务架构中需要考虑决策模型由多个模式组成。从层次上大致可分为应用相关、应用基础相关、基础设施相关三大层。
- 应用相关模式: 服务拆分、数据库的架构、维护数据一致性问题、测试相关;
- 应用基础设施相关模式: 边界问题、安全性、事务性消息、通信风格、可靠性、可监测性;
- 基础设施相关模式: 应用/服务的部署、服务发现等.
核心要素
- 服务治理:服务注册、服务发现、负载均衡、扩缩容......
- 可观测性:日志采集、日志分析、监控打点、异常报警、链路追踪......
- 安全:身份验证、认证授权、访问令牌、审计......
基本概念
服务: 一组具有相同逻辑的运行实体
实例: 一个服务中,每个运行实体即为一个实列
实例与进程的关系: 没有必然对应关系
集群: 通常指服务内部的逻辑划分
有状态/无状态服务: 服务的实列是否存储了可持续化数据
服务间通信: 对于微服务,服务间通信意味着网络传输
字节微服务架构体系
RPC框架Kitex
KiteX 是字节跳动研发的下一代高性能、强可扩展的 Golang RPC 框架。除了具备丰富的服务治理特性,它还集成了自研的网络库 Netpoll,支持多消息协议(Thrift/Protobuf)和多交互方式(Ping-Pong/Oneway/ Streaming),提供自研的、更加灵活可扩展的代码生成器。
Kite 在发布之初使用的是原生的库,所以存在两个最主要的问题:一是无法直接感知对端连接状态;二是原生 net 网络库在面对长连接时,容易产生 goroutine 爆炸的问题。
这在 HTTP 场景下其实很常见,开发人员经常会遇到一个 HTTP 服务(包括使用 Gin 这种框架的时候)的内存出现持续增长。为什么?因为实际场景中客户端经常忘记关连接。
Netpoll 可以通过一个 React 模型去解决连接爆炸的问题,同时也带来一些 zero-copy buffer 的使用。
关于多协议,字节跳动的大多数服务采用的都是 Thrift 协议。而这里的多协议是应对一些业务提出的支持其他协议的需求。例如后端服务和端上的 Protobuf 打通。通过多协议支持实现了它和 Thrift 的解耦。现在 KiteX 同时支持 PB 和 Thrift 协议,也支持灵活的自定义协议扩展。
高性能是所有做框架的开发者共同追求的目标,这里不再赘述。最后,KiteX 是面向开源社区设计的。如上图所示,KiteX Core 是可以直接开源的部分,右侧的 KiteX Byted 涉及字节跳动内部工具,这块在对外时可以被替换成一些开源的日志库和方案。