Castle

我的沉思、笔记和回忆

Tars 迁移微服务选型

技术


Tars + Istio TCP 代理
gRPC
Dubbo
开源版 tRPC
协议TarsgRPCTriple(兼容 gRPC)tRPC
其他协议支持
--gRPCJSONRPCHTTPgRPCHTTP
序列化Tarsprotobufprotobufprotobuf
Stream 支持-支持支持支持
注册中心
Tars 自带的 TarsRegistryZookeeperConsulEtcdZookeeperNacosRedisConsulEtcdPolaris(北极星)EtcdConsul
配置中心Tars 自带的 TarsConfigZookeeperConsul
Dubbo Java:ZookeeperNacosDubbo Go:ZookeeperNacostRPC Cpp:EtcdtRPC GO:EtcdtRPC Java:Nacos
熔断限流
框架本身不提供需自己实现
框架本身不提供使用 K8s 可以用到 Istio、Envoy 提供的限流Dubbo Java:Sentinel框架内置限流自适应限流Dubbo Go:SentineltRPC Cpp:overload_control_concurrency_limitertRPC Go:hystrixdegradetRPC Java:Sentinel
优雅下线TarsGo 实现了 sendCloseMsg,客户端在收到该关闭消息后,会停止使用该连接TarsJava、TarsCpp 未实现相关逻辑。这时候的无损下线依赖于客户端刷新节点列表后,停止使用已下线接的连接。对已建立的连接,服务端会发送 HTTP/2 GOAWAY 帧,通知客户端停止在该连接上发送新请求。
Dubbo 的节点信息更新比较快,即使未实现关闭帧,在等待比较短时间后仍然可以确保请求完成后正常关闭。
tRPC 协议中有关闭帧。tRPC 兼容 tars 协议如何实现优雅下线文档未提及。
语言适配Cpp、Java、GoCpp、Java、GoJava、GoCpp、Java、Go
K8s 支持支持 k8s支持 k8s 服务网格支持 k8s支持 k8s 服务网格支持 k8s支持 K8s 服务网格支持 k8s
社区活跃性Last closed issue: 2024/07/26Last merged PR: 2023/10/20Total PRs: 124Last closed issue: 2025/03/30Last merged PR: 2025/04/09Total PRs: 26857Last closed issue: 2025/03/29Last merged PR: 2025/04/07Total PRs: 7692Last closed issue: 2024/03/20Last merge PR: 2024/11/20Total PRs: 25
Github Star(截止到 4 月 9 日)10k42.7k40.9k243
修改点K8s Tars 方案:TarsCli 部署 Tars 项目使用相同的注册中心
问题:使用 k8s service 时滚动更新时长连接销毁会超时直接使用 k8s 不使用网格,原先的发布慢问题无法解决
修改点:使用 gRPC 启动项目,并复制业务代码Protobuf 协议和 tars 协议不兼容,调用方和服务方的参数传递需要修改
修改点:使用 dubbo 启动项目,并复制业务代码Protobuf 协议和 tars 协议不兼容,调用方和服务方的参数传递需要修改Dubbo 支持自定义协议,但需要各个语言都开发一遍
链路追踪升级 Tars 版本可以支持框架本身不提供,需要各个语言实现。支持支持

当前 Tars 框架面临的主要问题

  1. 使用传统的云主机进行部署,不具备伸缩条件,成本高;隔离性差,当单个服务的 CPU、负载等出现问题时,极易引发问题扩散;
  2. 熔断、限流等能力在框架层没有统一的实现,现在依靠 go 和 java 项目的各自配置,使用繁琐且容易出错;
  3. CI / CD 流程过于粗暴,发布过程中不能做到服务真正的无损下线,发布时间长、无记录,底层库修改时需要花费大量人力进行服务发布;
  4. 监控系统存在天然缺陷,只有 5 分钟维度的监控,有问题不能及时发现和定位,且迁移到弗吉尼亚后监控面板很多功能实质上处于无法使用的状态;
  5. 告警系统在新版本 Tars 中独立组建,配置麻烦且使用低效,当前的告警实质上依赖 grafana 和腾讯云本身;
  6. 链路追踪能力缺失,遇到超时等问题难以定位发生问题的位置(海外使用了自定义拦截器,但是未进行推广),链路追踪无宏观层面监控;
  7. 使用 C++ 开发且社区不活跃,遇到问题既难以自己解决,也无法寻求帮助;
  8. 日志不统一,有各种各样服务自定义的日志格式,加大了日志收集和查询的难度。

可选方案

更换为主流 RPC 框架,如 Dubbo、gRPC

现在主流的微服务都选取了 protobuf 协议,但是 protobuf 协议不兼容 tars 协议,主要体现在以下方面:

Idea 系列的 Jce 插件中提供了将 tars 协议转为 protobuf 的能力。

我也自己实现了一个 tars2proto。

目前看区别在于:

  1. Jce 插件中对 include 没有转换为 import,而是直接将 include 的结构生成在了当前 proto 结构中
  2. Tag 映射关系
  3. 常量支持
  4. 字符串枚举支持
  5. Jce 插件不支持复杂类型的自动生成。

Tars + K8sTars + Istio TCP 代理

K8sTars 的 Tarscli 通过一系列命令,实现了服务的注册、下线和健康检查等能力。

优势:无需修改代码,仅新增部分配置文件和运维工作。

  1. 代码框架未更换,意味着现有框架如果有问题无法解决
  2. TarsCli 开发于 4 年前,后续没有任何的更新
  3. 发布慢的问题无法解决,由于 tars 未在各个语言实现平滑下线,每次发布都需要等待节点刷新服务列表后才可以终止流量。
  4. 由于没有 tarsnode 的存在,tars 的服务列表中状态不正常。

0c1a941b-afb1-41a4-89c7-ccf7330d75e2.png

  1. 监控体系存在的问题依然需要解决。

Tars + Tars 协议 Sidecar

WeChatWorkScreenshot_9c2d6d62-8ff2-4217-aae0-56295582b481.png

  1. 代码框架未更换,意味着现有框架如果有问题无法解决
  2. 需要定制 7 层 tars 协议 filter

使用 tRPC

已经验证过 tRPC 原生支持 tars.

待研究

  1. 服务如何双向注册
  2. 服务的发布机制
  3. 脱离 123 平台需要额外做哪些工作
创建于2025年04月08日 14:45
阅读量 4
留言列表

暂时没有留言

添加留言