Prozessübergreifende Kommunikation mit gRPC- und Unix-Domänensockets
Hinweis
Dies ist nicht die neueste Version dieses Artikels. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Warnung
Diese Version von ASP.NET Core wird nicht mehr unterstützt. Weitere Informationen finden Sie in der Supportrichtlinie für .NET und .NET Core. Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
Wichtig
Diese Informationen beziehen sich auf ein Vorabversionsprodukt, das vor der kommerziellen Freigabe möglicherweise noch wesentlichen Änderungen unterliegt. Microsoft gibt keine Garantie, weder ausdrücklich noch impliziert, hinsichtlich der hier bereitgestellten Informationen.
Informationen zum aktuellen Release finden Sie in der .NET 8-Version dieses Artikels.
.NET unterstützt die prozessübergreifende Kommunikation (Inter-Process Communication, IPC) mithilfe von gRPC. Weitere Informationen zu den ersten Schritten mit der Verwendung von gRPC für die Kommunikation zwischen Prozessen finden Sie unter Inter-Process Communication mit gRPC.
Unix-Domänensockets (UDS) sind ein breit unterstützter IPC-Transport, der effizienter ist als TCP, wenn sich der Client und der Server auf demselben Computer befinden. In diesem Artikel wird erläutert, wie Sie die gRPC-Kommunikation über UDS konfigurieren.
Voraussetzungen
- .NET 5 oder höher
- Linux, macOS oder Windows 10/Windows Server 2019 oder höher
Serverkonfiguration
Unix-Domänensockets werden von Kestrel unterstützt. Die Konfiguration erfolgt in Program.cs
:
var socketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenUnixSocket(socketPath, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
Für das vorherige Beispiel gilt Folgendes:
- Der Endpunkt von Kestrel wird in ConfigureKestrel konfiguriert.
- ListenUnixSocket wird aufgerufen, um dem UDS mit dem angegebenen Pfad zu laschen.
- Erstellt einen UDS-Endpunkt, der nicht für die Verwendung von HTTPS konfiguriert ist. Informationen zum Aktivieren von HTTPS finden Sie unter Kestrel-HTTPS-Endpunktkonfiguration.
Clientkonfiguration
GrpcChannel
unterstützt gRPC-Aufrufe für benutzerdefinierte Datentransporte. Wenn ein Kanal erstellt wird, kann er mit einer SocketsHttpHandler-Klasse konfiguriert werden, die über ein benutzerdefiniertes ConnectCallback-Objekt verfügt. Der Rückruf ermöglicht es dem Client, Verbindungen für benutzerdefinierte Datentransporte herzustellen und dann HTTP-Anforderungen über diese Datentransporte zu senden.
Hinweis
Einige Konnektivitätsfeatures von GrpcChannel
, z. B. clientseitiger Lastenausgleich und Kanalstatus, können nicht zusammen mit Unix-Domänensockets verwendet werden.
Beispiel für eine UDS-Verbindungsfactory (Unix Domain Socket):
public class UnixDomainSocketsConnectionFactory
{
private readonly EndPoint endPoint;
public UnixDomainSocketsConnectionFactory(EndPoint endPoint)
{
this.endPoint = endPoint;
}
public async ValueTask<Stream> ConnectAsync(SocketsHttpConnectionContext _,
CancellationToken cancellationToken = default)
{
var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
try
{
await socket.ConnectAsync(this.endPoint, cancellationToken).ConfigureAwait(false);
return new NetworkStream(socket, true);
}
catch
{
socket.Dispose();
throw;
}
}
}
So wird die benutzerdefinierte Verbindungsfactory zum Erstellen eines Kanals verwendet:
public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
public static GrpcChannel CreateChannel()
{
var udsEndPoint = new UnixDomainSocketEndPoint(SocketPath);
var connectionFactory = new UnixDomainSocketsConnectionFactory(udsEndPoint);
var socketsHttpHandler = new SocketsHttpHandler
{
ConnectCallback = connectionFactory.ConnectAsync
};
return GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions
{
HttpHandler = socketsHttpHandler
});
}
Kanäle, die mithilfe des vorangehenden Codes erstellt werden, senden gRPC-Aufrufe über Unix Domain Sockets (UDS).
ASP.NET Core