golang使用grpc的demo

You

golang使用grpc的demo

Genie

好的,这里是一个简单的 golang 使用 grpc 的示例代码:

1. 安装 gRPC 和 protobuf

首先需要安装 gRPC 和 protobuf 的支持库。可以在终端中使用以下命令来安装:

go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go

2. 编写 .proto 文件并生成 gRPC 代码

我们需要编写一个 .proto 文件来定义服务和消息类型,并通过 protoc 工具来生成 Golang 代码。

这里是一个简单的示例 proto 文件,定义了一个名为 HelloService 的服务和 HelloRequest/HelloResponse 两种消息类型:

syntax = "proto3";

package hello;

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

message HelloRequest {
    string name = 1;
}

message HelloResponse {
    string message = 1;
}

然后通过以下命令可以生成 Golang 代码:

protoc --go_out=plugins=grpc:. hello.proto

这将生成一组与 proto 文件对应的 Golang 接口和结构体实现。

3. 实现服务端

接下来,我们需要使用生成的代码来实现服务端。

package main

import (
	"context"
	"log"
	"net"

	pb "path/to/your/generated/code"

	"google.golang.org/grpc"
)

type server struct{}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
	log.Printf("Received: %v", req.GetName())
	return &pb.HelloResponse{Message: "Hello " + req.GetName()}, nil
}

func main() {
	listener, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}

	srv := grpc.NewServer()
	pb.RegisterHelloServiceServer(srv, &server{})

	if err := srv.Serve(listener); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

4. 实现客户端

最后,我们需要使用生成的代码来实现客户端。

package main

import (
	"context"
	"log"

	pb "path/to/your/generated/code"
	"google.golang.org/grpc"
)

func main() {
	conn, err := grpc.Dial(":50051", grpc.WithInsecure())
	if err != nil {
		log.Fatalf("failed to dial: %v", err)
	}
	defer conn.Close()

	client := pb.NewHelloServiceClient(conn)
	resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "World"})
	if err != nil {
		log.Fatalf("failed to call: %v", err)
	}

	log.Printf("Response: %s", resp.GetMessage())
}

这里我们首先通过 Dial 方法与服务端建立连接,然后调用 client 的 SayHello 方法发送消息并获取响应。

以上就是一个简单的 gRPC 示例。需要注意的是,为了使示例更加易于理解,我没有涉及错误处理,实际使用时需要根据需求进行完善。

posted @ 2023-04-10 11:13  西门飘柔  阅读(134)  评论(0编辑  收藏  举报