2017-06-13 10:37:30 +08:00
[ Click me switch to English version ] ( Introduction . en . md )
2017-01-18 16:19:06 +08:00
# 目录
2017-04-14 10:39:57 +08:00
> * [ 1. 介 绍 ] ( # main - chapter - 1 )
> * [ 2. 设 计 思 路 ] ( # main - chapter - 2 )
> * [ 3. 整 体 架 构 ] ( # main - chapter - 3 )
> * [ 4. 平 台 特 性 ] ( # main - chapter - 4 )
2017-01-18 16:19:06 +08:00
2017-04-14 10:42:38 +08:00
# 1. <a id="main-chapter-1">< / a>介绍
2017-01-18 16:19:06 +08:00
2017-03-02 15:48:02 +08:00
Tars是基于名字服务使用Tars协议的高性能RPC开发框架 , 同 时 配 套 一 体 化 的 服 务 治 理 平 台 , 帮 助 个 人 或 者 企 业 快 速 的 以 微 服 务 的 方 式 构 建 自 己 稳 定 可 靠 的 分 布 式 应 用 。
2017-01-18 16:19:06 +08:00
2017-03-02 15:48:02 +08:00
Tars是将腾讯内部使用的微服务架构TAF ( Total Application Framework ) 多 年 的 实 践 成 果 总 结 而 成 的 开 源 项 目 。 Tars这个名字来自星际穿越电影人机器人Tars ,
电 影 中 Tars有着非常友好的交互方式 , 任 何 初 次 接 触 它 的 人 都 可 以 轻 松 的 和 它 进 行 交 流 , 同 时 能 在 外 太 空 、 外 星 等 复 杂 地 形 上 , 超 预 期 的 高 效 率 的 完 成 托 付 的 所 有 任 务 。
拥 有 着 类 似 设 计 理 念 的 Tars也是一个兼顾易用性 、 高 性 能 、 服 务 治 理 的 框 架 , 目 的 是 让 开 发 更 简 单 , 聚 焦 业 务 逻 辑 , 让 运 营 更 高 效 , 一 切 尽 在 掌 握 。
2017-01-18 16:19:06 +08:00
2017-03-02 15:48:02 +08:00
目 前 该 框 架 在 腾 讯 内 部 , 有 100 多 个 业 务 、 1.6 多 万 台 服 务 器 上 运 行 使 用 。
2017-01-18 16:19:06 +08:00
2017-04-14 10:43:43 +08:00
# 2. <a id="main-chapter-2">< / a>设计思想
2017-01-18 16:19:06 +08:00
2017-03-02 15:48:02 +08:00
Tars的设计思路是采用微服务的思想对服务进行治理 , 同 时 对 整 个 系 统 的 各 个 模 块 进 行 抽 象 分 层 , 将 各 个 层 次 之 间 相 互 解 耦 或 者 松 耦 合 , 如 下 图 :
2017-01-18 16:19:06 +08:00
! [ tars ] ( docs / images / tars . png )
最 底 的 协 议 层 , 设 计 思 路 是 将 业 务 网 络 通 信 的 协 议 进 行 统 一 , 以 IDL ( 接 口 定 义 语 言 ) 的 方 式 , 开 发 支 持 多 平 台 、 可 扩 展 、 协 议 代 码 自 动 生 成 的 统 一 协 议 。 在 开 发 过 程 中 , 开 发 人 员 只 需 要 关 注 通 讯 的 协 议 字 段 的 内 容 , 不 需 要 关 注 其 实 现 的 细 节 , 大 大 减 轻 了 开 发 服 务 时 需 要 考 虑 的 协 议 是 否 能 跨 平 台 使 用 、 是 否 可 能 需 要 兼 容 、 扩 展 等 问 题 。
中 间 的 公 共 库 、 通 讯 框 架 、 平 台 层 , 设 计 思 路 是 让 业 务 开 发 更 加 聚 焦 业 务 逻 辑 的 本 身 。 因 此 , 从 使 用 者 的 角 度 出 发 , 封 装 了 大 量 日 常 开 发 过 程 中 经 常 使 用 的 公 共 库 代 码 和 远 程 过 程 调 用 , 让 开 发 使 用 更 简 单 方 便 ; 从 框 架 本 身 的 角 度 出 发 , 做 到 高 稳 定 性 、 高 可 用 性 、 高 性 能 , 这 样 才 能 让 业 务 服 务 运 营 更 加 放 心 ; 从 分 布 式 平 台 的 角 度 出 发 , 解 决 服 务 运 营 过 程 中 , 遇 到 的 容 错 、 负 载 均 衡 、 容 量 管 理 、 就 近 接 入 、 灰 度 发 布 等 问 题 , 让 平 台 更 加 强 大 。
最 上 面 的 运 营 层 , 设 计 思 路 是 让 运 维 只 需 要 关 注 日 常 的 服 务 部 署 、 发 布 、 配 置 、 监 控 、 调 度 管 理 等 操 作 。
2017-04-14 10:43:43 +08:00
# 3. <a id="main-chapter-3">< / a>整体架构
2017-01-18 16:19:06 +08:00
# # 3.1. 架构拓扑图
! [ tars ] ( docs / images / tars_tuopu . png )
整 体 架 构 的 拓 扑 图 主 要 分 为 2 个 部 分 : 服 务 节 点 与 公 共 框 架 节 点 。
服 务 节 点 :
服 务 节 点 可 以 认 为 是 服 务 所 实 际 运 行 的 一 个 具 体 的 操 作 系 统 实 例 , 可 以 是 物 理 主 机 或 者 虚 拟 主 机 、 云 主 机 。 随 着 服 务 的 种 类 扩 展 和 规 模 扩 大 , 服 务 节 点 可 能 成 千 上 万 甚 至 数 以 十 万 计 。
2017-02-14 17:35:47 +08:00
每 台 服 务 节 点 上 均 有 一 个 Node服务节点和N ( N > = 0 ) 个 业 务 服 务 节 点 , Node服务节点会对业务服务节点进行统一管理 , 提 供 启 停 、 发 布 、 监 控 等 功 能 , 同 时 接 收 业 务 服 务 节 点 上 报 过 来 的 心 跳 。
2017-01-18 16:19:06 +08:00
公 共 框 架 节 点 :
除 了 服 务 节 点 以 外 的 服 务 , 其 他 服 务 节 点 均 归 为 一 类 。
公 共 框 架 节 点 , 数 量 不 定 , 为 了 自 身 的 容 错 容 灾 , 一 般 也 要 求 在 在 多 个 机 房 的 多 个 服 务 器 上 进 行 部 署 , 具 体 的 节 点 数 量 , 与 服 务 节 点 的 规 模 有 关 , 比 如 , 如 果 某 些 服 务 需 要 打 较 多 的 日 志 , 就 需 要 部 署 更 多 的 日 志 服 务 节 点 。
又 可 细 分 为 如 下 几 个 部 分 :
Web管理系统 : 在 Web上可以看到服务运行的各种实时数据情况 , 以 及 对 服 务 进 行 发 布 、 启 停 、 部 署 等 操 作 ;
Registry ( 路 由 + 管 理 服 务 ) : 提 供 服 务 节 点 的 地 址 查 询 、 发 布 、 启 停 、 管 理 等 操 作 , 以 及 对 服 务 上 报 心 跳 的 管 理 , 通 过 它 实 现 服 务 的 注 册 与 发 现 ;
Patch ( 发 布 管 理 ) : 提 供 服 务 的 发 布 功 能 ;
Config ( 配 置 中 心 ) : 提 供 服 务 配 置 文 件 的 统 一 管 理 功 能 ;
Log ( 远 程 日 志 ) : 提 供 服 务 打 日 志 到 远 程 的 功 能 ;
Stat ( 调 用 统 计 ) : 统 计 业 务 服 务 上 报 的 各 种 调 用 信 息 , 比 如 总 流 量 、 平 均 耗 时 、 超 时 率 等 , 以 便 对 服 务 出 现 异 常 时 进 行 告 警 ;
Property ( 业 务 属 性 ) : 统 计 业 务 自 定 义 上 报 的 属 性 信 息 , 比 如 内 存 使 用 大 小 、 队 列 大 小 、 cache命中率等 , 以 便 对 服 务 出 现 异 常 时 进 行 告 警 ;
Notify ( 异 常 信 息 ) : 统 计 业 务 上 报 的 各 种 异 常 信 息 , 比 如 服 务 状 态 变 跟 信 息 、 访 问 db失败信息等 , 以 便 对 服 务 出 现 异 常 时 进 行 告 警 ;
原 则 上 要 求 全 部 的 节 点 之 间 网 络 互 通 , 至 少 每 台 机 器 的 node能够与公共框架节点之间都是可以连通的 。
# # 3.2. 服务交互流程图
! [ tars ] ( docs / images / tars_jiaohu . png )
框 架 服 务 在 整 个 系 统 中 运 行 时 , 服 务 之 间 的 交 互 分 : 业 务 服 务 之 间 的 交 互 、 业 务 服 务 与 框 架 基 础 服 务 之 间 的 交 互 。
服 务 发 布 流 程 : 在 Web系统上传server的发布包到patch , 上 传 成 功 后 , 在 web上提交发布server请求 , 由 registry服务传达到node , 然 后 node拉取server的发布包到本地 , 拉 起 server服务 。
管 理 命 令 流 程 : Web系统上的可以提交管理server服务命令请求 , 由 registry服务传达到node服务 , 然 后 由 node向server发送管理命令 。
心 跳 上 报 流 程 : server服务运行后 , 会 定 期 上 报 心 跳 到 node , node然后把服务心跳信息上报到registry服务 , 由 registry进行统一管理 。
信 息 上 报 流 程 : server服务运行后 , 会 定 期 上 报 统 计 信 息 到 stat , 打 印 远 程 日 志 到 log , 定 期 上 报 属 性 信 息 到 property 、 上 报 异 常 信 息 到 notify 、 从 config拉取服务配置信息 。
Client访问Server流程 : client可以通过server的对象名Obj间接访问server , Client会从registry上拉取server的路由信息 ( 如 ip 、 port信息 ) , 然 后 根 据 具 体 的 业 务 特 性 ( 同 步 或 者 异 步 , tcp或者udp方式 ) 访 问 server ( 当 然 client也可以通过ip / port直接访问server ) 。
# # 3.3. web管理系统
! [ tars ] ( docs / images / tars_web_system . png )
web管理系统主要包含以下功能 :
- 业 务 管 理 : 包 括 已 部 署 的 服 务 , 以 及 服 务 管 理 、 发 布 管 理 、 服 务 配 置 、 服 务 监 控 、 特 性 监 控 等 ;
- 运 维 管 理 : 包 括 服 务 部 署 、 扩 容 、 模 版 管 理 等 ;
# # 3.4. 服务结构图
框 架 核 心 的 服 务 端 与 客 户 端 实 现 结 构 图 如 下 :
! [ tars ] ( docs / images / tars_server_client . png )
服 务 端 :
NetThread : 收 发 包 , 连 接 管 理 , 多 线 程 ( 可 配 置 ) , 采 用 epoll ET触发实现 , 支 持 tcp / udp ;
BindAdapter : 绑 定 端 口 类 , 用 于 管 理 servent对应的绑定端口的信息操作 ;
ServantHandle : 业 务 线 程 类 , 根 据 对 象 名 分 派 Servant的对象和接口调用 ;
AdminServant : 管 理 端 口 的 对 象 ;
ServantImp : 继 承 Servant的业务处理基类 ( Servent : 服 务 端 接 口 对 象 的 基 类 ) ;
客 户 端 :
NetThread : 收 发 包 , 连 接 管 理 , 多 线 程 ( 可 配 置 ) , 采 用 epoll ET触发实现 , 支 持 tcp / udp ;
AdapterProxy : 具 体 服 务 器 某 个 节 点 的 本 地 代 理 , 管 理 到 服 务 器 的 连 接 , 以 及 请 求 超 时 处 理 ;
ObjectProxy : 远 程 对 象 代 理 , 负 责 路 由 分 发 、 负 载 均 衡 、 容 错 , 支 持 轮 询 / hash / 权 重 ;
ServantProxy : 远 程 对 象 调 用 的 本 地 代 理 , 支 持 同 步 / 异 步 / 单 向 , Tars协议和非Tars协议 ;
AsyncThread : 异 步 请 求 的 回 应 包 处 理 线 程 ;
Callback : 具 体 业 务 Callback的处理基类对象 ;
2017-04-14 10:43:43 +08:00
# 4. <a id="main-chapter-4">< / a>平台特性
2017-01-18 16:19:06 +08:00
# # 4.1. tars协议
tars协议采用接口描述语言 ( Interface description language , 缩 写 IDL ) 来 实 现 , 它 是 一 种 二 进 制 、 可 扩 展 、 代 码 自 动 生 成 、 支 持 多 平 台 的 协 议 , 使 得 在 不 同 平 台 上 运 行 的 对 象 和 用 不 同 语 言 编 写 的 程 序 可 以 用 PRC远程调用的方式相互通信交流 ,
主 要 应 用 在 后 台 服 务 之 间 的 网 络 传 输 协 议 , 以 及 对 象 的 序 列 化 和 反 序 列 化 等 方 面 。
协 议 支 持 的 类 型 分 两 种 , 基 本 类 型 和 复 杂 类 型 。
基 本 类 型 包 括 : void 、 bool 、 byte 、 short 、 int 、 long 、 float 、 double 、 string 、 unsigned byte 、 unsigned short 、 unsigned int ;
复 杂 类 型 包 括 : enum 、 const 、 struct 、 vector 、 map , 以 及 struct 、 vector 、 map的嵌套 。
例 如 :
! [ tarsproto ] ( docs / images / tars_tarsproto . png )
# # 4.2. 调用方式
通 过 IDL语言协议 , 可 以 定 义 服 务 提 供 的 接 口 , 并 自 动 生 成 客 户 端 和 服 务 端 的 相 关 通 信 代 码 , 服 务 端 只 需 实 现 业 务 逻 辑 即 可 对 外 提 供 服 务 , 客 户 端 通 过 自 动 生 成 的 代 码 即 可 调 用 服 务 , 调 用 方 式 支 持 三 种 模 式 :
同 步 调 用 : 客 户 端 发 出 调 用 请 求 后 等 待 服 务 返 回 结 果 后 再 继 续 逻 辑 ;
异 步 调 用 : 客 户 端 发 出 调 用 请 求 后 继 续 其 他 业 务 逻 辑 , 服 务 端 返 回 结 果 又 由 回 调 处 理 类 处 理 结 果 ;
单 向 调 用 : 客 户 端 发 出 调 用 请 求 后 就 结 束 调 用 , 服 务 端 不 返 回 调 用 结 果 ;
# # 4.3. 负载均衡
框 架 通 过 名 字 服 务 来 实 现 服 务 的 注 册 与 发 现 , Client通过访问名字服务获取到被调服务的地址信息列表 , Client再根据需要选择合适的负载均衡方式来调用服务 ,
负 载 均 衡 支 持 轮 询 、 hash 、 权 重 等 多 种 方 式 。
! [ tars ] ( docs / images / tars_junheng . png )
# # 4.4. 容错保护
容 错 保 护 通 过 两 种 方 式 实 现 : 名 字 服 务 排 除 和 Client主动屏蔽 。
! [ tars ] ( docs / images / tars_rongcuo . png )
名 字 服 务 排 除 的 策 略 :
业 务 服 务 主 动 上 报 心 跳 给 名 字 服 务 , 使 名 字 服 务 知 道 服 务 部 署 的 节 点 存 活 情 况 , 当 服 务 的 某 节 点 故 障 时 , 名 字 服 务 不 在 返 回 故 障 节 点 的 地 址 给 Client , 达 到 排 除 故 障 节 点 的 目 标 。 名 字 服 务 排 除 故 障 需 要 通 过 服 务 心 跳 和 Client地址列表拉取两个过程 , 故 障 排 除 时 间 在 1 分 钟 左 右
Client主动屏蔽 :
为 了 更 及 时 的 屏 蔽 故 障 节 点 , Client根据调用被调服务的异常情况来判断是否有故障来更快进行故障屏蔽 。 具 体 策 略 是 , 当 client调用某个svr出现调用连续超时 , 或 者 调 用 的 超 时 比 率 超 过 一 定 百 分 比 , client会对此svr进行屏蔽 , 让 流 量 分 发 到 正 常 的 节 点 上 去 。 对 屏 蔽 的 svr节点 , 每 隔 一 定 时 间 进 行 重 连 , 如 果 正 常 , 则 进 行 正 常 的 流 量 分 发 。
# # 4.5. 过载保护
为 了 防 止 业 务 因 为 访 问 量 突 增 或 服 务 器 故 障 造 成 系 统 整 体 的 繁 忙 , 进 而 导 致 全 部 服 务 的 不 可 用 , 框 架 内 部 做 相 应 设 计 来 应 对 。 实 现 请 求 队 列 , 服 务 调 用 通 过 非 阻 塞 方 式 实 现 异 步 系 统 , 从 而 达 到 提 升 系 统 处 理 能 力 的 目 的 。 并 且 对 队 列 的 长 度 进 行 监 控 , 当 超 过 某 个 阀 值 , 则 拒 绝 新 的 请 求 。 对 请 求 设 置 超 时 时 间 , 当 请 求 包 从 队 列 里 读 取 出 来 是 判 断 请 求 是 否 超 时 , 如 果 超 时 则 不 做 处 理 。
! [ tars ] ( docs / images / tars_overload . png )
# # 4.6. 消息染色
框 架 提 供 了 对 某 服 务 某 接 口 的 特 定 请 求 进 行 染 色 的 能 力 , 染 色 的 消 息 可 以 透 传 到 后 面 需 要 访 问 的 所 有 服 务 上 , 对 染 色 的 请 求 , 服 务 自 动 把 日 志 上 报 到 特 定 的 染 色 日 志 服 务 器 上 , 使 用 者 只 需 在 染 色 服 务 器 上 即 可 分 析 请 求 访 问 的 路 径 , 方 便 跟 踪 定 位 问 题 。
如 下 :
! [ tars ] ( docs / images / tars_dye . png )
# # 4.7. IDC分组
为 了 加 快 服 务 间 的 访 问 速 度 , 建 设 跨 地 区 、 跨 机 房 调 用 带 来 的 网 络 资 源 消 耗 , 减 少 网 络 故 障 带 来 的 影 响 , 框 架 提 供 了 跨 地 区 、 跨 机 房 , 就 近 接 入 的 功 能 。
! [ tars ] ( docs / images / tars_idc . png )
详 细 介 绍 参 见 docs目录下的tars_idc_set . md
# # 4.8. SET分组
为 了 方 便 对 业 务 服 务 部 署 管 理 进 行 标 准 化 和 容 量 化 , 框 架 提 供 了 Set部署能力 , set之间没有调用关系 , 互 不 干 扰 , 故 障 隔 离 , 提 高 运 维 效 率 和 服 务 可 用 性 。
! [ tars ] ( docs / images / tars_set . png )
详 细 介 绍 参 见 docs目录下的tars_idc_set . md
# # 4.9. 数据监控
为 了 更 好 反 映 和 监 控 小 到 服 务 进 程 、 大 到 业 务 的 运 行 质 量 情 况 , 框 架 支 持 以 下 数 据 上 报 的 功 能 :
1. 提 供 了 服 务 模 块 间 调 用 信 息 统 计 上 报 的 功 能 , 方 便 用 户 查 看 服 务 的 流 量 、 延 时 、 超 时 、 异 常 等 情 况 ;
! [ tars ] ( docs / images / tars_stat . png )
2. 提 供 了 用 户 自 定 义 属 性 数 据 上 报 的 功 能 , 方 便 用 户 查 看 服 务 的 某 些 纬 度 或 者 指 标 , 比 如 内 存 使 用 情 况 、 队 列 大 小 、 cache命中率等 ;
! [ tars ] ( docs / images / tars_property . png )
3. 提 供 了 服 务 状 态 变 更 和 异 常 信 息 上 报 的 功 能 , 方 便 用 户 查 看 服 务 的 何 时 发 布 过 、 重 启 过 、 宕 过 以 及 遇 到 的 异 常 致 命 错 误 等 ;
! [ tars ] ( docs / images / tars_notify . png )
# # 4.10. 集中配置
对 业 务 配 置 进 行 集 中 管 理 并 且 操 作 web化 , 使 配 置 修 改 更 容 易 , 通 知 更 及 时 , 配 置 变 更 也 更 安 全 ; 对 配 置 变 更 进 行 历 史 记 录 , 让 配 置 可 以 轻 松 回 退 到 前 一 版 本 。 配 置 拉 取 服 务 化 , 服 务 只 需 调 用 配 置 服 务 的 接 口 即 可 获 取 到 配 置 文 件 。
为 了 能 灵 活 管 理 配 置 文 件 , 配 置 文 件 分 为 几 个 级 别 : 应 用 配 置 、 Set配置 、 服 务 配 置 和 节 点 配 置 。
应 用 配 置 为 最 高 一 级 的 配 置 文 件 , 它 是 多 个 服 务 配 置 提 炼 出 来 的 公 共 配 置 , 服 务 配 置 通 过 引 用 它 来 使 用 其 配 置 内 容 。
Set配置是具体一个Set分组下所有服务的公共配置 , 在 应 用 配 置 的 基 础 上 进 行 补 充 追 加 。
服 务 配 置 是 具 体 一 个 服 务 下 所 有 节 点 的 公 共 配 置 , 可 以 引 用 应 用 配 置 。
节 点 配 置 是 一 个 应 用 节 点 的 个 性 化 配 置 , 它 和 服 务 配 置 合 并 成 为 具 体 一 个 服 务 节 点 的 配 置 。
详 细 介 绍 可 以 参 见 docs目录下的tars_config . md