gRPC 的简单使用

35 min read
  1. 创建proto文件,定义消息结构,和服务

    syntax = "proto3";
    
    package pb;
    
    message Teacher {
        string name =1 ;
        int32 age =2 ;
    
    }
    
    service SayName {
        rpc SayHello(Teacher) returns (Teacher);
    }
    
  2. 编译生成对应的go文件

     ```shell
     protoc --go_out=plugins=grpc:. *.proto
     ```
    
  3. 服务端

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)
}

  1. 客户端
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)
}