grpc(Logowanie do linku jest widoczne.) to otwartoźródłowy, wysokowydajny, uniwersalny framework RPC (Remote Procedure Call) wydany przez Google, wykorzystujący protokół HTTP/2, wspierający multipleksowanie oraz ProtoBuf jako narzędzie do serializacji, zapewniający wsparcie międzyjęzykowe i platformowe. gRPC to wysokowydajny framework do zdalnych wywołań procedur (RPC), niezależny od języka.
Główne korzyści gRPC to:
- Nowoczesny, wysokowydajny, lekki framework RPC.
- Tworzenie API oparte na kontrakcie, które domyślnie korzysta z protokołu, umożliwiających implementacje niezależne od języka.
- Narzędzia dostępne w wielu językach do generowania silnie typowanych serwerów i klientów.
- Obsługuje połączenia klient, serwer oraz dwukierunkowe streamingi.
- Ogranicz wykorzystanie sieci dzięki binarnej serializacji Protobuf.
Ten artykuł zaczyna się od . Net Core wykorzystuje protokół gRPC do komunikacji po stronie klienta i serwera.
Stwórz serwer gRPC
Uruchom Visual Studio i wybierz Utwórz nowy projekt. Alternatywnie, wybierz New > Project z menu plików Visual Studio.
W oknie dialogowym Utwórz nowy projekt wybierz usługę gRPC, a następnie wybierz Następny:
Po zakończeniu tworzenia, jak pokazano na poniższym rysunku:
Stwórz klienta gRPC
Otwórz drugą instancję Visual Studio i wybierz Create a new project. W oknie dialogowym Utwórz nowy projekt wybierz Aplikację konsolową (.NET Core), a następnie wybierz Dalej. W polu tekstowym Nazwa wpisz gRPC-Client, a następnie wybierz Create.
Dodaj wymagany pakiet
Projekt klienta gRPC wymaga następujących pakietów: Grpc.Net.Client, który zawiera klienta .NET Core. Google.Protobuf zawiera wiadomości Protobuf dla C#. Grpc.Tools obsługuje narzędzia C# dla plików Protobuf. Zestaw narzędzi nie jest wymagany w czasie działania, więc zależności są oznaczane jako PrivateAssets="All".
Dodaj greet.proto
Stwórz folder Protos w swoim projekcie klienta gRPC. Skopiuj plik Protos\greet.proto z usługi gRPC Greeter do projektu klienta gRPC.
Edytuj plik projektu gRPC-Client.csproj, dodaj grupę elementów z elementem odwołującym się do pliku greet.proto <Protobuf> :
Stwórz klienta Greeter
Zaktualizuj plik Program.cs klienta gRPC o następujący kod:
Instancja GrpcChannel tak, aby zawierał informacje użyte do nawiązania połączenia z usługą gRPC. Zbuduj klienta Greeter za pomocą GrpcChannel. Klient Powitania nazywa metodę SayHello. Wynik połączenia SayHello jest wyświetlany.
Stwórz własną komunikację plików .proto
Utwórz nowy plik userinfo.proto w folderze Protos serwisu, zdefiniowanym następująco:
gRPC stosuje podejście oparte na kontrakcie w rozwoju API. Zdefiniuj usługi i wiadomości w pliku *.proto.
Edytuj plik projektu GrpcService1.csproj, dodaj <Protobuf> grupę elementów z elementem odwołującym się do pliku 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>
Utwórz nowy plik UserInfoService.cs w folderze Usługi, kod wygląda następująco:
Zarejestruj usługę UserInfoService na Startup.cs z następującym kodem:
Pomijając klienta, oczywiście musisz skopiować plik userinfo.proto, a kod wygląda następująco:
Wartość zwrotu:
Cześć ludzie! Odpowiedź: Witaj itsvse.com { "id": "1", "name": "architect", "age": 5, "isVip": true } { "id": "2", "name": "itsvse.com", "age": 5 } Wyjątek nieobsługiwany. Grpc.Core.RpcException: Status(StatusCode=Cancelled, Detail="Brak zwróconej wiadomości z metody.") at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request) na Grpc.Core.Interceptors.InterceptingCallInvoker. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext'2 ctx) at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 kontekst, kontynuacja BlockingUnaryCallContinuation'2) na Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request) at UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, opcje CallOptions) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:linia 62 w UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, nagłówki metadanych, deadline Nullable'1, CancellationToken cancellationToken) w języku C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58 at gRPC_Client.Program.Main(String[] args) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 20 Proszę nacisnąć dowolny, aby kontynuować...
Gdy wartość zwrotu jest null, klient wyrzuca wyjątek.
Skrzypek, chwyć torbę
Aby spróbować użyć Fiddlera do przechwytywania pakietów, najpierw ustaw proxy na kliencie w następujący sposób (w rzeczywistości nie da się tego skonfigurować, wystarczy otworzyć Fiddlera bezpośrednio):
Błąd po stronie serwera:
fail: Microsoft.AspNetCore.Server.Kestrel[0] HTTP/2 przez TLS nie był negocjowany na punkcie końcowym tylko HTTP/2. Błąd klienta:
Wyjątek nieobsługiwany. Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Zła odpowiedź gRPC. Protokół odpowiedzi został obniżony do HTTP/1.1.") at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request) na Grpc.Core.Interceptors.InterceptingCallInvoker. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext'2 ctx) at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 kontekst, kontynuacja BlockingUnaryCallContinuation'2) na Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 method, String host, CallOptions options, TRequest request) at UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, opcje CallOptions) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:linia 62 w UserInfo.UserInfoClient.GetUserInfo(żądanie GetUserInfoRequest, nagłówki metadanych, deadline Nullable'1, CancellationToken cancellationToken) w języku C: \Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\UserinfoGrpc.cs:line 58 at gRPC_Client.Program.Main(String[] args) w C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\Program.cs:line 23 Proszę nacisnąć dowolny, aby kontynuować...
ADRES POST: https://localhost:5001/UserInfo/GetUserInfo
Treść:
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
Na koniec dołącz kod źródłowy:
Turyści, jeśli chcecie zobaczyć ukrytą zawartość tego wpisu, proszę Odpowiedź
(Koniec)
|