第一步:安装 protoc 前往 protobuf,整写下载最新版的整写 protoc ,我下载的整写是 win 64 第二步:安装 protoc-gen-go 前往 protobuf-go ,同样下载最新版的整写 protoc,同样下载的整写是 win 64 将下载后的 protoc.exe 和 protoc-gen-go 放到 %GOPATH%\bin\ 目录下。 或者更简单的整写方法,站群服务器直接执行如下命令就可以安装 第三步:下载 grpc 在 $GOPATH/src 下新建 iswbm.com 目录及三个子目录(client,整写server,整写proto),整写在终端上进入该目录,整写执行如下命令创建 go.mod 编写 proto/simple.proto 在 iswbm.com 目录下,整写执行如下命令 完成后,整写会在当前目录下生成一个 simple 目录,整写该目录下有一个 simple.pb.go 和 simple_grpc.pb.go 完成后,先安装依赖包 执行如下命令运行服务端 执行如下命令运行,立马就能收到来自 server 返回的消息 同时,在 server 端也会打印来自 client 端的消息# 1. 环境准备
# 2. 项目目录结构
# 3. 编写 proto 文件
# 4. 编写 server.go
package main import ( "context" pb "iswbm.com/proto" "google.golang.org/grpc" "log" "net" ) const ( Address string = ":8000" Network string = "tcp" ) // 定义我们的云服务器服务 type SimpleService struct{ pb.UnimplementedSimpleServer } // 实现 GetSimpleInfo 方法 func (s *SimpleService) GetSimpleInfo(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) { data := req.Data log.Println("get from client: ", data) resp := &pb.SimpleResponse{ Code: 8888, Value: "grpc", } return resp, nil } func main() { // 1.监听端口 listener, err := net.Listen(Network, Address) if err != nil { log.Fatalf("net.listen err: %v", err) } log.Println(Address, " net listening...") // 2.实例化gRPC服务端 grpcServer := grpc.NewServer() // 3.注册我们实现的服务 SimpleService pb.RegisterSimpleServer(grpcServer, &SimpleService{ }) // 4.启动gRPC服务端 err = grpcServer.Serve(listener) if err != nil { log.Fatalf("grpc server err: %v",err) } } # 5. 编写 client.go
package main import ( "context" "google.golang.org/grpc" "log" pb "iswbm.com/proto" ) const ( Address string = ":8000" ) func main() { // 1.创建于gRPC服务端的连接 conn, err := grpc.Dial(Address, grpc.WithInsecure()) if err != nil { log.Fatalf("dial conn err: %v", err) } defer conn.Close() // 2.创建grpc客户端 client := pb.NewSimpleClient(conn) // 3.调用服务端提供的服务 req := pb.SimpleRequest{ Data: "Hello,Server", } resp, err := client.GetSimpleInfo(context.Background(), &req) if err != nil { log.Fatalf("resp err: %v", err) } log.Printf("get from server,code: %v,value: %v", resp.Code, resp.Value) }