(1) 安装protoc,这是通用的,所有语言都需要
# 下载网址:
https://github.com/protocolbuffers/protobuf/releases/download/v3.9.0/protoc-3.9.0-win64.zip
解压后将将protoc的bin目录添加到环境变量中 如果不会添加环境变量请百度
运行 protoc --version 查看是否已经添加到环境变量
(2)go install github.com/golang/protobuf/protoc-gen-go 我好像没有用到
(3) 新建golang项目 我使用的是goland go版本用1.21 刚开始用1.16会运行不了
在项目新建文件夹 grpc_proto 在此文件夹下编写一个 hello.proto
syntax = "proto3"; // 指定proto版本 package hello_grpc; // 指定默认包名// 指定golang包名 option go_package = "/hello_grpc";//定义rpc服务 service HelloService {// 定义函数 rpc SayHello (HelloRequest) returns (HelloResponse) {} }// HelloRequest 请求内容 message HelloRequest {string name = 1;string message = 2; }// HelloResponse 响应内容 message HelloResponse{string name = 1;string message = 2; }
(4) 在grpc_proto 文件夹下运行 protoc -I . --go_out=plugins=grpc:. .\hello.proto 会在此文件夹下生成一个
hello_grpc 文件夹 hello.grpc文件夹下会有 hello.pb.go
(5)编写客户端和服务端代码 到项目根目录下 go mod tidy 拉取依赖包
编写server.go
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/grpclog""grpc/grpc_proto/hello_grpc""net" )// HelloServer 得有一个结构体,需要实现这个服务的全部方法,叫什么名字不重要 type HelloServer struct { }func (HelloServer) SayHello(ctx context.Context, request *hello_grpc.HelloRequest) (*hello_grpc.HelloResponse, error) {fmt.Println("入参:", request.Name, request.Message)return &hello_grpc.HelloResponse{Name: "server",Message: "hello " + request.Name,}, nil }func main() {// 监听端口listen, err := net.Listen("tcp", ":8080")if err != nil {grpclog.Fatalf("Failed to listen: %v", err)}// 创建一个gRPC服务器实例。s := grpc.NewServer()server := HelloServer{}// 将server结构体注册为gRPC服务。hello_grpc.RegisterHelloServiceServer(s, &server)fmt.Println("grpc server running :8080")// 开始处理客户端请求。err = s.Serve(listen) }
编写client.go
package mainimport ("context""fmt""google.golang.org/grpc""google.golang.org/grpc/credentials/insecure""grpc/grpc_proto/hello_grpc""log" )func main() {addr := ":8080"// 使用 grpc.Dial 创建一个到指定地址的 gRPC 连接。// 此处使用不安全的证书来实现 SSL/TLS 连接conn, err := grpc.Dial(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))if err != nil {log.Fatalf(fmt.Sprintf("grpc connect addr [%s] 连接失败 %s", addr, err))}defer conn.Close()// 初始化客户端client := hello_grpc.NewHelloServiceClient(conn)result, err := client.SayHello(context.Background(), &hello_grpc.HelloRequest{Name: "client",Message: "hello",})fmt.Println(result, err) }
分别运行 go run server.go go run client.go
成功