grpc官网:https://www.grpc.io/docs/languages/go/quickstart/

安装protobuf编译器protoc

下载protobuf编译器protoc,下载地址: https://github.com/protocolbuffers/protobuf/releases。

下载protoc-21.1-win64.zip

解压,配置环境变量。

安装protoc-gen-go.exe与protoc-gen-go-grpc.exe插件

执行命令前检查go环境变量是否设置为GOOS=windows。否则编译结果文件不是exe格式。

注:github.com/golang/protobuf与github.com/golang/protobuf/protoc-gen-go已被废弃。请使用最新的。

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

在GOPAHT目录下会生成protoc-gen-go.exe与protoc-gen-go-grpc.exe。

编写proto文件

编写data.proto

syntax = "proto3";
package GrpcDemo;
option go_package = "./pb";

/* 服务 */
service HelloService {
  /* 单个请求配置 */
  rpc HelloInfo(HelloInfoRequest) returns (HelloInfoReply) {}  // 请求主体
}


/* 请求主体对应单个请求配置 */

// 请求主体结构
message HelloInfoRequest {
  string name = 1;
}
message HelloInfoReply {
  string name = 1;
}

执行:

protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --gogrpc_opt=paths=source_relative
data.proto

生成:data.pb.go与data_grpc.pb.go接口文件

编写grpc_server服务端

添加grpc依赖:

go get google.golang.org/grpc

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"grpc_server/pb"
	"log"
	"net"
)

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

type HelloService struct {
}

func (helloService *HelloService) HelloInfo(ctx context.Context, request *pb.HelloInfoRequest) (*pb.HelloInfoReply, error) {
	//panic("implement me")
	fmt.Println(request.GetName())

	return &pb.HelloInfoReply{
		Name: request.GetName()+",rpc server response",
	},nil
}

func (helloService *HelloService) mustEmbedUnimplementedHelloServiceServer() {
	panic("implement me")
}


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服务器注册我们的服务
	RegisterHelloServiceServer(grpcServer,&HelloService{})
	//pb.RegisterStreamClientServer(grpcServer, &SimpleService{})

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

编写grpc_client客户端

package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"grpc_client/pb"
)

const GrpcHost = ":8000"

func main() {

	con, err := grpc.Dial(GrpcHost, grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		fmt.Println(err)
		return
	}

	helloService := NewHelloServiceClient(con)
	info, err := helloService.HelloInfo(context.Background(), &pb.HelloInfoRequest{Name: "rpc_client"})
	if err != nil {
		return
	}

	fmt.Println(info.Name)
}

测试验证

服务端

2022/06/10 09:54:22 :8000 net.Listing...
rpc_client
rpc_client
rpc_client

客服端

rpc_client,rpc server response

Process finished with the exit code 0