golang高性能可插拔RPC框架插件库trpc-go的使用
golang高性能可插拔RPC框架插件库trpc-go的使用
tRPC-Go是tRPC框架的Go语言实现,它是一个可插拔、高性能的RPC框架。
主要特性
- 单个进程内可启动多个服务,监听多个地址
- 所有组件均可插拔,各种基础功能都有默认实现并可替换,其他组件可由第三方实现并注册到框架中
- 所有接口均可mock测试,使用gomock&mockgen生成mock代码方便测试
- 框架支持任意第三方协议,只需实现对应协议的codec接口即可,默认支持trpc和http协议并可随时切换
- 提供trpc命令行工具用于生成代码模板
架构图
快速开始示例
下面是一个简单的tRPC-Go服务端和客户端示例:
服务端代码
package main
import (
"context"
"fmt"
"trpc.group/trpc-go/trpc-go"
"trpc.group/trpc-go/trpc-go/log"
pb "your.package.path/helloworld" // 替换为你的protobuf生成代码路径
)
// GreeterServer 实现服务接口
type GreeterServer struct{}
// SayHello 实现Hello方法
func (s *GreeterServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
log.Infof("Received request: %v", req.Name)
return &pb.HelloReply{Message: fmt.Sprintf("Hello %s!", req.Name)}, nil
}
func main() {
// 创建服务
s := trpc.NewServer()
// 注册服务实现
pb.RegisterGreeterService(s, &GreeterServer{})
// 启动服务
if err := s.Serve(); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
客户端代码
package main
import (
"context"
"fmt"
"trpc.group/trpc-go/trpc-go"
"trpc.group/trpc-go/trpc-go/client"
"trpc.group/trpc-go/trpc-go/log"
pb "your.package.path/helloworld" // 替换为你的protobuf生成代码路径
)
func main() {
// 创建客户端代理
proxy := pb.NewGreeterClientProxy(
client.WithTarget("ip://127.0.0.1:8000"), // 服务地址
)
// 调用服务
req := &pb.HelloRequest{Name: "tRPC-Go"}
rsp, err := proxy.SayHello(context.Background(), req)
if err != nil {
log.Fatalf("failed to call SayHello: %v", err)
}
fmt.Printf("Response: %s\n", rsp.Message)
}
配置文件示例
通常需要一个trpc_go.yaml配置文件:
server:
service:
- name: trpc.app.server.service # 服务名
ip: 127.0.0.1 # 监听IP
port: 8000 # 监听端口
protocol: trpc # 协议类型
timeout: 1000 # 请求超时时间(ms)
client:
timeout: 1000 # 客户端默认超时时间(ms)
插件使用示例
tRPC-Go支持各种插件,例如使用日志插件:
import (
"trpc.group/trpc-go/trpc-go/log"
)
func main() {
// 配置日志
logConfig := `
{
"level": "debug",
"formatter": "json",
"writers": [
{
"writer": "console"
}
]
}`
// 设置日志
if err := log.Setup(log.WithConfig(logConfig)); err != nil {
panic(err)
}
log.Debug("This is a debug message")
log.Info("This is an info message")
log.Error("This is an error message")
}
生成代码
可以使用trpc命令行工具生成代码:
# 安装trpc命令行工具
go install trpc.group/trpc-go/trpc-cmdline/trpc@latest
# 生成代码
trpc create -p helloworld.proto -o out
生态系统
tRPC-Go有丰富的插件生态系统:
- 编解码插件
- 过滤器插件
- 数据库插件
- 更多…
总结
tRPC-Go是一个功能强大、可扩展的RPC框架,通过上面的示例可以快速上手。更多详细用法可以参考官方文档和示例代码。
更多关于golang高性能可插拔RPC框架插件库trpc-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高性能可插拔RPC框架插件库trpc-go的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
trpc-go RPC框架插件库使用指南
trpc-go是腾讯开源的一款高性能、可插拔的RPC框架,支持多种协议和插件扩展。下面我将详细介绍如何使用trpc-go构建RPC服务。
1. 安装与基础配置
首先安装trpc-go核心库和代码生成工具:
go get git.code.oo.tencent.com/trpc-go/trpc-go
go install git.code.oo.tencent.com/trpc-go/trpc-go/cmd/trpc
2. 创建服务项目结构
典型的trpc项目结构如下:
.
├── go.mod
├── go.sum
├── main.go # 服务入口
├── stub # 协议文件目录
│ └── helloworld
│ └── helloworld.proto
└── trpc_go.yaml # 配置文件
3. 定义Proto协议
在stub/helloworld/helloworld.proto
中定义服务:
syntax = "proto3";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
4. 生成代码
使用trpc工具生成代码:
trpc create -p stub/helloworld/helloworld.proto -o stub/helloworld
5. 实现服务端
在main.go
中实现服务:
package main
import (
"context"
"fmt"
"git.code.oo.tencent.com/trpc-go/trpc-go"
"git.code.oo.tencent.com/trpc-go/trpc-go/log"
pb "your_module_path/stub/helloworld"
)
type greeterServer struct{}
func (s *greeterServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
log.Infof("Received request: %v", req.GetName())
return &pb.HelloReply{Message: "Hello " + req.GetName()}, nil
}
func main() {
s := trpc.NewServer()
pb.RegisterGreeterService(s, &greeterServer{})
if err := s.Serve(); err != nil {
log.Fatal(err)
}
}
6. 配置trpc_go.yaml
server:
app: test
server: helloworld
service:
- name: trpc.test.helloworld.Greeter
ip: 127.0.0.1
port: 8000
protocol: trpc
network: tcp
7. 客户端调用
package main
import (
"context"
"fmt"
"time"
"git.code.oo.tencent.com/trpc-go/trpc-go"
"git.code.oo.tencent.com/trpc-go/trpc-go/client"
pb "your_module_path/stub/helloworld"
)
func main() {
proxy := pb.NewGreeterClientProxy(
client.WithTarget("ip://127.0.0.1:8000"),
client.WithTimeout(time.Second*3),
)
ctx := trpc.BackgroundContext()
rsp, err := proxy.SayHello(ctx, &pb.HelloRequest{Name: "trpc-go"})
if err != nil {
panic(err)
}
fmt.Println("Response:", rsp.Message)
}
8. 插件系统使用
trpc-go支持丰富的插件系统,下面演示如何使用日志和监控插件:
8.1 日志插件
import (
"git.code.oo.tencent.com/trpc-go/trpc-go/log"
)
func main() {
// 设置日志级别
log.SetLevel(log.LevelDebug)
// 记录日志
log.Debug("debug message")
log.Info("info message")
log.Warn("warn message")
log.Error("error message")
}
8.2 监控插件
import (
"git.code.oo.tencent.com/trpc-go/trpc-go/metrics"
)
func main() {
// 记录计数器
metrics.IncrCounter("request.count", 1)
// 记录耗时
start := time.Now()
// ... 业务逻辑
metrics.RecordTimer("request.latency", time.Since(start))
}
9. 高级特性
9.1 拦截器使用
func LoggingInterceptor(ctx context.Context, req interface{}, info *server.RPCInfo, handler server.Handler) (interface{}, error) {
log.Infof("Before call: %s", info.Method)
rsp, err := handler(ctx, req)
log.Infof("After call: %s, err: %v", info.Method, err)
return rsp, err
}
func main() {
s := trpc.NewServer(
server.WithInterceptor(LoggingInterceptor),
)
// ... 注册服务
}
9.2 多协议支持
trpc-go支持多种协议,只需修改配置文件:
service:
- name: trpc.test.helloworld.Greeter
ip: 127.0.0.1
port: 8000
protocol: http # 支持trpc/http/grpc等
network: tcp
10. 性能优化建议
- 使用连接池:客户端默认启用连接池,可通过配置调整
- 合理设置超时:避免请求长时间阻塞
- 启用压缩:对于大数据量传输可配置压缩
- 使用批处理:对于高频小请求可合并处理
trpc-go提供了丰富的功能和良好的扩展性,适合构建高性能分布式系统。通过插件系统可以轻松集成各种中间件和工具,满足不同业务场景需求。