1. 程式人生 > >gRPC遠端過程呼叫之golang

gRPC遠端過程呼叫之golang

gRPC是Google出品,支援多種語言,但是國內安裝會有點問題,下面整理一下,方便今後配環境的複習。

安裝grpc

go get google.golang.org/grpc

結果出現瞭如下錯誤:

package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc"(https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
 
cd $GOPATH/src/
go install google.golang.org/grpc

安裝protocal buffer compiler

https://github.com/google/protobuf/releases

下載後使用原始碼安裝,固定套路為:

tar -zxvf xxxx.tar.gz
cd xxxx/
./configure
make
make install

漫長等待後,就完事了。不過這次還沒完,好像是需要將一個環境變數加到path中。

export LD_LIBRARY_PATH=/usr/local/lib

建立proto檔案

helloworld.proto 放到 $GOPATH/src/helloworld 目錄下,方便自己待會的引用。

syntax = "proto3";

package grpcusage;

service Hello {
    rpc SayHello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
    string Name = 1;
}

message HelloReply {
    string Message = 1;
}

然後通過protoc 根據此模板來生成對應的golang的grpc程式碼

#格式 protoc --go_out=plugins=grpc:{go程式碼輸出路徑} {proto檔案}
protoc --go_out=plugins=grpc:./ ./helloworld.proto

gRPC程式碼編寫

server.go

package main

import (
	"golang.org/x/net/context"
	pb "helloworld"

	"net"
	"log"
	"google.golang.org/grpc"
	"fmt"
)

const (
	port = ":50051"
)

type Server struct {}

func (s *Server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	return &pb.HelloReply{
		Message: "hello " + in.Name,
	}, nil
}

func main() {
	conn, err := net.Listen("tcp", port)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("grpc server listening at: 50051 port")
	server := grpc.NewServer()
	pb.RegisterHelloServer(server, &Server{})
	server.Serve(conn)
}

client.go

package main

import (
	"google.golang.org/grpc"
	"log"
	pb "helloworld"
	"os"
	"context"
		"fmt"
)

const (
	address = "localhost:50051"
	defaultName = "郭璞"
)

func main()  {
	conn, err := grpc.Dial(address, grpc.WithInsecure())
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	client := pb.NewHelloClient(conn)

	name := defaultName
	if len(os.Args) > 1 {
		name = os.Args[1]
	}
	request, err := client.SayHello(context.Background(), &pb.HelloRequest{Name:name})
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(request.Message)
}

測試服務

啟動server端程式。

➜  grpcusage go run server.go
grpc server listening at: 50051 port

啟動client程式

➜  client go run client.go
hello 郭璞
➜  client

如此便實現了grpc在golang中的簡單使用,暫且記錄下,以備不時之需。