Skip to content

性能优化 ​

连接复用 ​

go
// 全局复用连接
var conn *grpc.ClientConn

func init() {
    conn, _ = grpc.Dial("localhost:50051",
        grpc.WithTransportCredentials(insecure.NewCredentials()),
        grpc.WithBlock(),
    )
}

连接池配置 ​

go
import "google.golang.org/grpc/keepalive"

kaParams := keepalive.ClientParameters{
    Time:                10 * time.Second,
    Timeout:             3 * time.Second,
    PermitWithoutStream: true,
}

conn, _ := grpc.Dial("localhost:50051",
    grpc.WithKeepaliveParams(kaParams),
)

消息大小 ​

go
// 设置最大消息大小
s := grpc.NewServer(
    grpc.MaxRecvMsgSize(1024*1024*10), // 10MB
    grpc.MaxSendMsgSize(1024*1024*10),
)

压缩 ​

go
import "google.golang.org/grpc/encoding/gzip"

// 客户端压缩
conn, _ := grpc.Dial("localhost:50051",
    grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name)),
)

// 服务端解压
s := grpc.NewServer(grpc.RPCCompressor(gzip.NewCompressor))

性能监控 ​

go
import "google.golang.org/grpc/stats"

// 实现 stats.Handler
type statsHandler struct{}

func (h *statsHandler) TagRPC(ctx context.Context, info *stats.RPCTagInfo) context.Context {
    return ctx
}

func (h *statsHandler) HandleRPC(ctx context.Context, rpcStats stats.RPCStats) {
    // 记录指标
}

参考:https://grpc.io/docs/