gRPC ile 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.
Aynı makinede çalışan işlemler birbiriyle iletişim kurmak için tasarlanabilir. İşletim sistemleri, hızlı ve verimli işlemler arası iletişimi (IPC) etkinleştirmeye yönelik teknolojiler sağlar. IPC teknolojilerinin popüler örnekleri Unix etki alanı yuvaları ve Adlandırılmış kanallardır.
.NET, gRPC kullanarak işlemler arası iletişim için destek sağlar.
ASP.NET Core'daki Adlandırılmış kanallar için yerleşik destek için .NET 8 veya üzeri gerekir.
Kullanmaya başlayın
IPC çağrıları bir istemciden sunucuya gönderilir. gRPC ile bir makinedeki uygulamalar arasında iletişim kurmak için en az bir uygulamanın bir ASP.NET Core gRPC sunucusu barındırması gerekir.
ASP.NET Core gRPC sunucusu genellikle gRPC şablonundan oluşturulur. Şablon tarafından oluşturulan proje dosyası SDK olarak kullanır Microsoft.NET.SDK.Web
:
<Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
</Project>
Microsoft.NET.SDK.Web
SDK değeri, ASP.NET Core çerçevesine otomatik olarak bir başvuru ekler. Başvuru, uygulamanın bir sunucuyu barındırmak için gereken ASP.NET Core türlerini kullanmasına olanak tanır.
Windows Hizmetleri, WPF uygulamaları veya WinForms uygulamaları gibi mevcut non-ASP.NET Core projelerine sunucu eklemek de mümkündür. Daha fazla bilgi için bkz . non-ASP.NET Core projelerinde gRPC barındırma.
İşlemler arası iletişim (IPC) taşımaları
Farklı makinelerde bir istemci ile sunucu arasındaki gRPC çağrıları genellikle TCP yuvaları üzerinden gönderilir. TCP, bir ağ veya İnternet üzerinden iletişim kurmak için iyi bir seçimdir. Ancak, IPC aktarımları aynı makinedeki işlemler arasında iletişim kurarken avantajlar sunar:
- Daha az ek yük ve daha hızlı aktarım hızları.
- İşletim sistemi güvenlik özellikleriyle tümleştirme.
- Sınırlı bir kaynak olan TCP bağlantı noktalarını kullanmaz.
.NET birden çok IPC aktarımını destekler:
- Unix etki alanı yuvaları (UDS), yaygın olarak desteklenen bir IPC teknolojisidir. UDS, platformlar arası uygulamalar oluşturmak için en iyi seçenektir ve Linux, macOS ve Windows 10/Windows Server 2019 veya sonraki sürümlerde kullanılabilir.
- Adlandırılmış kanallar Windows'un tüm sürümleri tarafından desteklenir. Adlandırılmış kanallar, kanala istemci erişimini denetleyebilen Windows güvenliğiyle iyi bir şekilde tümleşir.
- Uygulama başlangıcında uygulamayı uygulayıp IConnectionListenerFactory kaydederek ek IPC aktarımları.
İşletim sistemine bağlı olarak platformlar arası uygulamalar farklı IPC aktarımları seçebilir. Bir uygulama başlangıçta işletim sistemini denetleyebiliyor ve bu platform için istenen aktarımı seçebiliyor:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel(serverOptions =>
{
if (OperatingSystem.IsWindows())
{
serverOptions.ListenNamedPipe("MyPipeName");
}
else
{
var socketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
serverOptions.ListenUnixSocket(socketPath);
}
serverOptions.ConfigureEndpointDefaults(listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
Güvenlik konuları
IPC uygulamaları RPC çağrıları gönderir ve alır. Dış iletişim, IPC uygulamaları için olası bir saldırı vektördür ve düzgün bir şekilde güvenli hale getirilmelidir.
Beklenmeyen arayanlara karşı IPC sunucu uygulamasının güvenliğini sağlama
IPC sunucusu uygulaması, diğer uygulamaların çağıracakları RPC hizmetlerini barındırıyor. Güvenilmeyen istemcilerin sunucuya RPC çağrıları yapmasını önlemek için gelen arayanların kimliği doğrulanmalıdır.
Aktarım güvenliği, sunucunun güvenliğini sağlamak için bir seçenektir. Unix etki alanı yuvaları ve adlandırılmış kanallar gibi IPC aktarımları, işletim sistemi izinlerine göre erişimi sınırlamayı destekler:
- Adlandırılmış kanallar, Windows erişim denetimi modeliyle bir kanalın güvenliğini sağlamayı destekler. Bir sunucu sınıfı kullanılarak başlatıldığında erişim hakları .NET'te PipeSecurity yapılandırılabilir.
- Unix etki alanı yuvaları, dosya izinleriyle yuvanın güvenliğini sağlamayı destekler.
IPC sunucusunun güvenliğini sağlamak için bir diğer seçenek de ASP.NET Core'da yerleşik olarak bulunan kimlik doğrulaması ve yetkilendirmeyi kullanmaktır. Örneğin, sunucu sertifika kimlik doğrulaması gerektirecek şekilde yapılandırılabilir. gerekli sertifika olmadan istemci uygulamaları tarafından yapılan RPC çağrıları yetkisiz bir yanıtla başarısız olur.
IPC istemci uygulamasında sunucuyu doğrulama
İstemci uygulamasının çağırmış olduğu sunucunun identity doğrulamasını sağlamak önemlidir. Doğrulama, kötü niyetli bir aktörün güvenilen sunucuyu durdurmasına, kendi sunucusunu çalıştırmasına ve istemcilerden gelen verileri kabul etmesine karşı koruma sağlamak için gereklidir.
Adlandırılmış kanallar, bir sunucunun altında çalıştığı hesabı almak için destek sağlar. İstemci, sunucunun beklenen hesap tarafından başlatıldığını doğrulayabilir:
internal static bool CheckPipeConnectionOwnership(
NamedPipeClientStream pipeStream, SecurityIdentifier expectedOwner)
{
var remotePipeSecurity = pipeStream.GetAccessControl();
var remoteOwner = remotePipeSecurity.GetOwner(typeof(SecurityIdentifier));
return expectedOwner.Equals(remoteOwner);
}
Sunucuyu doğrulamaya yönelik bir diğer seçenek de ASP.NET Core içindeki HTTPS ile uç noktalarının güvenliğini sağlamaktır. İstemci, bağlantı kurulduğunda sunucunun beklenen sertifikayı kullandığını doğrulamak için yapılandırabilir SocketsHttpHandler
.
var socketsHttpHandler = new SocketsHttpHandler()
{
SslOptions = new SslOptions()
{
RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
{
if (sslPolicyErrors != SslPolicyErrors.None)
{
return false;
}
// Validate server cert thumbprint matches the expected thumbprint.
}
}
};
Adlandırılmış kanal ayrıcalığını yükseltmeye karşı koruma
Adlandırılmış kanallar kimliğe bürünme adlı bir özelliği destekler. Kimliğe bürünme özelliğini kullanarak adlandırılmış kanallar sunucusu, istemci kullanıcının ayrıcalıklarıyla kod yürütebilir. Bu güçlü bir özelliktir, ancak düşük ayrıcalıklı bir sunucunun yüksek ayrıcalıklı bir çağıranın kimliğine bürünüp kötü amaçlı kod çalıştırmasına izin verebilir.
İstemciler bir sunucuya bağlanırken kimliğe bürünmeye izin vermeyerek bu saldırıya karşı koruyabilir. Sunucu tarafından gerekli kılınmadığı sürece, TokenImpersonationLevel istemci bağlantısı oluşturulurken veya Anonymous
değeri None
kullanılmalıdır:
using var pipeClient = new NamedPipeClientStream(
serverName: ".", pipeName: "testpipe", PipeDirection.In, PipeOptions.None, TokenImpersonationLevel.None);
await pipeClient.ConnectAsync();
TokenImpersonationLevel.None
, parametresi olmayan impersonationLevel
oluşturucularda NamedPipeClientStream
varsayılan değerdir.
İstemciyi ve sunucuyu yapılandırma
İstemci ve sunucu, işlemler arası iletişim (IPC) aktarımı kullanacak şekilde yapılandırılmalıdır. IPC'yi yapılandırma Kestrel ve SocketsHttpHandler kullanma hakkında daha fazla bilgi için:
- gRPC ve Unix etki alanı yuvalarıyla işlemler arası iletişim
- gRPC ve Adlandırılmış kanallar ile işlemler arası iletişim
Not
ASP.NET Core'daki Adlandırılmış kanallar için yerleşik destek için .NET 8 veya üzeri gerekir.
Aynı makinede çalışan işlemler birbiriyle iletişim kurmak için tasarlanabilir. İşletim sistemleri, hızlı ve verimli işlemler arası iletişimi (IPC) etkinleştirmeye yönelik teknolojiler sağlar. IPC teknolojilerinin popüler örnekleri Unix etki alanı yuvaları ve Adlandırılmış kanallardır.
.NET, gRPC kullanarak işlemler arası iletişim için destek sağlar.
Not
ASP.NET Core'daki Adlandırılmış kanallar için yerleşik destek için .NET 8 veya üzeri gerekir.
Daha fazla bilgi için bu konunun .NET 8 veya sonraki sürümüne bakın
Kullanmaya başlayın
gRPC çağrıları bir istemciden sunucuya gönderilir. gRPC ile bir makinedeki uygulamalar arasında iletişim kurmak için en az bir uygulamanın bir ASP.NET Core gRPC sunucusu barındırması gerekir.
ASP.NET Core ve gRPC, çerçeveyi projeye ekleyerek Microsoft.AspNetCore.App
.NET Core 3.1 veya üzerini kullanarak herhangi bir uygulamada barındırılabilir.
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Grpc.AspNetCore" Version="2.47.0" />
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
</ItemGroup>
</Project>
Önceki proje dosyası:
- öğesine
Microsoft.AspNetCore.App
bir çerçeve başvurusu ekler. Çerçeve başvurusu, Windows Hizmetleri, WPF uygulamaları veya WinForms uygulamaları gibi non-ASP.NET Core uygulamalarının ASP.NET Core kullanmasına ve bir ASP.NET Core sunucusu barındırmasına olanak tanır. - öğesine
Grpc.AspNetCore
bir NuGet paket başvurusu ekler. - Bir
.proto
dosya ekler.
Unix etki alanı yuvalarını yapılandırma
Farklı makinelerde bir istemci ile sunucu arasındaki gRPC çağrıları genellikle TCP yuvaları üzerinden gönderilir. TCP, ağ üzerinden iletişim kurmak için tasarlanmıştır. Unix etki alanı yuvaları (UDS), istemci ve sunucu aynı makinede olduğunda TCP'den daha verimli olan yaygın olarak desteklenen bir IPC teknolojisidir. .NET, istemci ve sunucu uygulamalarında UDS için yerleşik destek sağlar.
Gereksinimler:
- .NET 5 veya üzeri
- Linux, macOS veya Windows 10/Windows Server 2019 veya üzeri
Sunucu yapılandırması
Unix etki alanı yuvaları (UDS), içinde Program.cs
yapılandırılan tarafından Kestreldesteklenir:
public static readonly string SocketPath = Path.Combine(Path.GetTempPath(), "socket.tmp");
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureKestrel(options =>
{
if (File.Exists(SocketPath))
{
File.Delete(SocketPath);
}
options.ListenUnixSocket(SocketPath, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
});
});
Yukarıdaki örnek:
- Kestrel'nin uç noktalarını içinde
ConfigureKestrel
yapı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 ConnectCallback
bir 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.
Unix etki alanı yuvaları bağlantı fabrikası örneği:
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;
}
}
}
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 UnixDomainSocketConnectionFactory(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. ve içindeki genişletilebilirlik Kestrel SocketsHttpHandler
kullanılarak diğer IPC teknolojileri için destek uygulanabilir.
ASP.NET Core