近年、インターネット技術の急速な発展とクラウド コンピューティングの台頭により、リモート プロシージャ コール (RPC) が開発者からますます注目を集めています。 Go 言語自体は軽量で、豊富なライブラリとフレームワークのサポートにより、RPC サービスを簡単に実装できます。この記事では、Goを使用してRPCインターフェースを実装する方法を紹介します。
1. RPC の概要
RPC (リモート プロシージャ コール) は、異なるプロセスまたはコンピュータが相互に通信して、他のプロセスまたはコンピュータを呼び出すことを可能にするプロトコルです。機械。 RPC の基本原理は、関数またはメソッドの呼び出しをネットワーク通信プロセスにカプセル化し、コンシューマー (呼び出し元) がローカル呼び出しのようにリモート マシン上のサービスを呼び出せるようにすることです。
現在、一般的な RPC フレームワークには、gRPC、Thrift、Dubbo などが含まれます。その中でも gRPC は、Google がオープンソース化した HTTP/2 ベースの高性能 RPC フレームワークで、C、Java、Python、Go などの複数のプログラミング言語をサポートしています。 gRPC はシリアル化プロトコルとしてプロトコル バッファーを使用します。これを使用して、分散システムやマイクロサービスなどの高性能でスケーラブルな分散アプリケーションを構築できます。
2. Go を使用して RPC インターフェイスを実装する
- インストールとダウンロードの依存関係
Go を使用して RPC インターフェイスを実装する前に、まずは開発環境と RPC フレームワークのサポート。ここでは、gRPC フレームワークを使用することを選択します。
まず、gRPC の Go 言語プラグインと protobuf ツールをインストールする必要があります:
1 2 | $ go get -u google.golang.org/grpc
$ go get -u github.com/golang/protobuf/protoc-gen-go
|
ログイン後にコピー
インストールが完了したら、protobuf2.0 以降を使用して .proto ファイルを書き込むことができます。サービスとメッセージの構造を説明します。たとえば、単純な .proto ファイルを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | syntax = "proto3" ;
package helloworld;
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
|
ログイン後にコピー
ログイン後にコピー
- コードの生成
次のコマンドを使用して、.proto ファイルに基づいて Go コードを生成できます。 ##
1 | $ protoc --go_out=plugins=grpc:. *.proto
|
ログイン後にコピー
上記のコマンドを実行すると、対応する Go コード ファイルを取得できます。例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | syntax = "proto3" ;
package helloworld;
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
|
ログイン後にコピー
ログイン後にコピー
サーバーの実装
次に必要なことは、サービス終了を実装します。まず、上記の HelloService インターフェイスを実装するには、HelloServiceImpl 構造体を定義する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main
import (
"context"
pb "github.com/user/helloworld"
)
type HelloServiceImpl struct {
}
func (s *HelloServiceImpl) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: "Hello, " + req.Name + "!" }, nil
}
|
ログイン後にコピー
上記のコードでは、HelloServiceImpl 構造体を定義し、HelloService インターフェイスに SayHello メソッドを実装します。このメソッドはコンテキスト オブジェクトと HelloRequest オブジェクトをパラメータとして受け取り、結果として HelloResponse オブジェクトを返します。このうち、ctx はリクエストの処理を制御するために使用されるコンテキスト オブジェクトです。 req は HelloRequest オブジェクトで、SayHello メソッドを呼び出すときのリクエスト パラメーターが含まれます。
次に、gRPC サーバーを作成し、HelloServiceImpl オブジェクトをサーバーに登録する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | package main
import (
"log"
"net"
pb "github.com/user/helloworld"
"google.golang.org/grpc"
)
func main() {
listenPort, err := net.Listen( "tcp" , ":4300" )
if err != nil {
log.Fatalf( "failed to listen: %v" , err)
}
grpcServer := grpc.NewServer()
pb.RegisterHelloServiceServer(grpcServer, &HelloServiceImpl{})
if err := grpcServer.Serve(listenPort); err != nil {
log.Fatalf( "failed to serve: %v" , err)
}
}
|
ログイン後にコピー
上記のコードでは、最初にリスニング ポートを定義し、次に gRPC サーバーを作成します。 HelloServiceImpl オブジェクトをサーバーに登録します。最後に、gRPC サービスを開始し、HTTP2 リクエストをリッスンします。
クライアントの実装
gRPC サーバーを実装したので、次は gRPC クライアントを実装する必要があります。 Go では、対応するクライアント メソッドを呼び出すことで gRPC サーバーにアクセスできます。たとえば、main という名前のクライアント ファイルを作成し、次のコードを実装できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | package main
import (
"context"
"log"
"os"
"time"
pb "github.com/user/helloworld"
"google.golang.org/grpc"
)
func main() {
conn, err := grpc.Dial( ":4300" , grpc.WithInsecure(), grpc.WithTimeout(5*time.Second))
if err != nil {
log.Fatalf( "Failed to connect: %v" , err)
}
defer conn.Close()
c := pb.NewHelloServiceClient(conn)
name := "go grpc"
req := &pb.HelloRequest{Name: name}
resp, err := c.SayHello(context.Background(), req)
if err != nil {
log.Fatalf("[ERROR] SayHello err: %v
", err)
os. Exit (1)
}
log.Printf("[INFO] SayHello resp: %s
", resp.Message)
}
|
ログイン後にコピー
上記のコードでは、まず gRPC 接続を作成してサーバーに接続し、次に HelloServiceClient オブジェクトを作成して、リクエストをアセンブルします。パラメーター。最後に、SayHello メソッドを呼び出し、応答を出力します。上記のコードを実行すると、出力結果が表示されます。
1 | INFO: SayHello resp: "Hello, go grpc!"
|
ログイン後にコピー
サービスを実行します
最後に、サーバーとクライアントのコードをコンパイルする必要があります。サービスを開始します。次の手順に従ってください:
1 2 3 | $ cd $GOPATH /src/github.com/user/helloworld
$ go run serve/main.go
$ go run client/main.go
|
ログイン後にコピー
すべてが正常であれば、クライアント出力「Hello, go grpc!」が表示されます。
3. まとめ
この記事では、Go を使用して RPC インターフェイスを実装する方法を紹介しましたが、その中で、古典的な gRPC フレームワークを使用し、簡単な Hello World サンプルを実装しました。 Go には、gRPC に加えて、Thrift、Dubbo、JSON-RPC など、他の多くの RPC フレームワークもあり、開発者は実際のニーズに応じて柔軟に選択できることは言及する価値があります。
RPC フレームワークを使用する場合、実際のニーズに基づいて適切なシリアル化プロトコルと送信プロトコルを選択する必要があります。通常、大規模な分散システムのニーズを満たすために、プロトコル バッファーと HTTP/2 プロトコルを使用して効率的な RPC 呼び出しを実装することをお勧めします。
以上がGoを使用してRPCインターフェースを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。