Bagikan melalui


Komunikasi antarproses dengan soket domain gRPC dan Unix

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Oleh James Newton-King

.NET mendukung komunikasi antarproses (IPC) menggunakan gRPC. Untuk informasi selengkapnya tentang mulai menggunakan gRPC untuk berkomunikasi antar proses, lihat Komunikasi antarproses dengan gRPC.

Soket domain Unix (UDS) adalah transportasi IPC yang didukung secara luas yang lebih efisien daripada TCP ketika klien dan server berada di komputer yang sama. Artikel ini membahas cara mengonfigurasi komunikasi gRPC melalui UDS.

Prasyarat

Konfigurasi server

Soket domain Unix didukung oleh Kestrel, yang dikonfigurasi dalam 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;
    });
});

Contoh sebelumnya:

  • KestrelMengonfigurasi titik akhir di ConfigureKestrel.
  • ListenUnixSocket Panggilan untuk mendengarkan UDS dengan jalur yang ditentukan.
  • Membuat titik akhir UDS yang tidak dikonfigurasi untuk menggunakan HTTPS. Untuk informasi tentang mengaktifkan HTTPS, lihat Kestrel Konfigurasi titik akhir HTTPS.

Konfigurasi klien

GrpcChannel mendukung melakukan panggilan gRPC melalui transportasi kustom. Saat saluran dibuat, saluran dapat dikonfigurasi dengan SocketsHttpHandler yang memiliki kustom ConnectCallback. Panggilan balik memungkinkan klien untuk membuat koneksi melalui transportasi kustom dan kemudian mengirim permintaan HTTP melalui transportasi tersebut.

Catatan

Beberapa fitur GrpcChannelkonektivitas , seperti penyeimbangan beban sisi klien dan status saluran, tidak dapat digunakan bersama dengan soket domain Unix.

Contoh pabrik koneksi soket domain 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;
        }
    }
}

Menggunakan pabrik koneksi kustom untuk membuat saluran:

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

Saluran yang dibuat menggunakan kode sebelumnya mengirim panggilan gRPC melalui soket domain Unix.