近年、インターネット技術の急速な発展とクラウド コンピューティングの台頭により、リモート プロシージャ コール (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 ツールをインストールする必要があります:
$ go get -u google.golang.org/grpc $ go get -u github.com/golang/protobuf/protoc-gen-go
インストールが完了したら、protobuf2.0 以降を使用して .proto ファイルを書き込むことができます。サービスとメッセージの構造を説明します。たとえば、単純な .proto ファイルを作成します。
syntax = "proto3"; package helloworld; // 定义 HelloService service HelloService { // 定义 SayHello 方法 rpc SayHello (HelloRequest) returns (HelloResponse) {} } // 定义入参结构体: HelloRequest message HelloRequest { string name = 1; } // 定义出参结构体: HelloResponse message HelloResponse { string message = 1; }
次のコマンドを使用して、.proto ファイルに基づいて Go コードを生成できます。 ##
$ protoc --go_out=plugins=grpc:. *.proto上記のコマンドを実行すると、対応する Go コード ファイルを取得できます。例:
syntax = "proto3"; package helloworld; // 定义 HelloService service HelloService { // 定义 SayHello 方法 rpc SayHello (HelloRequest) returns (HelloResponse) {} } // 定义入参结构体: HelloRequest message HelloRequest { string name = 1; } // 定义出参结构体: HelloResponse message HelloResponse { string message = 1; }
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 オブジェクトをサーバーに登録する必要があります。
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 リクエストをリッスンします。
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} // 调用 SayHello 方法 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 メソッドを呼び出し、応答を出力します。上記のコードを実行すると、出力結果が表示されます。
INFO: SayHello resp: "Hello, go grpc!"
$ cd $GOPATH/src/github.com/user/helloworld $ go run serve/main.go // 启动gRPC服务端 $ go run client/main.go // 启动gRPC客户端すべてが正常であれば、クライアント出力「Hello, go grpc!」が表示されます。 3. まとめこの記事では、Go を使用して RPC インターフェイスを実装する方法を紹介しましたが、その中で、古典的な gRPC フレームワークを使用し、簡単な Hello World サンプルを実装しました。 Go には、gRPC に加えて、Thrift、Dubbo、JSON-RPC など、他の多くの RPC フレームワークもあり、開発者は実際のニーズに応じて柔軟に選択できることは言及する価値があります。 RPC フレームワークを使用する場合、実際のニーズに基づいて適切なシリアル化プロトコルと送信プロトコルを選択する必要があります。通常、大規模な分散システムのニーズを満たすために、プロトコル バッファーと HTTP/2 プロトコルを使用して効率的な RPC 呼び出しを実装することをお勧めします。
以上がGoを使用してRPCインターフェースを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。