gRPC を使用して Golang で同時データ送信を実装するためのベスト プラクティス
はじめに:
クラウド コンピューティングとビッグ データ テクノロジの発展に伴い、データ送信の需要はますます緊急になっています。 Google のオープンソースの高性能リモート プロシージャ コール フレームワークである gRPC は、その効率性、柔軟性、および言語間の機能により、多くの開発者の最初の選択肢となっています。この記事では、プロジェクト構造の構築、接続プールの使用、エラー処理など、gRPC を使用して Golang で同時データ送信を実装する方法のベスト プラクティスを紹介します。
1. プロジェクト構造の構築
gRPC の使用を開始する前に、プログラムの組織と管理をより明確にするために、適切なプロジェクト構造を構築する必要があります。
- プロジェクト ディレクトリの作成
まず、gRPC 関連のコードとリソース ファイルを保存するプロジェクト ディレクトリを作成する必要があります。次のディレクトリ構造に従って編成できます。
myproject ├── api │ └── myservice.proto │ ├── client │ ├── client.go │ └── main.go │ └── server ├── server.go ├── handler.go └── main.go
このうち、api ディレクトリは gRPC サービスのインターフェイス定義を格納するために使用され、client ディレクトリはクライアント関連のコードと主要な関数を格納します。 、サーバーディレクトリにはサーバー関連のコードとメイン関数が保存されます。
- サービス インターフェイスの定義
API ディレクトリに myservice.proto という名前のファイルを作成して、サービス インターフェイスを定義します。サンプル コードは次のとおりです。
syntax = "proto3"; package myproject; service MyService { rpc GetData (GetDataRequest) returns (GetDataResponse) {} } message GetDataRequest { string id = 1; } message GetDataResponse { string data = 1; }
ここでは、MyService という名前のサービスが定義されています。これには、GetDataRequest パラメーターを受け取り、GetDataResponse パラメーターを返す GetData という名前の RPC メソッドが含まれています。
- コードの生成
プロジェクトのルート ディレクトリで次のコマンドを実行して、Golang コード ファイルを生成します:
protoc --proto_path=./api --go_out=plugins=grpc:./api ./api/myservice.proto
これにより、ファイルという名前のファイルが生成されます。 myservice.pb.go には、gRPC サービスとメッセージ定義、およびその他の関連コードが含まれています。
2. クライアントの作成
次に、サーバーに同時リクエストを送信し、返されたデータを受信するクライアント コードの作成を開始します。
- 依存関係のインポート
client/main.go では、まず gRPC、コンテキスト、同期などの関連する依存関係をインポートする必要があります:
package main import ( "context" "log" "sync" "time" "google.golang.org/grpc" pb "myproject/api" // 导入生成的代码 )
- 接続の作成
main 関数では、サーバーとの接続を作成する必要があります。接続は、grpc.Dial
関数を使用して作成できます。サンプル コードは次のとおりです。
func main() { // 创建连接并指定服务端地址和端口 conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure()) if err != nil { log.Fatalf("failed to connect: %v", err) } defer conn.Close() // 创建客户端 client := pb.NewMyServiceClient(conn) // 发送并发请求 var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func(id int) { defer wg.Done() // 创建上下文和请求 ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() req := &pb.GetDataRequest{ Id: strconv.Itoa(id), } // 调用服务端方法 resp, err := client.GetData(ctx, req) if err != nil { log.Printf("failed to get data: %v", err) return } // 输出结果 log.Printf("data: %s", resp.Data) }(i) } // 等待所有请求完成 wg.Wait() }
上記のコードでは、まず grpc.Dial
関数を使用してサーバーとの接続を作成します。ここでは、例を簡略化するために、安全でない接続モード (Insecure) が使用されています。実際のアプリケーションでは、セキュア接続モード (Secure) を使用することをお勧めします。
次に、サーバー側メソッドを呼び出すための MyServiceClient インスタンスを作成しました。
次に、sync.WaitGroup を使用して同時リクエストを調整します。ループ内で、同時リクエストを開始するための匿名関数を作成します。同時に実行される各リクエストで、コンテキストとリクエスト オブジェクトを作成し、サーバー側メソッド GetData
を呼び出します。
最後に、wg.Wait
を使用して、すべての同時リクエストが完了するのを待ちます。
3. サーバーを作成する
次に、クライアントのリクエストを受信し、処理されたデータを返すサーバー コードの作成を開始します。
- 依存関係のインポート
server/main.go では、まず gRPC、ログ、ネットなどの関連する依存関係をインポートする必要があります:
package main import ( "log" "net" "google.golang.org/grpc" pb "myproject/api" // 导入生成的代码 )
- インターフェイスの実装
handler.go では、定義されたサービス インターフェイスを実装する必要があります。サンプル コードは次のとおりです。
package main import ( "context" ) // 定义服务 type MyServiceServer struct{} // 实现方法 func (s *MyServiceServer) GetData(ctx context.Context, req *pb.GetDataRequest) (*pb.GetDataResponse, error) { // 处理请求 data := "Hello, " + req.Id // 构造响应 resp := &pb.GetDataResponse{ Data: data, } return resp, nil }
ここでは、MyServiceServer 構造体と GetData メソッドを実装します。このメソッドでは、まずリクエストを処理し、次にレスポンスを構築して返します。
- サービスの作成
main 関数では、gRPC サービスを作成して開始する必要があります。サービスは、grpc.NewServer
関数を使用して作成できます。サンプル コードは次のとおりです。
func main() { // 监听TCP端口 lis, err := net.Listen("tcp", ":50051") if err != nil { log.Fatalf("failed to listen: %v", err) } // 创建gRPC服务 s := grpc.NewServer() // 注册服务 pb.RegisterMyServiceServer(s, &MyServiceServer{}) // 启动服务 if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }
上記のコードでは、まず net.Listen
関数を使用して TCP リスナーを作成し、リスニング ポートを 50051 に指定します。
次に、grpc.NewServer
関数を使用して gRPC サービスを作成し、pb.RegisterMyServiceServer
メソッドを使用してサービスに実装したサービスを登録します。
最後に、s.Serve(lis)
メソッドを使用してサービスを開始し、指定されたポートをリッスンします。
4. コード例のデモ
以下では、gRPC を使用して Golang で同時データ送信を実装する方法を示す完全な例を使用します。
まず、server/main.go に次のコードを追加する必要があります:
package main // main函数入口 func main() { // 注册服务 pb.RegisterMyServiceServer(s, &MyServiceServer{}) // 启动服务 if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } }
次に、client/main.go に次のコードを追加します:
package main // main函数入口 func main() { ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() req := &pb.GetDataRequest{ Id: "1", } resp, err := client.GetData(ctx, req) if err != nil { log.Fatalf("failed to get data: %v", err) } log.Printf("data: %s", resp.Data) }
最後にプロジェクトのルート ディレクトリで次のコマンドを実行して、サーバーとクライアントを起動できます。
go run server/main.go go run client/main.go
実行結果は次のとおりです。
2021/01/01 15:00:00 data: Hello, 1
サーバーが正常に受信したことがわかります。クライアントのリクエストに応じて処理されたデータが返されます。
概要:
この記事では、gRPC を使用して Golang で同時データ送信を実装する方法のベスト プラクティスを紹介します。適切なプロジェクト構造を構築し、接続を作成し、サービス インターフェイスを実装し、サービスを開始することで、同時データ送信に gRPC を簡単に使用できます。この記事が、gRPC を使用している、またはこれから使用する開発者に役立つことを願っています。
以上がgRPC を使用して Golang で同時データ送信を実装するためのベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

goooffersbustfeaturesforsecurecoding、butdevelopersmustimplementsecuritybestpracticive.1)usego'scryptageforsecuredathing.2)surncurrencywithranciationwithranizationprimitivestopreventraceconditions.3)sanitexe zeexerinputeterinpuptoravoidsqlinj

Goのエラーインターフェイスは、TypeErrorInterface {error()String}として定義され、エラー()メソッドを実装する任意のタイプをエラーと見なすことができます。使用の手順は次のとおりです。1。iferr!= nil {log.printf( "anerroroccurred:%v"、err)return}などのエラーを基本的にチェックおよびログエラー。 2。TypeMyErrorStruct {MSGSTRINGDETAILSTRING}などのより多くの情報を提供するカスタムエラータイプを作成します。 3.エラーラッパー(GO1.13以降)を使用して、元のエラーメッセージを失うことなくコンテキストを追加する、

Effectivitive Handleerrorsinconconconcurentgoprograms、usechannelstocommunicateerrors、Implienterrorwatchers、Sunidertimeouts、usebufferedchannels、およびprovideclearerrormess.1)usechannelstopasserrors fromgoroutineStothemainctunction.2)Anerrorwatcherを実装します

GO言語では、インターフェイスの実装が暗黙的に実行されます。 1)暗黙的な実装:タイプにインターフェイスによって定義されたすべてのメソッドが含まれている限り、インターフェイスは自動的に満たされます。 2)空のインターフェイス:すべてのタイプのインターフェイス{}タイプが実装されており、中程度の使用はタイプの安全性の問題を回避できます。 3)インターフェイス分離:コードの保守性と再利用性を向上させるために、小型ではあるが焦点を絞ったインターフェイスを設計します。 4)テスト:インターフェイスは、依存関係をあざけることでユニットテストに役立ちます。 5)エラー処理:エラーは、インターフェイスを介して均一に処理できます。

go'sinterfacesAriemplictlictlictlymentedは、Javaandc#とは異なり、whorequireexplicitimplementation.1)ingo、anytypewithedsodsodsautodsodsodsodsodsodsodsodsodsodsodsodsodsimplication antersface、促進性と柔軟性

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

開発者は、次のベストプラクティスに従う必要があります。1。ゴルチンを慎重に管理して、リソースの漏れを防ぎます。 2。同期にチャネルを使用しますが、過剰使用を避けます。 3。同時プログラムのエラーを明示的に処理します。 4. GomaxProcsを理解して、パフォーマンスを最適化します。これらのプラクティスは、リソースの効果的な管理、適切な同期の実装、適切なエラー処理、パフォーマンスの最適化を確保し、それによりソフトウェアの効率と保守性を向上させるため、効率的で堅牢なソフトウェア開発には重要です。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

ホットトピック









