GRPC migrálása C-magról a .NET-hez készült gRPC-be
Jegyzet
Ez nem a cikk legújabb verziója. Az aktuális kiadást a jelen cikk .NET 9-es verziójában.
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. Az aktuális kiadáshoz lásd a jelen cikk .NET 9-es verzióját.
Fontos
Ezek az információk egy olyan előzetes termékre vonatkoznak, amelyet a kereskedelmi forgalomba kerülés előtt jelentősen módosíthatnak. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.
A jelenlegi kiadást lásd a .NET 9-es verziójában ennek a cikknek.
A mögöttes verem implementálása miatt nem minden funkció működik ugyanúgy C-core-alapú gRPC--alkalmazások és a .NET-hez készült gRPC között. Ez a dokumentum kiemeli a két technológiai csomag közötti migrálás fő különbségeit.
Fontos
A gRPC C-core karbantartási módban van, és a .NETesetén a gRPC javára megszűnik. A gRPC C-core nem ajánlott új alkalmazásokhoz.
Platformtámogatás
A gRPC C-core és a .NET-hez készült gRPC különböző platformtámogatással rendelkezik:
-
gRPC C-core: C++ gRPC-implementáció saját TLS- és HTTP/2-veremekkel. A
Grpc.Core
csomag egy .NET-burkoló a gRPC C-core körül, és gRPC-ügyfelet és -kiszolgálót tartalmaz. Támogatja a .NET-keretrendszert, a .NET Core-t és a .NET 5-ös vagy újabb verzióját. -
gRPC a .NET számára: A .NET Core 3.x és .NET 5 vagy későbbi verziókhoz készült. A modern .NET-verziókba beépített TLS- és HTTP/2-verem használatát veszi igénybe. A
Grpc.AspNetCore
csomag egy ASP.NET Core-ban üzemeltetett gRPC-kiszolgálót tartalmaz, amelyhez .NET Core 3.x vagy .NET 5 vagy újabb verzió szükséges. AGrpc.Net.Client
csomag tartalmaz egy gRPC-ügyfelet. AGrpc.Net.Client
-ügyfél korlátozottan támogatja a .NET-keretrendszert WinHttpHandlerhasználatával.
További információ: gRPC a .NET által támogatott platformokon.
Kiszolgáló és csatorna konfigurálása
A NuGet-csomagokat, a konfigurációt és az indítási kódot módosítani kell a gRPC C-Core-ról a .NET-hez készült gRPC-re való migráláskor.
A .NET-hez készült gRPC külön NuGet-csomagokat tartalmaz az ügyfélhez és a kiszolgálóhoz. A hozzáadott csomagok attól függenek, hogy egy alkalmazás gRPC-szolgáltatásokat üzemeltet-e, vagy meghívja őket:
-
Grpc.AspNetCore
: A szolgáltatásokat a ASP.NET Core üzemelteti. A kiszolgáló konfigurációs információkért tekintse meg az ASP.NET Core-hoz tartozó gRPC-szolgáltatásokat. -
Grpc.Net.Client
: Az ügyfelek aGrpcChannel
-t használják, amely belsőleg a .NET-be beépített hálózati funkciókat alkalmazza. Az ügyfélkonfigurációról szóló információkért lásd: GRPC-szolgáltatások hívása a .NET-ügyfél segítségével.
Ha a migrálás befejeződött, a Grpc.Core
csomagot el kell távolítani az alkalmazásból.
Grpc.Core
nagy natív bináris fájlokat tartalmaz, és a csomag eltávolítása csökkenti a NuGet visszaállítási idejét és az alkalmazás méretét.
Kód által létrehozott szolgáltatások és ügyfelek
A .NET-hez készült gRPC C-Core és gRPC számos API-val rendelkezik, és a .proto
fájlokból létrehozott kód kompatibilis mindkét gRPC-implementációval. A legtöbb ügyfél és szolgáltatás a C-Core-ból a .NET-hez készült gRPC-be migrálható módosítások nélkül.
gRPC-szolgáltatás implementálási élettartama
A ASP.NET Core-veremben a gRPC-szolgáltatások alapértelmezés szerint hatókörrel rendelkező élettartamújönnek létre. Ezzel szemben a gRPC C-core alapértelmezés szerint egy szolgáltatáshoz kapcsolódik egyedi élettartammellett.
A hatókörrel rendelkező élettartam lehetővé teszi, hogy a szolgáltatás implementációja feloldja a hatókörön belüli élettartammal rendelkező többi szolgáltatást. Egy hatókörrel rendelkező élettartam például konstruktorinjektáláson keresztül DbContext
is feloldhat a DI-tárolóból. Hatókörhöz kötött élettartam használata:
- A szolgáltatás implementációjának új példánya jön létre minden egyes kéréshez.
- Az állapot nem osztható meg a kérések között a megvalósítási típus példánytagjain keresztül.
- Az elvárás az, hogy megosztott állapotokat tároljon egy egyszeri szolgáltatásban a DI-tárolóban. A tárolt megosztott állapotok feloldása a gRPC szolgáltatás implementációjának konstruktorában történik.
További információ a szolgáltatás élettartamáról az ASP.NET Core-ban: Függőséginjektálás.
Szinguleton szolgáltatás hozzáadása
A gRPC C-core implementációról az ASP.NET Core-ra való áttérés megkönnyítése érdekében a szolgáltatás megvalósításának élettartamát át lehet váltani hatókörről egyedire. Ehhez hozzá kell adni a szolgáltatás implementációjának egy példányát a DI-tárolóhoz:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddSingleton(new GreeterService());
}
Egy egyszeri élettartamú szolgáltatás-implementáció azonban már nem tudja feloldani a hatókörön belüli szolgáltatásokat konstruktorinjektálással.
GRPC-szolgáltatások beállításainak konfigurálása
A C-magalapú alkalmazásokban az olyan beállítások, mint a grpc.max_receive_message_length
és a grpc.max_send_message_length
, akkor kerülnek konfigurálásra ChannelOption
-vel, amikor a kiszolgálópéldánytlétrehozzák.
A ASP.NET Core-ban a gRPC a GrpcServiceOptions
típuson keresztül biztosítja a konfigurációt. Például egy gRPC-szolgáltatás maximális bejövő üzenetmérete konfigurálható AddGrpc
keresztül. Az alábbi példa a 4 MB-os alapértelmezett MaxReceiveMessageSize
16 MB-ra módosítja:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc(options =>
{
options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB
});
}
További információért a .NET gRPC konfigurációról lásd: .
Fakitermelés
A C-core-alapú alkalmazások a GrpcEnvironment
-tól -ig a naplózó hibakeresési célú konfigurálására támaszkodnak. Az ASP.NET Core verem ezt a funkciót a Naplózási APIáltal biztosítja. Egy naplózó például hozzáadható a gRPC szolgáltatáshoz.
Konstruktorinjektálás:
public class GreeterService : Greeter.GreeterBase
{
private readonly ILogger<GreeterService> _logger;
public GreeterService(ILogger<GreeterService> logger)
{
_logger = logger;
}
}
Elsődleges konstruktorinjektálás (.NET 8 vagy újabb):
public class GreeterService(ILogger<GreeterService> logger) : Greeter.GreeterBase
{
...
}
További információkat a gRPC naplózásáról és diagnosztikájáról a gRPC naplózás és diagnosztika a .NETtémakörben található linken talál.
HTTPS
A C-core-alapú alkalmazások a HTTPS-t a Server.Ports tulajdonságon keresztül konfigurálják. Hasonló koncepcióval konfigurálhatók a kiszolgálók a ASP.NET Core-ban. A Kestrel például a végpontkonfiguráció-t használja ehhez a funkcióhoz.
A C-core-alapú alkalmazások a HTTPS-t a Server.Ports tulajdonságon keresztül konfigurálják. Hasonló koncepcióval konfigurálhatók a kiszolgálók a ASP.NET Core-ban. A Kestrel például végpontkonfiguráció-t használ a funkcióhoz.
gRPC lehallgatók
ASP.NET Core middleware hasonló funkciókat kínál, mint a C-core alapú gRPC-alkalmazások interceptorai. Mindkettőt ASP.NET Core gRPC-alkalmazások támogatják, így nem kell átírni az elfogókat.
További információ arról, hogy ezek a funkciók hogyan viszonyulnak egymáshoz: gRPC Interceptors versus Middleware.
gRPC hostolása nem-ASP.NET Core projekteken
A C-core-alapú kiszolgáló bármilyen projekttípushoz hozzáadható. A .NET-kiszolgálóhoz készült gRPC-hez ASP.NET Core szükséges. ASP.NET Core általában elérhető, mert a projektfájl SDK-ként Microsoft.NET.SDK.Web
határoz meg.
A gRPC-kiszolgáló non-ASP.NET Core-projektekhez üzemeltethető, ha <FrameworkReference Include="Microsoft.AspNetCore.App" />
ad hozzá egy projekthez. A keretrendszer-referencia elérhetővé teszi ASP.NET Core API-kat, és felhasználhatók egy ASP.NET Core-kiszolgáló elindításához.
További információért lásd: gRPC hostolása nem ASP.NET Core-projektekben.
További erőforrások
- .NET-alapú gRPC áttekintése
- gRPC-szolgáltatások C#
- gRPC-szolgáltatások ASP.NET Core
- .NET Core gRPC-ügyfél és -kiszolgáló létrehozása az ASP.NET Core keretrendszerben