当前位置: 首页 > news >正文

使用 ttrpc 实现高效的进程间通信(附 Go Demo)

使用 ttrpc 实现高效的进程间通信(附 Go Demo)

ttrpc(Tiny Transport RPC)是由 containerd 社区开发的一种轻量级 RPC 协议,它专为本地进程间通信(IPC)设计,使用 UNIX domain socket 与 protobuf,实现了比 gRPC 更快、更小、更适合容器运行时的通信机制。

本文将介绍:

  • ttrpc 是什么
  • ttrpc 与 gRPC 的区别
  • 如何使用 ttrpc 开发一个服务端和客户端
  • 完整 Demo 与运行方法

✳️ 一、ttrpc 简介

ttrpc 是一个基于 Protobuf 的简化 RPC 框架,主要用于容器运行时如 containerd 与其 shim 之间的通信。相比 gRPC,它去除了 TLS、多路复用、流式接口等复杂功能,专注于在同主机中通过 UNIX socket 进行高性能通信。

✅ 特点

特性ttrpcgRPC
通信协议Protobuf over UNIX socketProtobuf over HTTP/2
TLS 支持❌ 不支持✅ 支持
多路复用❌ 不支持✅ 支持
使用场景本地进程通信(如 shim)网络服务间通信
性能开销✅ 极小❌ 相对较大

🔧 二、环境准备

1. 安装依赖

确保 Go 和 protoc 安装完成:

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install github.com/containerd/ttrpc/cmd/protoc-gen-go-ttrpc@latest

$GOPATH/bin 加入 PATH:

export PATH=$PATH:$HOME/go/bin

📁 三、定义 Protobuf 接口(hello.proto)

创建文件 hello.proto

syntax = "proto3";package hello;service HelloService {rpc SayHello(HelloRequest) returns (HelloReply);
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}

🛠️ 四、生成 ttrpc 代码

执行以下命令生成 Go 文件:

protoc \--go_out=. \--go-ttrpc_out=. \--go_opt=paths=source_relative \--go-ttrpc_opt=paths=source_relative \hello.proto

会生成:

  • hello.pb.go:Protobuf 消息定义
  • hello.ttrpc.pb.go:ttrpc 服务/客户端接口

🚀 五、服务端实现(模拟 shim)

文件:server.go

package mainimport ("context""fmt""net""os""github.com/containerd/ttrpc"pb "yourmodule/hello" // 修改为实际路径
)type helloService struct{}func (s *helloService) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {return &pb.HelloReply{Message: "Hello, " + req.Name}, nil
}func main() {socket := "/tmp/hello.sock"_ = os.Remove(socket)l, err := net.Listen("unix", socket)if err != nil {panic(err)}server := ttrpc.NewServer()pb.RegisterHelloService(server, &helloService{})fmt.Println("shim 服务启动,监听:", socket)if err := server.Serve(context.Background(), l); err != nil {panic(err)}
}

🧑‍💻 六、客户端实现(模拟 containerd)

文件:client.go

package mainimport ("context""fmt""net""time""github.com/containerd/ttrpc"pb "yourmodule/hello" // 修改为实际路径
)func main() {conn, err := net.Dial("unix", "/tmp/hello.sock")if err != nil {panic(err)}defer conn.Close()client := ttrpc.NewClient(conn)defer client.Close()c := pb.NewHelloServiceClient(client)ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)defer cancel()resp, err := c.SayHello(ctx, &pb.HelloRequest{Name: "小诸葛"})if err != nil {panic(err)}fmt.Println("收到响应:", resp.Message)
}

📦 七、运行 demo

1. 运行服务端:

go run server.go

输出:

shim 服务启动,监听: /tmp/hello.sock

2. 启动客户端(新终端):

go run client.go

输出:

收到响应: Hello, 小诸葛

📌 八、总结

ttrpc 提供了一个专为本地通信优化的 RPC 框架,特别适合容器运行时、shim 等无需网络的通信场景:

  • 更快:无 HTTP/TLS 负担
  • 更轻:简单 protobuf 实现
  • 更专注:适用于容器生命周期控制等场景

🧩 附:常见问题排查

问题解决办法
protoc-gen-go-ttrpc not found执行 go install github.com/containerd/ttrpc/cmd/protoc-gen-go-ttrpc@latest 并加入 PATH
import path 错误确保 import "yourmodule/hello" 指向你实际的模块路径
socket 无法连接确保服务端正在运行,socket 路径一致且权限正确
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/258661.html

相关文章:

  • 从零到一训练一个 0.6B 的 MoE 大语言模型
  • 6月24日星期二今日早报简报微语报早读微语早读
  • 代码随想录|图论|02深度优先搜索理论基础
  • JVM(11)——详解CMS垃圾回收器
  • Excel学习04
  • IAR平台全面升级,提升瑞萨MCU架构的嵌入式软件开发效率
  • 从零开始学习 Go 语言:快速入门指南(完整版)
  • 左神算法之数字字符串解码方案计数算法
  • 开篇-认识Gin——Go语言Web框架的性能王者
  • Redis 哨兵模式学习笔记
  • 华为云Flexus+DeepSeek征文 | DeepSeek-V3/R1 商用服务华为云开通指南及使用体验全解析
  • python果蔬种植销售一体化服务系统
  • 对于高考边界的理解以及未来就业层级的学习与思考
  • leetcode114-二叉树展开为链表
  • `docker run -it --rm` 笔记250624
  • 论文笔记(八十六)V-HOP: Visuo-Haptic 6D Object Pose Tracking
  • vue 3 计算器
  • MySql:DDL,增删改查:创建表
  • 【大模型学习】项目练习:套壳DeepSeek
  • 火山 RTC 引擎14 设置CB
  • (LeetCode 面试经典 150 题 )121. 买卖股票的最佳时机 (遍历)
  • 自然语言处理入门
  • 【开源项目】比 PyInstaller 更方便:图形界面打包 Python 脚本的体验
  • 工程优化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信对比
  • PyEcharts教程(009):PyEcharts绘制水球图
  • 常见网络知识,宽带、路由器
  • 【教学类-89-08】20250624新年篇05——元宵节灯笼2CM黏贴边(倒置和正立数字 )
  • 内存泄漏和内存溢出的区别
  • 五种 IO 模式的简单介绍 -- 阻塞 IO,非阻塞 IO,信号驱动 IO,IO 多路复用,异步 IO
  • 使用 PyFluent 自动化 CFD