Udostępnij za pośrednictwem


Komunikacja między procesami przy użyciu gniazd domeny gRPC i Unix

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.

Ostrzeżenie

Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz zasady pomocy technicznej platformy .NET i platformy .NET Core. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.

Autor: James Newton-King

Platforma .NET obsługuje komunikację między procesami (IPC) przy użyciu gRPC. Aby uzyskać więcej informacji na temat rozpoczynania pracy z używaniem gRPC do komunikacji między procesami, zobacz Komunikacja między procesami za pomocą usługi gRPC.

Gniazda domeny systemu Unix (UDS) to powszechnie obsługiwany transport IPC, który jest bardziej wydajny niż TCP, gdy klient i serwer znajdują się na tej samej maszynie. W tym artykule omówiono sposób konfigurowania komunikacji gRPC za pośrednictwem usługi UDS.

Wymagania wstępne

Konfiguracja serwera

Gniazda domeny systemu Unix są obsługiwane przez Kestrelprogram , który jest skonfigurowany w programie 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;
    });
});

Powyższy przykład:

  • Konfiguruje Kestrelpunkty końcowe w programie ConfigureKestrel.
  • Wywołania ListenUnixSocket do nasłuchiwania usługi UDS z określoną ścieżką.
  • Tworzy punkt końcowy usługi UDS, który nie jest skonfigurowany do używania protokołu HTTPS. Aby uzyskać informacje na temat włączania protokołu HTTPS, zobacz Kestrel Konfiguracja punktu końcowego HTTPS.

Konfiguracja klientów

GrpcChannel obsługuje wykonywanie wywołań gRPC w przypadku transportu niestandardowego. Po utworzeniu kanału można go skonfigurować za pomocą elementu SocketsHttpHandler z niestandardowym ConnectCallbackelementem . Wywołanie zwrotne umożliwia klientowi nawiązywanie połączeń za pośrednictwem transportu niestandardowego, a następnie wysyłanie żądań HTTP za pośrednictwem tego transportu.

Uwaga

Niektóre funkcje łączności programu GrpcChannel, takie jak równoważenie obciążenia po stronie klienta i stan kanału, nie mogą być używane razem z gniazdami domeny systemu Unix.

Przykład fabryki połączeń gniazd domeny systemu Unix:

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;
        }
    }
}

Tworzenie kanału przy użyciu niestandardowej fabryki połączeń:

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
    });
}

Kanały utworzone przy użyciu poprzedniego kodu wysyłają wywołania gRPC za pośrednictwem gniazd domeny systemu Unix.