| Tars + Istio TCP 代理 | gRPC | Dubbo | 开源版 tRPC | |
|---|---|---|---|---|
| 协议 | Tars | gRPC | Triple(兼容 gRPC) | tRPC |
| 其他协议支持 | - | - | gRPCJSONRPCHTTP | gRPCHTTP |
| 序列化 | Tars | protobuf | protobuf | protobuf |
| Stream 支持 | - | 支持 | 支持 | 支持 |
| 注册中心 | Tars 自带的 TarsRegistry | ZookeeperConsulEtcd | ZookeeperNacosRedisConsulEtcd | Polaris(北极星)EtcdConsul |
| 配置中心 | Tars 自带的 TarsConfig | ZookeeperConsul | Dubbo Java:ZookeeperNacosDubbo Go:ZookeeperNacos | tRPC Cpp:EtcdtRPC GO:EtcdtRPC Java:Nacos |
| 熔断限流 | 框架本身不提供需自己实现 | 框架本身不提供使用 K8s 可以用到 Istio、Envoy 提供的限流 | Dubbo Java:Sentinel框架内置限流自适应限流Dubbo Go:Sentinel | tRPC Cpp:overload_control_concurrency_limitertRPC Go:hystrixdegradetRPC Java:Sentinel |
| 优雅下线 | TarsGo 实现了 sendCloseMsg,客户端在收到该关闭消息后,会停止使用该连接TarsJava、TarsCpp 未实现相关逻辑。这时候的无损下线依赖于客户端刷新节点列表后,停止使用已下线接的连接。 | 对已建立的连接,服务端会发送 HTTP/2 GOAWAY 帧,通知客户端停止在该连接上发送新请求。 | Dubbo 的节点信息更新比较快,即使未实现关闭帧,在等待比较短时间后仍然可以确保请求完成后正常关闭。 | tRPC 协议中有关闭帧。tRPC 兼容 tars 协议如何实现优雅下线文档未提及。 |
| 语言适配 | Cpp、Java、Go | Cpp、Java、Go | Java、Go | Cpp、Java、Go |
| K8s 支持 | 支持 k8s支持 k8s 服务网格 | 支持 k8s支持 k8s 服务网格 | 支持 k8s支持 K8s 服务网格 | 支持 k8s |
| 社区活跃性 | Last closed issue: 2024/07/26Last merged PR: 2023/10/20Total PRs: 124 | Last closed issue: 2025/03/30Last merged PR: 2025/04/09Total PRs: 26857 | Last closed issue: 2025/03/29Last merged PR: 2025/04/07Total PRs: 7692 | Last closed issue: 2024/03/20Last merge PR: 2024/11/20Total PRs: 25 |
| Github Star(截止到 4 月 9 日) | 10k | 42.7k | 40.9k | 243 |
| 修改点 | K8s Tars 方案:TarsCli 部署 Tars 项目使用相同的注册中心 问题:使用 k8s service 时滚动更新时长连接销毁会超时直接使用 k8s 不使用网格,原先的发布慢问题无法解决 | 修改点:使用 gRPC 启动项目,并复制业务代码Protobuf 协议和 tars 协议不兼容,调用方和服务方的参数传递需要修改 | 修改点:使用 dubbo 启动项目,并复制业务代码Protobuf 协议和 tars 协议不兼容,调用方和服务方的参数传递需要修改Dubbo 支持自定义协议,但需要各个语言都开发一遍 | |
| 链路追踪 | 升级 Tars 版本可以支持 | 框架本身不提供,需要各个语言实现。 | 支持 | 支持 |
现在主流的微服务都选取了 protobuf 协议,但是 protobuf 协议不兼容 tars 协议,主要体现在以下方面:
map[string]map[string]int、vector<vector<int>> 、map[string]vector<int> 类型不支持,需要额外构造 messagemessage addAuthorMessageRequest {
common.InParam inParam = 1;
AuthorMessage message = 2;
}
message addAuthorMessageResponse {
common.OutParam outParam = 3;
}
rpc addAuthorMessage(addAuthorMessageRequest) returns (addAuthorMessageResponse);void addAuthorMessage(common::InParam inParam, AuthorMessage message, out common::OutParam outParam);Idea 系列的 Jce 插件中提供了将 tars 协议转为 protobuf 的能力。
我也自己实现了一个 tars2proto。
目前看区别在于:
K8sTars 的 Tarscli 通过一系列命令,实现了服务的注册、下线和健康检查等能力。
优势:无需修改代码,仅新增部分配置文件和运维工作。


已经验证过 tRPC 原生支持 tars.
待研究
暂时没有留言