grpc(ハイパーリンクのログインが見えます。)は、Googleがリリースしたオープンソースの高性能汎用RPC(リモートプロシージャコール)フレームワークで、HTTP/2プロトコルを使用し、多重化をサポートし、ProtoBufをシリアライズツールとして用いて言語間およびプラットフォーム間のサポートを提供しています。 gRPCは言語に依存しない高性能なリモートプロシージャコール(RPC)フレームワークです。
gRPCの主な利点は以下の通りです:
- 現代的で高性能、軽量なRPCフレームワーク。
- 契約優先のAPI開発で、デフォルトでプロトコルバッファを使用し、言語に依存しない実装を可能にします。
- 強型サーバーやクライアントを生成するための複数言語のツール。
- クライアント、サーバー、双方向ストリーミング通話をサポートします。
- Protobufバイナリシリアライズによるネットワーク利用を減らしましょう。
この記事は から始まります。 Net Coreはクライアント側およびサーバー側の通信にgRPCプロトコルを使用しています。
gRPCサーバーを作成する
Visual Studioを起動し、「新しいプロジェクトを作成」を選択します。 または、Visual Studioのファイルメニューから「新しい>プロジェクト」を選択します。
「新しいプロジェクトを作成」ダイアログボックスで、gRPCサービスを選択し、「次へ」を選択します。
作成が完了した後、以下の図に示されています:
gRPCクライアントを作成する
Visual Studioの2つ目のインスタンスを開き、「新しいプロジェクトを作成」を選択します。 「新しいプロジェクトを作成」ダイアログボックスで「コンソールアプリ(.NET Core)」を選択し、「次へ」を選択してください。 名前のテキストボックスに gRPC-Client を入力し、その後「Create」を選択してください。
必要なパッケージを追加してください
gRPCクライアントプロジェクトには以下のパッケージが必要です: Grpc.Net.Clientで、.NET Coreクライアントを含んでいます。 Google.ProtobufにはC#用のProtobufメッセージが含まれています。 Grpc.ToolsにはProtobufファイル用のC#ツールサポートが含まれています。 このツールキットは実行時に必須ではないため、依存関係はPrivateAssets="All"としてマークされています。
greet.protoを追加
gRPCクライアントプロジェクト内にProtosフォルダを作成します。 gRPCグリーターサービスからProtos\greet.protoファイルをgRPCクライアントプロジェクトにコピーします。
gRPC-Client.csprojプロジェクトファイルを編集し、greet.protoファイルを参照する要素を含むアイテムグループを追加します<Protobuf>:
グリータークライアントを作成する
gRPCクライアントのProgram.csファイルを以下のコードで更新してください:
grpcChannelをインスタンス化し、gRPCサービスへの接続を作成するために使われた情報が格納されます。 GrpcChannelを使ってグリータークライアントを構築します。 グリータークライアントはSayHelloメソッドを呼び出します。 SayHello通話の結果が表示されます。
自分だけの.protoファイル通信を作成しましょう
サーブのProtosフォルダの下に新しいuserinfo.protoファイルを作成し、次のように定義します:
gRPCはAPI開発において契約優先アプローチを採用しています。 *.protoファイルでサービスとメッセージを定義します。
GrpcService1.csprojプロジェクトファイルを編集し、<Protobuf>userinfo.protoファイルを参照する要素を含むアイテムグループを追加します:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <TargetFramework>NetcoreApp3.0</TargetFramework> </PropertyGroup>
<ItemGroup> <protobuf include="protos\greet.proto" grpcServices="server" /> <protobuf include="protos\userinfo.proto" grpcServices="server" /> </ItemGroup>
<ItemGroup> <PackageReference include="Grpc.AspNetCore" version="2.23.1" /> </ItemGroup>
</Project>
Servicesフォルダの下に新しいUserInfoService.csファイルを作成します。コードは以下の通りです:
以下のコードでStartup.csのUserInfoServiceサービスを登録してください:
もちろんクライアントは除いて、userinfo.protoファイルをコピーする必要があります。コードは以下の通りです:
リターンバリュー:
ハローワールド! 返信:こんにちは itsvse.com { "id": "1", "name": "architect", "age" : 5, "isVip": true } { "id": "2", "name": "itsvse.com", "age": 5 } 未処理例外。 Grpc.Core.RpcException: Status(StatusCode=Cancelled, Detail="メソッドからのメッセージが戻りません.") at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request) Grpc.Core.Interceptors.InterceptingCallInvokerで。 <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest rerequest, ClientInterceptorContext'2 ctx) at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 コンテキスト、BlockingUnaryCallContinuation'2 continuation) at grpc.core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 メソッド、String host、CallOptions options、TRequest request) UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, CallOptions options)で C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:62行目 at UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, Metadata headers, Nullable'1 deadline, CancellationToken cancellationToken) in C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58 at gRPC_Client.Program.Main(String[] args) in C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 20 続行するにはどのキーでもお願いします...
返却値がnullの場合、クライアントは例外を投げます。
フィドラー、バッグを取って
Fiddlerでパケットをキャプチャしようとするには、まずクライアント上でプロキシを次のように設定してください(実際には設定できず、Fiddlerを直接開くだけです):
サーバー側のエラー:
fail: Microsoft.AspNetCore.Server.Kestrel[0] HTTP/2 over TLSはHTTP/2専用エンドポイントでは交渉されていません。 クライアントエラー:
未処理例外。 Grpc.Core.RpcException: Status(StatusCode=Internal, detail="Bad gRPC response. レスポンスプロトコルがHTTP/1.1にダウングレードされました。」) at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request) Grpc.Core.Interceptors.InterceptingCallInvokerで。 <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest rerequest, ClientInterceptorContext'2 ctx) at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 コンテキスト、BlockingUnaryCallContinuation'2 continuation) at grpc.core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 メソッド、String host、CallOptions options、TRequest request) UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, CallOptions options)で C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:62行目 at UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, Metadata headers, Nullable'1 deadline, CancellationToken cancellationToken) in C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58 at gRPC_Client.Program.Main(String[] args) in C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 23 続行するにはどのキーでもお願いします...
郵便先住所:https://localhost:5001/UserInfo/GetUserInfo
内容:
Host: localhost:5001
User-Agent: grpc-dotnet/2.25.0.0
TE: trailers
grpc-accept-encoding: identity,gzip
Content-Type: application/grpc
Content-Length: 7
Fiddler-Encoding: base64
最後にソースコードを添付します:
観光客の皆さん、この投稿の隠された内容を見たい方は、どうぞ 答える
(終わり)
|