다음을 통해 공유


gRPC 및 Unix 도메인 소켓과의 프로세스 간 통신

참고 항목

이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

Warning

이 버전의 ASP.NET Core는 더 이상 지원되지 않습니다. 자세한 내용은 .NET 및 .NET Core 지원 정책을 참조 하세요. 현재 릴리스는 이 문서의 .NET 8 버전을 참조 하세요.

Important

이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.

현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.

작성자: James Newton-King

.NET은 gRPC를 사용하는 IPC(프로세스 간 통신)를 지원합니다. gRPC를 사용하여 프로세스 간 통신을 시작하는 방법에 대한 자세한 내용은 gRPC와의 프로세스 간 통신을 참조하세요.

UDS(Unix 도메인 소켓) 는 클라이언트와 서버가 동일한 컴퓨터에 있을 때 TCP보다 더 효율적인 널리 지원되는 IPC 전송입니다. 이 문서에서는 UDS를 통해 gRPC 통신을 구성하는 방법을 설명합니다.

필수 조건

서버 구성

Unix 도메인 소켓은 다음에서 구성된 다음에서 Program.cs지원Kestrel됩니다.

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

위의 예제는 다음과 같습니다.

  • ConfigureKestrel에서 Kestrel의 엔드포인트를 구성합니다.
  • ListenUnixSocket을 호출하여 지정된 경로를 포함한 UDS를 수신 대기합니다.
  • HTTPS를 사용하도록 구성되지 않은 UDS 엔드포인트를 만듭니다. HTTPS를 사용하도록 설정하는 방법에 대한 자세한 내용은 Kestrel HTTPS 엔드포인트 구성을 참조하세요.

클라이언트 구성

GrpcChannel은 사용자 지정 전송을 통한 gRPC 호출을 지원합니다. 채널을 만들 때 사용자 지정 ConnectCallback가 포함된 SocketsHttpHandler로 구성할 수 있습니다. 콜백을 사용하면 클라이언트가 사용자 지정 전송을 통해 연결한 다음 해당 전송을 통해 HTTP 요청을 보낼 수 있습니다.

참고 항목

클라이언트 쪽 부하 분산 및 채널 상태와 같은 일부 연결 기능은 GrpcChannelUnix 도메인 소켓과 함께 사용할 수 없습니다.

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

사용자 지정 연결 팩터리를 사용하여 채널을 만듭니다.

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

위의 코드를 사용하여 만든 채널은 Unix 도메인 소켓을 통해 gRPC 호출을 보냅니다.