golang高性能可插拔RPC框架插件库trpc-go的使用

golang高性能可插拔RPC框架插件库trpc-go的使用

tRPC-Go是tRPC框架的Go语言实现,它是一个可插拔、高性能的RPC框架。

主要特性

  • 单个进程内可启动多个服务,监听多个地址
  • 所有组件均可插拔,各种基础功能都有默认实现并可替换,其他组件可由第三方实现并注册到框架中
  • 所有接口均可mock测试,使用gomock&mockgen生成mock代码方便测试
  • 框架支持任意第三方协议,只需实现对应协议的codec接口即可,默认支持trpc和http协议并可随时切换
  • 提供trpc命令行工具用于生成代码模板

架构图

Architecture

快速开始示例

下面是一个简单的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

1 回复

更多关于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. 性能优化建议

  1. 使用连接池:客户端默认启用连接池,可通过配置调整
  2. 合理设置超时:避免请求长时间阻塞
  3. 启用压缩:对于大数据量传输可配置压缩
  4. 使用批处理:对于高频小请求可合并处理

trpc-go提供了丰富的功能和良好的扩展性,适合构建高性能分布式系统。通过插件系统可以轻松集成各种中间件和工具,满足不同业务场景需求。

回到顶部