ASP.NET Core: Giao tiếp giữa các tiến trình với socket tên miền gRPC và Unix
Trong bài viết này
.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
- .NET 5 trở lên
- Linux, macOS hoặc Windows 10/Windows Server 2019 trở lên
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:
- Định cấu hình điểm cuối của Kestrel trong configureKestrel.
- Gọi ListenUnixSocket để nghe UDS với đường dẫn đã chỉ định.
- Tạo điểm cuối UDS không được định cấu hình để sử dụng HTTPS. Để biết thông tin về cách bật HTTPS, hãy xem Cấu hình điểm cuối HTTPS của Kestrel.
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.