Aracılığıyla paylaş


gRPC ve Unix etki alanı yuvalarıyla işlemler arası iletişim

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Uyarı

ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

Yayınlayan James Newton-King

.NET, gRPC kullanarak işlemler arası iletişimi (IPC) destekler. İşlemler arasında iletişim kurmak için gRPC kullanmaya başlama hakkında daha fazla bilgi için bkz . gRPC ile işlemler arası iletişim.

Unix etki alanı yuvaları (UDS), istemci ve sunucu aynı makinede olduğunda TCP'den daha verimli olan, yaygın olarak desteklenen bir IPC aktarımıdır. Bu makalede UDS üzerinden gRPC iletişimin nasıl yapılandırılacağı açıklanır.

Önkoşullar

Sunucu yapılandırması

Unix etki alanı yuvaları, içinde Program.csyapılandırılan tarafından Kestreldesteklenir:

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

Yukarıdaki örnek:

İstemci yapılandırması

GrpcChannel özel aktarımlar üzerinden gRPC çağrıları yapmayı destekler. Bir kanal oluşturulduğunda, özel ConnectCallbackbir içeren ile SocketsHttpHandler yapılandırılabilir. Geri çağırma, istemcinin özel aktarımlar üzerinden bağlantı yapmasına ve ardından bu aktarım üzerinden HTTP istekleri göndermesine olanak tanır.

Not

İstemci tarafı yük dengeleme ve kanal durumu gibi bazı bağlantı özellikleri GrpcChannelUnix etki alanı yuvalarıyla birlikte kullanılamaz.

Unix etki alanı yuvaları bağlantı fabrikası örneği:

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

Kanal oluşturmak için özel bağlantı fabrikasını kullanma:

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

Önceki kod kullanılarak oluşturulan kanallar Unix etki alanı yuvaları üzerinden gRPC çağrıları gönderir.