golang实现高性能HTTP/2 RPC通信的gRPC框架插件库grpc-go的使用
Golang实现高性能HTTP/2 RPC通信的gRPC框架插件库grpc-go的使用
简介
grpc-go是Go语言实现的gRPC框架,它是一个高性能、开源的通用RPC框架,基于HTTP/2协议设计,特别适合移动和HTTP/2场景。
前提条件
- Go: 需要安装最新的两个主要版本之一
安装
只需在代码中添加以下导入,然后go [build|run|test]
会自动获取必要的依赖:
import "google.golang.org/grpc"
注意: 如果你在中国访问
grpc-go
遇到问题,请参考下面的FAQ部分。
完整示例Demo
下面是一个完整的gRPC服务端和客户端通信示例:
1. 定义proto文件 (hello.proto)
syntax = "proto3";
package hello;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
2. 生成Go代码
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
hello.proto
3. 服务端实现 (server.go)
package main
import (
"context"
"log"
"net"
pb "path/to/your/hello" // 替换为你的包路径
"google.golang.org/grpc"
)
const (
port = ":50051"
)
// server 用于实现Greeter服务
type server struct {
pb.UnimplementedGreeterServer
}
// SayHello 实现Greeter服务的SayHello方法
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("Received: %v", in.GetName())
return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
log.Printf("server listening at %v", lis.Addr())
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
4. 客户端实现 (client.go)
package main
import (
"context"
"log"
"os"
"time"
pb "path/to/your/hello" // 替换为你的包路径
"google.golang.org/grpc"
)
const (
address = "localhost:50051"
defaultName = "world"
)
func main() {
// 建立到服务器的连接
conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
// 从命令行参数获取名字,如果没有则使用默认值
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
// 调用SayHello RPC方法
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.GetMessage())
}
常见问题
I/O超时错误
如果你在中国,可能会遇到golang.org
域名被屏蔽的问题。解决方案:
- 设置VPN访问google.golang.org
- 使用Go模块的replace功能:
go mod edit -replace=google.golang.org/grpc=github.com/grpc/grpc-go@latest
go mod tidy
go mod vendor
go build -mod=vendor
编译错误: undefined: grpc.SupportPackageIsVersion
请更新到最新版本的grpc-go:
go get google.golang.org/grpc
如何开启日志
通过环境变量控制默认日志记录器:
export GRPC_GO_LOG_VERBOSITY_LEVEL=99
export GRPC_GO_LOG_SEVERITY_LEVEL=info
RPC失败错误: “code = Unavailable desc = transport is closing”
这个错误意味着RPC使用的连接被关闭了,可能的原因包括:
- 传输凭证配置错误,握手失败
- 字节传输中断,可能是中间有代理
- 服务器关闭
- Keepalive参数导致连接关闭
了解更多
- Go gRPC文档,包括快速入门和API参考等资源
- 本仓库中的底层技术文档
- 性能基准测试
- 示例代码
- 贡献指南
更多关于golang实现高性能HTTP/2 RPC通信的gRPC框架插件库grpc-go的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复