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