Migrasi gRPC dari C-core ke gRPC untuk .NET
Catatan
Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 9 dari artikel ini.
Peringatan
Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 9 dari artikel ini.
Penting
Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Untuk rilis saat ini, lihat versi .NET 9 dari artikel ini.
Karena implementasi tumpukan dasar, beberapa fitur tidak berfungsi dengan cara yang sama antara aplikasi gRPC berbasis C-core dan gRPC untuk .NET. Dokumen ini menyoroti perbedaan utama untuk melakukan migrasi antara dua tumpukan.
Penting
gRPC C-core berada dalam mode pemeliharaan dan tidak akan digunakan lagi demi gRPC untuk .NET. gRPC C-core tidak disarankan untuk aplikasi baru.
Dukungan platform
gRPC C-core dan gRPC untuk .NET memiliki dukungan platform yang berbeda:
-
gRPC C-core: Implementasi gRPC dalam C++ dengan tumpukan TLS dan HTTP/2 sendiri. Paket
Grpc.Core
ini adalah pembungkus .NET di sekitar gRPC C-core dan berisi klien dan server gRPC. Ini mendukung .NET Framework, .NET Core, dan .NET 5 atau yang lebih baru. -
gRPC untuk .NET: Dirancang untuk .NET Core 3.x dan .NET 5 atau yang lebih baru. Ini menggunakan tumpukan TLS dan HTTP/2 yang terintegrasi dalam rilis .NET modern. Paket
Grpc.AspNetCore
berisi server gRPC yang dihosting di ASP.NET Core dan memerlukan .NET Core 3.x atau .NET 5 atau yang lebih baru. PaketGrpc.Net.Client
berisi klien gRPC. Klien diGrpc.Net.Client
memiliki dukungan terbatas untuk .NET Framework menggunakan WinHttpHandler.
Untuk informasi selengkapnya, lihat gRPC pada platform yang didukung .NET.
Mengonfigurasi server dan saluran
Paket, konfigurasi, dan kode startup NuGet harus dimodifikasi saat bermigrasi dari gRPC C-Core ke gRPC untuk .NET.
gRPC untuk .NET memiliki paket NuGet terpisah untuk klien dan servernya. Paket yang ditambahkan bergantung pada apakah aplikasi menghosting layanan gRPC atau memanggilnya:
-
Grpc.AspNetCore
: Layanan dihosting oleh ASP.NET Core. Untuk informasi konfigurasi server, lihat layanan gRPC dengan ASP.NET Core. -
Grpc.Net.Client
: Klien menggunakanGrpcChannel
, yang secara internal menggunakan fungsionalitas jaringan yang disertakan dalam .NET. Untuk informasi konfigurasi klien, lihat Memanggil layanan gRPC dengan klien .NET.
Setelah migrasi selesai, Grpc.Core
paket harus dihapus dari aplikasi.
Grpc.Core
berisi file biner besar asli, dan menghapus paket tersebut dapat mengurangi waktu pemulihan NuGet dan ukuran aplikasi.
Layanan dan klien yang dihasilkan secara otomatis oleh kode
gRPC C-Core dan gRPC untuk .NET berbagi banyak API, dan kode yang dihasilkan dari .proto
file kompatibel dengan kedua implementasi gRPC. Sebagian besar klien dan layanan dapat dimigrasikan dari C-Core ke gRPC untuk .NET tanpa perubahan.
Masa pakai implementasi layanan gRPC
Pada stack ASP.NET Core, layanan gRPC, secara default, dibuat dengan masa hidup terlingkup. Sebaliknya, gRPC C-core secara default mengikat ke layanan dengan masa hidup singleton.
Masa pakai terlingkup memungkinkan implementasi layanan untuk menyelesaikan layanan lain dengan masa pakai terlingkup. Misalnya, masa pakai tercakup juga dapat diselesaikan DbContext
dari kontainer DI melalui injeksi konstruktor. Menggunakan masa pakai terlingkup:
- Instans baru implementasi layanan dibangun untuk setiap permintaan.
- Tidak dimungkinkan untuk berbagi status antara permintaan melalui anggota instans pada jenis implementasi.
- Harapannya adalah untuk menyimpan status bersama dalam layanan singleton dalam kontainer DI. Status bersama yang disimpan diselesaikan dalam konstruktor implementasi layanan gRPC.
Untuk informasi selengkapnya tentang masa pakai layanan, lihat Injeksi dependensi di ASP.NET Core.
Menambahkan layanan singleton
Untuk memfasilitasi transisi dari implementasi C-core gRPC ke ASP.NET Core, Anda dapat mengubah masa pakai implementasi layanan dari bercakupan ke singleton. Ini melibatkan penambahan instans implementasi layanan ke kontainer DI:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddSingleton(new GreeterService());
}
Namun, implementasi layanan dengan masa pakai singleton tidak lagi dapat menyelesaikan layanan terlingkup melalui injeksi konstruktor.
Mengonfigurasi opsi layanan gRPC
Di aplikasi berbasis C-core, pengaturan seperti grpc.max_receive_message_length
dan grpc.max_send_message_length
dikonfigurasi dengan ChannelOption
saat membuat instans Server.
Di ASP.NET Core, gRPC menyediakan konfigurasi melalui tipe GrpcServiceOptions
. Misalnya, layanan gRPC ukuran pesan masuk maksimum dapat dikonfigurasi melalui AddGrpc
. Contoh berikut mengubah default MaxReceiveMessageSize
4 MB menjadi 16 MB:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(options =>
{
options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB
});
}
Untuk informasi selengkapnya tentang konfigurasi, lihat konfigurasi gRPC untuk .NET.
Pencatatan / Penebangan
Aplikasi berbasis C-core mengandalkan GrpcEnvironment
untuk mengonfigurasi logger untuk tujuan debugging. Tumpukan ASP.NET Core menyediakan fungsionalitas ini melalui API Pengelogan. Misalnya, pencatat dapat ditambahkan ke layanan gRPC.
Injeksi konstruktor:
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
}
Injeksi konstruktor utama (.NET 8 atau yang lebih baru):
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
...
}
Untuk informasi selengkapnya tentang pengelogan dan diagnostik gRPC, lihat Pengelogan dan diagnostik di gRPC di .NET.
HTTPS
Aplikasi berbasis C-core mengonfigurasi HTTPS melalui properti Server.Ports. Konsep serupa digunakan untuk mengonfigurasi server di ASP.NET Core. Misalnya,
Aplikasi berbasis C-core mengonfigurasi HTTPS melalui properti Server.Ports. Konsep serupa digunakan untuk mengonfigurasi server di ASP.NET Core. Misalnya, Kestrel menggunakan konfigurasi endpoint untuk fungsionalitas ini.
Interseptor gRPC
ASP.NET Core middleware menawarkan fungsionalitas serupa dibandingkan dengan interseptor di aplikasi gRPC berbasis inti-C. Keduanya didukung oleh aplikasi gRPC ASP.NET Core, sehingga tidak perlu menulis ulang pencegat (interceptor).
Untuk informasi selengkapnya tentang bagaimana fitur ini dibandingkan satu sama lain, lihat Interseptor gRPC versus Middleware.
Host gRPC dalam proyek non-ASP.NET Core
Server berbasis C-core dapat ditambahkan ke jenis proyek apa pun. gRPC untuk server .NET memerlukan ASP.NET Core. ASP.NET Core biasanya tersedia karena file proyek menentukan Microsoft.NET.SDK.Web
sebagai SDK.
Server gRPC dapat dihosting ke proyek non-ASP.NET Core dengan menambahkan <FrameworkReference Include="Microsoft.AspNetCore.App" />
ke dalam proyek. Referensi kerangka kerja membuat API ASP.NET Core tersedia dan dapat digunakan untuk memulai server ASP.NET Core.
Untuk informasi selengkapnya, lihat Host gRPC di proyek non-ASP.NET Core.
Sumber Daya Tambahan:
ASP.NET Core