インストール1.
コンパイラprotocをインストール1.
それは、私たちは、さまざまな言語に翻訳されたコード.proto文書を書くことができます
ダウンロード
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.11.4/protoc-3.11.4-linux-x86_64.zip
減圧
unzip protoc-3.11.4-linux-x86_64.zip
コピーは
なりますprotoc-3.11.4-linux-x86_64/bin
下のprotoc
ファイルがコピーされているGOPATH
次の
だろうprotoc-3.11.4-linux-x86_64/include
にgoogle
にコピーされたフォルダ/usr/local/include
のディレクトリ
2. grpcインストール
直接ので、次のように置き換えられ、壁によって、インストールエラーを取りに行きます
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
エラー上記のインストールが最後の時間であってもよいし、cannot find package "golang.org/x/sys/unix" in any of:golang.org
(次のエラーがうまく、このステップをスキップしていない場合)、壁の上に必要な、それはこの方法に従うことによって解決することができます
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/sys.git
残りをインストールします。
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
インストールが成功しなかった何か、そして出力
2.書き込みプロトファイル、必要な言語コードにコンパイル(golang)
1. hello.protoを作成することは
、実際にサービスの定義です、そしてその背後にインターフェイスを実装する必要があります
syntax = "proto3"
package hello;
service HelloService {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
int age = 2;
}
message HelloReply {
string time = 1;
}
2.コンパイル
protoc --go_out=plugins=grpc:. *.proto
現在のフォルダのファイルに生成されますhello.pb.go
3.ツリー
grpctest/
├── client
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ └── proto
│ └── hello
│ ├── hello.pb.go
│ └── hello.proto
└── server
├── go.mod
├── go.sum
├── handler
│ └── handler.go
├── proto
│ └── hello
│ ├── hello.pb.go
│ └── hello.proto
└── service.go
定義されたサービスを実装し、開始4
1.でserver/handler/handler.go
ファイル構造の定義、およびだけで実現するSayHello
方法を
package handler
import (
"context"
"fmt"
hellopb "server/proto/hello"
"time"
)
type hellosrv struct {}
func NewHelloSrv() hellopb.HelloServiceServer {
return &hellosrv{}
}
func (*hellosrv)SayHello(ctx context.Context, in *hellopb.HelloRequest) (*hellopb.HelloReply, error) {
fmt.Println("姓名:", in.Name, "年龄:", in.Age)
var time string = time.Now().String()
return &hellopb.HelloReply{Time: time}, nil
}
2.でserver/service.go
サービスファイルを開始する準備
package main
import (
"fmt"
"net"
hellopb "server/proto/hello"
"server/handler"
"google.golang.org/grpc"
)
const (
PORT = ":7778"
)
func main() {
lis, err := net.Listen("tcp", PORT)
if err != nil {
fmt.Println(err)
}
grpcService := grpc.NewServer()
//注册服务
hellopb.RegisterHelloServiceServer(grpcService, handler.NewHelloSrv())
if err := grpcService.Serve(lis); err != nil {
fmt.Println(err)
}
}
3.サービス開始
go run service.go
クライアントは、サービスを呼び出します
1.上記で生成されたコンパイルする必要があるhello.pb.go
ファイルのコピーが続く、最初に来たclient/main.go
サービスの呼び出し
package main
import (
hellopb "client/proto/hello"
"google.golang.org/grpc"
"context"
"fmt"
"time"
)
const (
ADDRESS = "127.0.0.1:7778"
)
func main() {
conn, err := grpc.Dial(ADDRESS, grpc.WithInsecure())
if err != nil {
fmt.Println(err)
}
defer conn.Close()
client := hellopb.NewFirstServiceClient(conn)
resp, err := client.SayHello(context.Background(), &hellopb.HelloRequest{Name: "lubenwei", Age: "21"})
if err != nil {
fmt.Println(err)
}
fmt.Println(resp.Time)
}
2.テスト
go run main.go
クライアントの出力:
2020-03-31 16:46:04.018755957 +0800 CST m=+5.300707152
server
出力:
姓名: lubenwei 年龄: 21