2 min read

go的grpc&protobuf简单示例

说明

本文章只是完整示例代码,上一篇文章有对应的环境部署.
代码基本使用的参考文章,修改了细节。

go的grpc&protobuf环境搭建

simple.proto

syntax = "proto3";// 协议为proto3
package proto;
option go_package = "blog.366366.xyz/simplepb"; // 定义Go语言包名

// 定义发送请求信息
message SimpleRequest{
    // 定义发送的参数
    // 参数类型 参数名 标识号(不可重复)
    string data = 1;
}

// 定义响应信息
message SimpleResponse{
    // 定义接收的参数
    // 参数类型 参数名 标识号(不可重复)
    int32 code = 1;
    string value = 2;
}

// 定义我们的服务(可定义多个服务,每个服务可定义多个接口)
service Simple{
    rpc Halo (SimpleRequest) returns (SimpleResponse){};
}

server/test.go

package main

import (
    "context"
    "log"
    "net"
    "google.golang.org/grpc"
    pb "blog.366366.xyz/simplepb"
)

// SimpleService 定义我们的服务
type SimpleService struct {
    pb.UnimplementedSimpleServer
}

// Route 实现Route方法
func (s *SimpleService) Halo(ctx context.Context, req *pb.SimpleRequest) (*pb.SimpleResponse, error) {
    res := pb.SimpleResponse{
        Code:  200,
        Value: "hello " + req.Data,
    }
    return &res, nil
}

const (
    // Address 监听地址
    Address string = ":8000"
    // Network 网络通信协议
    Network string = "tcp"
)

func main() {
    // 监听本地端口
    listener, err := net.Listen(Network, Address)
    if err != nil {
        log.Fatalf("net.Listen err: %v", err)
    }
    log.Println(Address + " net.Listing...")
    // 新建gRPC服务器实例
    grpcServer := grpc.NewServer()
    // 在gRPC服务器注册我们的服务
    pb.RegisterSimpleServer(grpcServer, &SimpleService{})

    //用服务器 Serve() 方法以及我们的端口信息区实现阻塞等待,直到进程被杀死或者 Stop() 被调用
    err = grpcServer.Serve(listener)
    if err != nil {
        log.Fatalf("grpcServer.Serve err: %v", err)
    }
}

client/test.go

package main

import (
    "context"
    "log"

    "google.golang.org/grpc"
    "google.golang.org/grpc/credentials/insecure"

    pb "blog.366366.xyz/simplepb"
)

const (
    // Address 连接地址
    Address string = ":8000"
)

func main() {
    // 连接服务器
    conn, err := grpc.NewClient(Address, grpc.WithTransportCredentials(insecure.NewCredentials())) 
    if err != nil {
        log.Fatalf("net.Connect err: %v", err)
    }
    defer conn.Close()

    // 建立gRPC连接
    grpcClient := pb.NewSimpleClient(conn)

    // 创建发送结构体
    req := pb.SimpleRequest{
        Data: "grpc",
    }

    // 连续发送请求1000次
    for i := 0; i < 1000; i++ {
        // 调用我们的服务(Route方法)
        // 同时传入了一个 context.Context ,在有需要时可以让我们改变RPC的行为,比如超时/取消一个正在运行的RPC
        res, err := grpcClient.Halo(context.Background(), &req)
        if err != nil {
            log.Printf("Call Route err on iteration %d: %v", i, err)
            continue
        }
        // 打印返回值
        log.Printf("Response %d: %v", i, res)
    }
}

参考文章

https://www.cnblogs.com/FireworksEasyCool/p/12674120.html