-
创建proto文件,定义消息结构,和服务
syntax = "proto3"; package pb; message Teacher { string name =1 ; int32 age =2 ; } service SayName { rpc SayHello(Teacher) returns (Teacher); }
-
编译生成对应的go文件
```shell protoc --go_out=plugins=grpc:. *.proto ```
-
服务端
package main import ( "context" "fmt" "go-rpc/pb" "net" "google.golang.org/grpc" ) type Foo struct{} func (f *Foo) SayHello(ctx context.Context, t *pb.Teacher) (*pb.Teacher, error) { t.Name += "hello" return t, nil } func main() { // 初始化grpc对象 grpcServer := grpc.NewServer() // 注意服务 pb.RegisterSayNameServer(grpcServer, new(Foo)) // 监听 l, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println(err) } defer l.Close() // 启动服务 // rpc.ServeConn(c) grpcServer.Serve(l) }
- 客户端
package main import ( "context" "fmt" "go-rpc/pb" "google.golang.org/grpc" ) func main() { cc, err := grpc.Dial("127.0.0.1:8080", grpc.WithInsecure()) if err != nil { fmt.Println(err) } defer cc.Close() sayClient := pb.NewSayNameClient(cc) p := pb.Teacher{ Name: "22", } t, err := sayClient.SayHello(context.TODO(), &p) if err != nil { fmt.Println(err) } fmt.Println(t) }