go 使用 grpc 通讯

2023-08-21 11:25:18 浏览数 (1)

Go是一种强类型、静态编译的语言,grpc是一种高性能的、开源的远程过程调用框架。在Go语言中使用grpc可以轻松地实现跨网络的通信,提供了高效的序列化、压缩和流控制等功能。

下面是一些使用Go语言实现grpc的基本步骤:

  1. 安装gRPC

首先,你需要安装gRPC的Go语言库。可以使用以下命令安装:

代码语言:javascript复制
go get -u google.golang.org/grpc

  1. 编写.proto文件

gRPC使用.proto文件定义消息格式和服务接口。可以使用Proto3语言编写.proto文件。例如:

代码语言:javascript复制
syntax = "proto3";

package helloworld;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

上述.proto文件定义了一个名为Greeter的服务,该服务有一个名为SayHello的方法,该方法接受一个HelloRequest消息并返回一个HelloResponse消息。

  1. 生成Go语言代码

可以使用protoc工具生成Go语言代码,这些代码将用于实现gRPC客户端和服务端。可以使用以下命令生成Go语言代码:

代码语言:javascript复制
cssCopy code
protoc --go_out=plugins=grpc:. *.proto
  1. 编写服务器代码

可以使用生成的Go语言代码编写gRPC服务器。以下是一个简单的gRPC服务器示例:

代码语言:javascript复制
package main

import (
    "context"
    "log"
    "net"

    "google.golang.org/grpc"

    pb "path/to/your/proto/file"
)

type server struct {}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
    return &pb.HelloResponse{Message: "Hello "   req.Name}, nil
}

func main() {
    lis, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    if err := s.Serve(lis); err != nil {
        log.Fatalf("failed to serve: %v", err)
    }
}

  1. 编写客户端代码

可以使用生成的Go语言代码编写gRPC客户端。以下是一个简单的gRPC客户端示例:

代码语言:javascript复制

package main

import (
    "context"
    "log"

    "google.golang.org/grpc"

    pb "path/to/your/proto/file"
)

func main() {
    conn, err := grpc.Dial(":8080", grpc.WithInsecure())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()

    client := pb.NewGreeterClient(conn)
    resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "World"})
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", resp.Message)
}

上述代码创建了一个gRPC客户端连接,并调用

0 人点赞