grpc 初探

 : jank    :   : 181    : 2020-10-29 08:00  rpc

一、grpc使用

1.前期准备

1.1.安装protobuf:

  安装c/c++:yum install gcc yum install gcc-c++ libstdc++-devel

安装protoc通过源码编译安装:

git clone https://github.com/protocolbuffers/protobuf.git--depth=1

通过安装包安装:        

 wget https://github.com/protocolbuffers/protobuf/releases/download/v3.12.0/protobuf-all-3.12.0.tar.gz 

 tar -zxvf ./protobuf-all-3.12.0.tar.gz 

cd protobuf-all-3.12.0

./configuremake && make install


1.2.安装protobuf golang 插件

git clone https://github.com/protocolbuffers/protobuf-go.gitcd protobuf/protoc-gen-go && go install 


1.3.执行命令生成对应的.pb.go文件

protoc --go_out=$DST_DIR $SRC_DIR/addressbook.proto #使用grpc用例,

默认方法 protoc ./helloworld.proto --go_out=plugins=grpc:. #使用go grpc 插件

 

1.4 在 server 端 和 客户端中都引用.pb.go 文件,.pb.go 即protoc自动生成的客户端和服务端交互的媒介。

 

 

使用示例流程

//服务端
package main
 
import (
"context"
"log"
"net"
 
"google.golang.org/grpc"
    pb "google.golang.org/grpc/examples/helloworld/helloworld"
)
 
const (
    port = ":50051"
)
 
// server is used to implement helloworld.GreeterServer.
type server struct {
    pb.UnimplementedGreeterServer
}
 
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    log.Printf("Received: %v", in.GetName())
    return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}
 
func main() {
    lis, err := net.Listen("tcp", port) //listen a tcp server
    if err != nil {
        log.Fatalf("failed to listen: %v", err)
    }
    s := grpc.NewServer() //新建一个grpc server
    pb.RegisterGreeterServer(s, &server{}) //注册proto中的服务
    if err := s.Serve(lis); err != nil {     //开始运行grpc服务
        log.Fatalf("failed to serve: %v", err)
    }
 }
 
//客户端
package main
 
import (
    "context"
    "log"
    "os"
    "time"
 
    "google.golang.org/grpc"
    pb "google.golang.org/grpc/examples/helloworld/helloworld"
)
 
const (
    address     = "localhost:50051"
    defaultName = "world"
)
 
func main() {
    // Set up a connection to the server.
    conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())
    if err != nil {
        log.Fatalf("did not connect: %v", err)
    }
    defer conn.Close()
    c := pb.NewGreeterClient(conn)
 
    // Contact the server and print out its response.
    name := defaultName
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()
    r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name}) //use invoke
    if err != nil {
        log.Fatalf("could not greet: %v", err)
    }
    log.Printf("Greeting: %s", r.GetMessage())
    time.Sleep(time.Hour)
}


   

备案编号:赣ICP备15011386号

联系方式:qq:1150662577    邮箱:1150662577@qq.com