go编译proto文件
先安装protoc
链接
下载后将bin目录添加到path
protoc本身并不支持Golang,需要额外安装对应的插件
方法1,使用go install @latest安装
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
方法2,在一个已经包含go.mod文件的项目里使用go get <module>
go get google.golang.org/protobuf/cmd/protoc-gen-go
go get google.golang.org/grpc/cmd/protoc-gen-go-grpc
安装成功后,会在$GOPATH/bin目录下生成两个2进制文件
protoc-gen-go
protoc-gen-go-grpc
参考 https://blog.csdn.net/weixin_42216109/article/details/125273585
proto文件
goods.proto
syntax = "proto3";
option go_package = "./;hello2";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
编译
protoc --go_out=. --go-grpc_out=. goods.proto
server代码
package main
import (
"context"
"fmt"
pb "gostudy/gRPC_01/proto"
"net"
"google.golang.org/grpc"
)
type Server struct {
// 增加此行代码
*pb.UnimplementedGreeterServer
}
func (s *Server) mustEmbedUnimplementedGreeterServer() {
//TODO implement me
//panic("implement me")
}
func (s *Server) SayHello(ctx context.Context, request *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello " + request.Name}, nil
}
func main() {
g := grpc.NewServer()
pb.RegisterGreeterServer(g, &Server{})
lis, err := net.Listen("tcp", fmt.Sprintf(":8080"))
if err != nil {
panic("failed to listen: " + err.Error())
}
g.Serve(lis)
}
client代码
package main
import (
"context"
"fmt"
pb "gostudy/gRPC_01/proto"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure())
if err != nil {
panic(err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
r, err := c.SayHello(context.Background(), &pb.HelloRequest{Name: "bobby"})
if err != nil {
panic(err)
}
fmt.Println(r.Message)
}