Megosztás a következőn keresztül:


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. A Grpc.Net.Client csomag tartalmaz egy gRPC-ügyfelet. A Grpc.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:

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ó AddGrpckeresztü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