美文网首页
go语言实现的rpc简单示例

go语言实现的rpc简单示例

作者: 追梦人在路上不断追寻 | 来源:发表于2024-02-20 12:41 被阅读0次

    1. 创建一个新的 Go 项目目录

    mkdir grpc_example
    cd grpc_example
    

    2. 定义 .proto 文件

    先创建pb文件夹,然后进入里面创建.proto文件。

    mkdir pb
    cd pb
    
    syntax = "proto3";
    
    package helloworld;
    
    option go_package = ".";
    
    service Greeter {
      rpc SayHello (HelloRequest) returns (HelloReply) {}
    }
    
    message HelloRequest {
      string name = 1;
    }
    
    message HelloReply {
      string message = 1;
    }
    
    

    3. 使用 protoc 工具生成 Go 代码

    protoc --go_out=. --go-grpc_out=. helloworld.proto
    

    这里需要注意的是需要安装protoc工具,并且还要安装golang关于protoc的命令行工具。

    sudo apt update
    sudo apt install protobuf-compiler
    
    # 安装 protoc-gen-go 和 protoc-gen-go-grpc
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    

    4. 创建服务端代码 server.go

    package main
    
    import (
        "context"
        "fmt"
        "net"
    
        "google.golang.org/grpc"
        "google.golang.org/grpc/reflection"
    
        pb "path/to/your/grpc_example/pb" // 替换为生成的 pb 包的实际路径
    )
    
    type server struct{
            pb.UnimplementedGreeterServer // 嵌入 UnimplementedGreeterServer 结构体
    
    }
    
    func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
        return &pb.HelloReply{Message: "Hello " + in.Name}, nil
    }
    
    func main() {
        lis, err := net.Listen("tcp", ":50051")
        if err != nil {
            fmt.Println("failed to listen: ", err)
            return
        }
        s := grpc.NewServer()
        pb.RegisterGreeterServer(s, &server{})
        reflection.Register(s)
        fmt.Println("server started at :50051")
        if err := s.Serve(lis); err != nil {
            fmt.Println("failed to serve: ", err)
            return
        }
    }
    

    5. 创建客户端代码

    package main
    
    import (
        "context"
        "fmt"
        "log"
    
        pb "github.com/xxx/grpc_example/pb" 
        "google.golang.org/grpc"
    )
    
    func main() {
        conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
        if err != nil {
            log.Fatalf("failed to connect: %v", err)
        }
        defer conn.Close()
        c := pb.NewGreeterClient(conn)
    
        name := "world"
        r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: name})
        if err != nil {
            log.Fatalf("failed to call SayHello: %v", err)
        }
        fmt.Println("Greeting:", r.Message)
    }
    

    代码结构

    .
    ├── client.go
    ├── go.mod
    ├── go.sum
    ├── pb
    │   ├── helloworld_grpc.pb.go
    │   ├── helloworld.pb.go
    │   └── helloworld.proto
    ├── readme.txt
    └── server.go
    
    1 directory, 8 files
    

    相关文章

      网友评论

          本文标题:go语言实现的rpc简单示例

          本文链接:https://www.haomeiwen.com/subject/msebadtx.html