gRPC ile işlemler arası iletişim

, James bAyKiNg

istemci ve hizmet arasındaki gRPC çağrıları genellikle TCP Yuvaları üzerinden gönderilir. TCP bir ağ üzerinden iletişim kurmak için tasarlandı. İstemci ve hizmet aynı makinede olduğunda, Işlem arası iletişim (IPC) TCP 'den daha etkilidir. Bu belgede, bkz..

Sunucu yapılandırması

Özel aktarımlar tarafından desteklenir Kestrel . Kestrelprogram. cs' de yapılandırılır:

public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.ConfigureKestrel(options =>
            {
                if (File.Exists(SocketPath))
                {
                    File.Delete(SocketPath);
                }
                options.ListenUnixSocket(SocketPath, listenOptions =>
                {
                    listenOptions.Protocols = HttpProtocols.Http2;
                });
            });
        });

Önceki örnek:

Kestrel , UDS uç noktaları için yerleşik desteğe sahiptir. UDS, Windows Linux, macOS ve modern sürümlerindedesteklenir.

İstemci yapılandırması

GrpcChannel Özel aktarımlar üzerinde gRPC çağrıları yapmayı destekler. Bir kanal oluşturulduğunda, özel bir içeren ile yapılandırılabilir SocketsHttpHandler ConnectCallback . Geri arama, istemcinin özel aktarımlar üzerinden bağlantı yapmasına ve ardından bu aktarım üzerinden HTTP istekleri göndermesini sağlar.

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

public class UnixDomainSocketConnectionFactory
{
    private readonly EndPoint _endPoint;

    public UnixDomainSocketConnectionFactory(EndPoint endPoint)
    {
        _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(_endPoint, cancellationToken).ConfigureAwait(false);
            return new NetworkStream(socket, true);
        }
        catch
        {
            socket.Dispose();
            throw;
        }
    }
}

Özel bağlantı fabrikası kullanarak bir kanal oluşturun:

public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");

public static GrpcChannel CreateChannel()
{
    var udsEndPoint = new UnixDomainSocketEndPoint(SocketPath);
    var connectionFactory = new UnixDomainSocketConnectionFactory(udsEndPoint);
    var socketsHttpHandler = new SocketsHttpHandler
    {
        ConnectCallback = connectionFactory.ConnectAsync
    };

    return GrpcChannel.ForAddress("http://localhost", new GrpcChannelOptions
    {
        HttpHandler = socketsHttpHandler
    });
}

Yukarıdaki kod kullanılarak oluşturulan kanallar, UNIX etki alanı Yuvaları üzerinden gRPC çağrıları gönderir. Diğer IPC teknolojileri için destek, ve içindeki genişletilebilirlik kullanılarak uygulanabilir Kestrel SocketsHttpHandler .