go grpc 使用案例
1.创建 .proto文件
syntax = "proto3"; option go_package="/proto"; package Business; service Hello { rpc Say (SayRequest) returns (SayResponse); } message SayResponse { bytes Resp = 1; } message SayRequest { string Name = 1; }
2.代码生成命令
protoc --go_out=./ ./hello.proto protoc --go-grpc_out=./ hello.proto
前提条件是必须下载protoc.exe和protoc-gen-go.exe 并且加入环境变量,
3.代码
service代码:
package main import ( "context" "encoding/json" "fmt" "grpchello/proto" "net" "google.golang.org/grpc" "google.golang.org/grpc/reflection" ) type server struct { proto.UnimplementedHelloServer } func (s *server) Say(ctx context.Context, req *proto.SayRequest) (*proto.SayResponse, error) { fmt.Println("request:", req.Name) var aa []string aa = append(aa, "nn", "hh") r := make(map[string]any, 0) r["code"] = 200 r["message"] = "ok" r["result"] = aa ee, _ := json.Marshal(r) return &proto.SayResponse{Resp: ee}, nil } func main() { listen, err := net.Listen("tcp", ":8001") if err != nil { fmt.Printf("failed to listen: %v", err) return } s := grpc.NewServer() proto.RegisterHelloServer(s, &server{}) reflection.Register(s) defer func() { s.Stop() listen.Close() }() fmt.Println("Serving 8001...") err = s.Serve(listen) if err != nil { fmt.Printf("failed to serve: %v", err) return } }
client
package main import ( "context" "log" "google.golang.org/grpc" pb "protobuf/grpc/hello" ) const ( address = "127.0.0.1:8080" ) func main() { conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("客户端连接异常: %v", err) } defer conn.Close() c := pb.NewHelloserverClient(conn)//获取GRPC句柄 r, err := c.SayHello(context.Background(), &pb.HelloRequest{ Name: "哈哈", }) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("####### get server Greeting response: %s", r.Message) }
go run grpc_server.go go run grpc_client.go
返回
{"code":200,"message":"ok","result":["nn","hh"]}