gRPC ve Unix etki alanı yuvalarıyla işlemler arası iletişim
Uyarı
ASP.NET Core'un bu sürümü artık desteklenmiyor. Daha fazla bilgi için bkz . .NET ve .NET Core Destek İlkesi. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.
Yayınlayan James Newton-King
.NET, gRPC kullanarak işlemler arası iletişimi (IPC) destekler. İşlemler arasında iletişim kurmak için gRPC kullanmaya başlama hakkında daha fazla bilgi için bkz . gRPC ile işlemler arası iletişim.
Unix etki alanı yuvaları (UDS), istemci ve sunucu aynı makinede olduğunda TCP'den daha verimli olan, yaygın olarak desteklenen bir IPC aktarımıdır. Bu makalede UDS üzerinden gRPC iletişimin nasıl yapılandırılacağı açıklanır.
Önkoşullar
- .NET 5 veya üzeri
- Linux, macOS veya Windows 10/Windows Server 2019 veya üzeri
Sunucu yapılandırması
Unix etki alanı yuvaları, içinde Program.cs
yapılandırılan tarafından Kestreldesteklenir:
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;
});
});
Yukarıdaki örnek:
- Kestrel'nin uç noktalarını içinde ConfigureKestrelyapılandırıyor.
- Belirtilen yola sahip bir UDS'yi dinlemek için çağrılar ListenUnixSocket .
- HTTPS kullanacak şekilde yapılandırılmamış bir UDS uç noktası oluşturur. HTTPS'yi etkinleştirme hakkında bilgi için bkz Kestrel . HTTPS uç noktası yapılandırması.
İstemci yapılandırması
GrpcChannel
özel aktarımlar üzerinden gRPC çağrıları yapmayı destekler. Bir kanal oluşturulduğunda, özel ConnectCallbackbir içeren ile SocketsHttpHandler yapılandırılabilir. Geri çağırma, istemcinin özel aktarımlar üzerinden bağlantı yapmasına ve ardından bu aktarım üzerinden HTTP istekleri göndermesine olanak tanır.
Not
İstemci tarafı yük dengeleme ve kanal durumu gibi bazı bağlantı özellikleri GrpcChannel
Unix etki alanı yuvalarıyla birlikte kullanılamaz.
Unix etki alanı yuvaları bağlantı fabrikası örneği:
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;
}
}
}
Kanal oluşturmak için özel bağlantı fabrikasını kullanma:
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
});
}
Önceki kod kullanılarak oluşturulan kanallar Unix etki alanı yuvaları üzerinden gRPC çağrıları gönderir.
ASP.NET Core