Aracılığıyla paylaş


gRPC ile işlemler arası iletişim

Not

Bu, bu makalenin en son sürümü değildir. Geçerli sürüm için bu makalenin .NET 8 sürümüne bakın.

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.

Önemli

Bu bilgiler, ticari olarak piyasaya sürülmeden önce önemli ölçüde değiştirilebilen bir yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

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:

İş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 kimliğini doğrulaması ö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:

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.Appbir ç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.AspNetCorebir 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:

Sunucu yapılandırması

Unix etki alanı yuvaları (UDS), içinde Program.csyapı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 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.

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 SocketsHttpHandlerkullanılarak diğer IPC teknolojileri için destek uygulanabilir.