ASP.NET Core: Giao tiếp giữa các tiến trình với socket tên miền gRPC và Unix


Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

Trong bài viết này

  1. Điều kiện tiên quyết
  2. Cấu hình máy chủ
  3. Cấu hình máy khách

.NET hỗ trợ giao tiếp giữa các quá trình (IPC) bằng gRPC. Để biết thêm thông tin về cách bắt đầu sử dụng gRPC để giao tiếp giữa các quy trình, hãy xem Giao tiếp giữa các tiến trình với gRPC.

Socket miền Unix (UDS) là phương tiện truyền tải IPC được hỗ trợ rộng rãi, hiệu quả hơn TCP khi máy khách và máy chủ ở trên cùng một máy. Bài viết này thảo luận về cách định cấu hình giao tiếp gRPC qua UDS.

Điều kiện tiên quyết

Cấu hình máy chủ

Socket tên miền Unix được hỗ trợ bởi Kestrel, được định cấu hình trong 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;
    });
});

Ví dụ trên:

Cấu hình máy khách

GrpcChannel hỗ trợ thực hiện lời gọi gRPC qua các phương thức truyền tải tùy chỉnh. Khi một kênh được tạo, kênh đó có thể được định cấu hình bằng SocketsHttpHandler có ConnectCallback tùy chỉnh. Lệnh gọi lại cho phép máy khách tạo kết nối qua các phương thức truyền tải tùy chỉnh và sau đó gửi các yêu cầu HTTP qua phương thức truyền tải đó.

Ví dụ về factory kết nối socket tên miền 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;
        }
    }
}

Sử dụng factory kết nối tùy chỉnh để tạo kênh:

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

Các kênh được tạo bằng đoạn code trên sẽ gửi lệnh gọi gRPC qua socket miền Unix.

Nguồn: learn.microsoft.com
» Tiếp: Các dịch vụ và máy khách gRPC code-first với .NET
« Trước: Giao tiếp giữa các tiến trình với gRPC
Khóa học qua video:
Lập trình Python All Lập trình C# All SQL Server All Lập trình C All Java PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!