这里写自定义目录标题
Go gRPC简单例子
文件列表
.
├───client
│ main.go
│
├───proto
│ toupper.pb.go
│ toupper.proto
│
└───server
main.go
源码
# cat proto/toupper.proto
syntax = "proto3";
package proto;
option go_package="../proto;proto";
service ToUpper {
rpc Upper(UpperRequest) returns (UpperReply) {}
}
message UpperRequest {
string name = 1;
}
message UpperReply {
string message = 1;
}
服务端
# cat server/main.go
package main
import (
pb "../proto"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/reflection"
"log"
"net"
"strings"
)
const (
port = ":50001"
)
type server struct{}
func (s *server) Upper(ctx context.Context, in *pb.UpperRequest) (*pb.UpperReply, error) {
log.Printf("received: %s ", in.Name)
return &pb.UpperReply{Message: strings.ToUpper(in.Name)}, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterToUpperServer(s, &server{})
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
客户端
# cat client/main.go
package main
import (
pb "../proto"
"golang.org/x/net/context"
"google.golang.org/grpc"
"log"
"os"
)
const (
address = "127.0.0.1:50001"
)
func main() {
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatal("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewToUpperClient(conn)
name := "hello world"
if len(os.Args) > 1 {
name = os.Args[1]
}
r, err := c.Upper(context.Background(), &pb.UpperRequest{Name: name})
if err != nil {
log.Fatalf("cloud not greet: %v", err)
}
log.Printf("Response: %s", r.Message)
}
备注
服务端先监听TCP端口,再grpc注册服务,并加入反射。
客户端链接TCP端口,创建RPC客户端,调用方法传入数据,获取返回数据。