Grpc(Bağlantı girişi görünür.), Google tarafından yayımlanan, HTTP/2 protokolünü kullanan, çoklamayı destekleyen ve ProtoBuf'u serileştirme aracı olarak kullanan, açık kaynaklı, yüksek performanslı, genel amaçlı bir RPC (Uzaktan İşlem Çağrısı) çerçevesidir. gRPC, dil bağımsız yüksek performanslı uzaktan işlem çağrısı (RPC) çerçevesidir.
gRPC'nin başlıca faydaları şunlardır:
- Modern, yüksek performanslı, hafif RPC çerçevesi.
- Varsayılan olarak protokol tamponlarını kullanan, dil bağımsız uygulamalara olanak tanıyan sözleşme öncelikli API geliştirme.
- Güçlü tipli sunucular ve istemci oluşturmak için birden fazla dilde mevcut araçlar.
- İstemci, sunucu ve iki yönlü akış çağrılarını destekler.
- Protobuf ikili serileştirme ile ağın kullanımını azaltın.
Bu makale ile başlar. Net Core, istemci tarafı ve sunucu tarafı iletişimi için gRPC protokolünü kullanır.
Bir gRPC sunucusu oluşturun
Visual Studio'yu başlatın ve Yeni Proje Oluştur'u seçin. Alternatif olarak, Visual Studio Dosya menüsünden Yeni > Projesi'ni seçin.
Yeni Proje Oluştur diyalog kutusunda gRPC Hizmeti'ni seçin ve ardından Sonraki'yi seçin:
Yaratım tamamlandıktan sonra, aşağıdaki şekilde gösterildiği gibi:
Bir gRPC istemcisi oluşturun
Visual Studio'nun ikinci bir örneğini açın ve Yeni bir proje oluştur'u seçin. Yeni Proje Oluştur iletişim kutusunda Konsol Uygulaması (.NET Core) seçin ve ardından Sonraki'yi seçin. Ad metin kutusuna gRPC-Client girin ve ardından Oluştur seçeneğini seçin.
Gerekli paketi ekleyin
gRPC istemci projesi aşağıdaki paketleri gerektirir: Grpc.Net.Client, .NET Core istemcisini içerir. Google.Protobuf, C# için Protobuf mesajları içerir. Grpc.Tools, Protobuf dosyaları için C# araç desteği içerir. Araç kiti çalışma zamanında gerekli değildir, bu yüzden bağımlılıklar PrivateAssets="All" olarak işaretlenir.
greet.proto ekle
gRPC istemci projenizde bir Protos klasörü oluşturun. Protos\greet.proto dosyasını gRPC Greeter hizmetinden gRPC istemci projesine kopyalayın.
gRPC-Client.csproj proje dosyasını düzenleyin, greet.proto dosyasına referans veren öğeyle öğe <Protobuf> grubunu ekleyin:
Bir Greeter istemcisi oluştur
gRPC istemcisinin Program.cs dosyasını aşağıdaki kodla güncelleyin:
GrpcChannel'ı, gRPC servisine bağlantı oluşturmak için kullanılan bilgileri içerecek şekilde başlatın. GrpcChannel kullanarak bir Greeter istemcisi oluşturun. Greeter müşterisi SayHello yöntemini çağırıyor. SayHello görüşmesinin sonucu gösterilir.
Kendi .proto dosya iletişiminizi oluşturun
Servisin Protos klasörü altında yeni bir userinfo.proto dosyası oluşturun, aşağıdaki şekilde tanımlanır:
gRPC, API geliştirme için sözleşme öncelikli yaklaşım kullanır. *.proto dosyasında servisleri ve mesajları tanımlayın.
GrpcService1.csproj proje dosyasını düzenleyin, <Protobuf> userinfo.proto dosyasına referans veren öğeyle öğe grubunu ekleyin:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <TargetFramework>NetcoreApp3.0</TargetFramework> </PropertyGroup>
<ItemGroup> <Protobuf include="Protos\greet.proto" GrpcServices="sunucu" /> <Protobuf include="Protos\userinfo.proto" GrpcServices="sunucu" /> </ItemGroup>
<ItemGroup> <PackageReference include="Grpc.AspNetCore" version="2.23.1" /> </ItemGroup>
</Project>
Hizmetler klasörü altında yeni bir UserInfoService.cs dosyası oluşturun, kod şu şekildedir:
UserInfoService hizmetini Startup.cs tarihinde aşağıdaki kodla kaydedin:
Elbette istemciyi bir kenara bırakırsak, userinfo.proto dosyasını geçmişe kopyalamanız gerekir ve kod şöyledir:
İade değeri:
Merhaba Dünya! Yanıt: Merhaba itsvse.com { "id": "1", "name": "architect", "age": 5, "isVip": true } { "id": "2", "name": "itsvse.com", "age": 5 } Çözülemeyen istisna. Grpc.Core.RpcException: Status(StatusCode=İptal, Detay="Metoddan mesaj geri dönmedi.") at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 metod, String host, CallOptions options, TRequest request) Grpc.Core.Interceptors.InterceptingCallInvoker adresinde. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext'2 ctx) at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 bağlam, BlockingUnaryCallContinuation'2 devamı) at Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 metodu, String host, CallOptions options, TRequest request) at UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, CallOptions options) in C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:hat 62 at UserInfo.UserInfoClient.GetUserInfoInfo (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 Lütfen devam etmek için herhangi bir tuşa basın. . . .
Geri dönüş değeri null olduğunda, istemci bir istisna atar.
Fiddler çantayı kap
Fiddler'ı paket yakalamak için denemek için, önce istemci üzerinde proxy'yi şu şekilde ayarlayın (aslında kuramazsınız, sadece Fiddler'ı doğrudan açın):
Sunucu tarafında hata:
fail: Microsoft.AspNetCore.Server.Kestrel[0] TLS üzerinden HTTP/2, yalnızca HTTP/2 ile bağlantılı bir uç noktada müzakere edilmedi. İstemci hatası:
Çözülemeyen istisna. Grpc.Core.RpcException: Status(StatusCode=Internal, Detail="Kötü gRPC yanıtı. Yanıt protokolü HTTP/1.1'e düşürüldü.") at Grpc.Net.Client.Internal.HttpClientCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 metod, String host, CallOptions options, TRequest request) Grpc.Core.Interceptors.InterceptingCallInvoker adresinde. <BlockingUnaryCall>b__3_0[TRequest,TResponse](TRequest req, ClientInterceptorContext'2 ctx) at Grpc.Core.ClientBase.ClientBaseConfiguration.ClientBaseConfigurationInterceptor.BlockingUnaryCall[TRequest,TResponse](TRequest request, ClientInterceptorContext'2 bağlam, BlockingUnaryCallContinuation'2 devamı) at Grpc.Core.Interceptors.InterceptingCallInvoker.BlockingUnaryCall[TRequest,TResponse](Method'2 metodu, String host, CallOptions options, TRequest request) at UserInfo.UserInfoClient.GetUserInfo(GetUserInfoRequest request, CallOptions options) in C:\Users\DELL\source\repos\GrpcService1\gRPC-Client\obj\Debug\netcoreapp3.0\ UserinfoGrpc.cs:hat 62 at UserInfo.UserInfoClient.GetUserInfoInfo (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 Lütfen devam etmek için herhangi bir tuşa basın. . . .
POSTA ADRESİ: https://localhost:5001/UserInfo/GetUserInfo
İçerik:
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
Son olarak, kaynak kodunu ekleyin:
Turistler, bu gönderinin gizli içeriğini görmek isterseniz lütfen Yanıt
(Son)
|