gRPC - 프로세스 간 통신 (IPC)

2022. 5. 27. 00:00ASPNET/Grpc

반응형

IPC (프로세스 간 통신) 는 클라이언트와 서버가 같은 머신에 있는 경우 tcp 보다 효율적이다.

gRPC 에서 IPC 를 지원 하는 방법을 알아보자.

 

서버 구성

Program.cs

...
using Microsoft.AspNetCore.Server.Kestrel.Core;
...
// gRPC IPC 설정
string socketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
builder.WebHost.ConfigureKestrel(options =>
{
    if (File.Exists(socketPath))
    {
        File.Delete(socketPath);
    }
    options.ListenUnixSocket(socketPath, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http2;
        listenOptions.UseHttps();
    });
});

 

 

클라이언트 구성

IPC/UnixDomainSocketConnectionFactory.cs

using System.Net;
using System.Net.Sockets;

namespace GrpcClient.IPC;
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;
        }
    }
}

Program.cs

using Grpc.Net.Client;
using GrpcClient.IPC;
using GrpcInterface;
using System.Net.Sockets;

string socketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
var udsEndPoint = new UnixDomainSocketEndPoint(socketPath);
var connectionFactory = new UnixDomainSocketConnectionFactory(udsEndPoint);
var socketsHttpHandler = new SocketsHttpHandler
{
    ConnectCallback = connectionFactory.ConnectAsync
};

var channel = GrpcChannel.ForAddress("https://localhost", new GrpcChannelOptions
{
    HttpHandler = socketsHttpHandler
});

var client = new Greeter.GreeterClient(channel);

var reply = client.SayHello(
                  new HelloRequest { Name = "나는 천재" });
Console.WriteLine("Block Greeting: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();

실행

 

 

 

관련영상

https://youtu.be/e0cP8n0zWIQ

 

반응형

'ASPNET > Grpc' 카테고리의 다른 글

gRPC - 로깅 및 진단  (0) 2022.05.26
gRPC - 인터셉터  (0) 2022.05.25
gRPC - JWT Token 을 통한 인증 처리  (16) 2022.05.24
gRPC - Configuration  (0) 2022.05.23
grpc test - grpcui  (0) 2022.05.20