近年、インターネット技術の急速な発展とクラウド コンピューティングの台頭により、リモート プロシージャ コール (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
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 }
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) } }
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) }
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客户端
以上がGoを使用してRPCインターフェースを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。