Azure Service Fabric Reliable Services'da ASP.NET Core

ASP.NET Core açık kaynaklı ve platformlar arası bir çerçevedir. Bu çerçeve web uygulamaları, IoT uygulamaları ve mobil arka uçlar gibi bulut tabanlı, İnternet'e bağlı uygulamalar oluşturmak için tasarlanmıştır.

Bu makale, Microsoft.ServiceFabric.AspNetCore. NuGet paketleri kümesini kullanarak Service Fabric Reliable Services'da ASP.NET Core hizmetleri barındırmaya yönelik ayrıntılı bir kılavuzdur.

Service Fabric'te ASP.NET Core hakkında giriş niteliğinde bir öğretici ve geliştirme ortamınızı ayarlama yönergeleri için bkz. Öğretici: ASP.NET Core Web API'si ön uç hizmeti ve durum bilgisi olan bir arka uç hizmetiyle uygulama oluşturma ve dağıtma.

Bu makalenin geri kalanında, ASP.NET Core zaten bildiğiniz varsayılır. Aksi takdirde lütfen ASP.NET Core temel bilgilerini okuyun.

Service Fabric ortamında ASP.NET Core

Hem ASP.NET Core hem de Service Fabric uygulamaları .NET Core veya tam .NET Framework üzerinde çalıştırılabilir. Service Fabric'te ASP.NET Core iki farklı şekilde kullanabilirsiniz:

  • Konuk yürütülebilir dosyası olarak barındırılır. Bu yol öncelikli olarak mevcut ASP.NET Core uygulamalarını kod değişikliği olmadan Service Fabric'te çalıştırmak için kullanılır.
  • Güvenilir bir hizmet içinde çalıştırın. Bu şekilde Service Fabric çalışma zamanıyla daha iyi tümleştirmeye ve durum bilgisi olan ASP.NET Core hizmetlerine izin verir.

Bu makalenin geri kalanında, Service Fabric SDK ile birlikte gelen ASP.NET Core tümleştirme bileşenleri aracılığıyla ASP.NET Core güvenilir bir hizmet içinde nasıl kullanılacağı açıklanmaktadır.

Service Fabric hizmeti barındırma

Service Fabric'te, hizmetinizin bir veya daha fazla örneği ve/veya çoğaltması bir hizmet ana bilgisayar işleminde çalışır: hizmet kodunuzu çalıştıran yürütülebilir dosya. Hizmet yazarı olarak hizmet ana bilgisayar işleminin sahibi siz olursunuz ve Service Fabric hizmeti sizin için etkinleştirir ve izler.

Geleneksel ASP.NET (MVC 5'e kadar) System.Web.dll aracılığıyla IIS ile sıkı bir şekilde eşleştirilir. ASP.NET Core, web sunucusu ile web uygulamanız arasında bir ayrım sağlar. Bu ayrım, web uygulamalarının farklı web sunucuları arasında taşınabilir olmasını sağlar. Ayrıca web sunucularının kendi kendine barındırılmasına da olanak tanır. Bu, IIS gibi ayrılmış web sunucusu yazılımına ait bir işlem yerine kendi işleminizde bir web sunucusu başlatabileceğiniz anlamına gelir.

Bir Service Fabric hizmetini ve ASP.NET konuk yürütülebilir dosyası olarak veya güvenilir bir hizmette birleştirmek için hizmet ana bilgisayar işleminizde ASP.NET başlatabilmeniz gerekir. ASP.NET Core kendi kendine barındırma bunu yapmanızı sağlar.

ASP.NET Core güvenilir bir hizmette barındırma

Genellikle, şirket içinde barındırılan ASP.NET Core uygulamaları, uygulamasındaki yöntemi Program.csgibi static void Main() bir uygulamanın giriş noktasında bir WebHost oluşturur. Bu durumda, WebHost'un yaşam döngüsü sürecin yaşam döngüsüne bağlıdır.

bir işlemde ASP.NET Core barındırma

Ancak uygulama giriş noktası, güvenilir bir hizmette WebHost oluşturmak için doğru yer değildir. Bunun nedeni, uygulama giriş noktasının yalnızca service Fabric çalışma zamanına bir hizmet türü kaydetmek için kullanılmasıdır, böylece bu hizmet türünün örneklerini oluşturabilir. WebHost, güvenilir bir hizmetin kendisinde oluşturulmalıdır. Hizmet ana bilgisayar işlemi içinde, hizmet örnekleri ve/veya çoğaltmaları birden çok yaşam döngüsünden geçebilir.

Reliable Service örneği, veya StatefulServiceöğesinden StatelessService türetilen hizmet sınıfınız tarafından temsil edilir. Bir hizmetin iletişim yığını, hizmet sınıfınızdaki bir ICommunicationListener uygulamada yer alır. Microsoft.ServiceFabric.AspNetCore.* NuGet paketleri, kestrel veya güvenilir bir hizmette HTTP.sys için ASP.NET Core WebHost'unu başlatan ve yöneten uygulamaları ICommunicationListener içerir.

güvenilir bir hizmette ASP.NET Core barındırma diyagramı

ASP.NET Core ICommunicationListeners

ICommunicationListener NuGet paketlerindeki Microsoft.ServiceFabric.AspNetCore.* Kestrel ve HTTP.sys uygulamaları benzer kullanım desenlerine sahiptir. Ancak, her web sunucusuna özgü biraz farklı eylemler gerçekleştirirler.

her iki iletişim dinleyicisi de aşağıdaki bağımsız değişkenleri alan bir oluşturucu sağlar:

  • ServiceContext serviceContext: Bu, çalışan hizmet hakkında bilgi içeren nesnedir ServiceContext .
  • string endpointName: Bu, ServiceManifest.xml bir Endpoint yapılandırmanın adıdır. Burada öncelikle iki iletişim dinleyicisi farklıdır. HTTP.sys yapılandırma Endpointgerektirirken Kestrel yapılandırma gerektirmez.
  • Func<string, AspNetCoreCommunicationListener, IWebHost> build: Bu, oluşturduğunuz ve döndürdüğünüz bir IWebHostlambdadır. Bir ASP.NET Core uygulamasında normalde yaptığınız gibi yapılandırmanıza IWebHost olanak tanır. Lambda, kullandığınız Service Fabric tümleştirme seçeneklerine ve sağladığınız yapılandırmaya Endpoint bağlı olarak sizin için oluşturulan bir URL sağlar. Ardından web sunucusunu başlatmak için bu URL'yi değiştirebilir veya kullanabilirsiniz.

Service Fabric tümleştirme ara yazılımı

Microsoft.ServiceFabric.AspNetCore NuGet paketi, UseServiceFabricIntegrationIWebHostBuilder Service Fabric kullanan ara yazılımı ekleyen uzantısı yöntemini içerir. Bu ara yazılım Kestrel'i veya HTTP.sys ICommunicationListener Service Fabric Adlandırma Hizmeti'ne benzersiz bir hizmet URL'si kaydedecek şekilde yapılandırıyor. Ardından istemcilerin doğru hizmete bağlandığından emin olmak için istemci isteklerini doğrular.

Bu adım, istemcilerin yanlışlıkla yanlış hizmete bağlanmasını önlemek için gereklidir. Bunun nedeni, Service Fabric gibi paylaşılan bir konak ortamında birden çok web uygulamasının aynı fiziksel veya sanal makinede çalışabilmesi ancak benzersiz konak adları kullanmamasıdır. Bu senaryo sonraki bölümde daha ayrıntılı olarak açıklanmıştır.

Hatalı kimlik örneği

Hizmet çoğaltmaları, protokolden bağımsız olarak benzersiz bir IP:bağlantı noktası bileşimini dinler. Bir hizmet çoğaltması IP:bağlantı noktası uç noktasını dinlemeye başladıktan sonra bu uç nokta adresini Service Fabric Adlandırma Hizmeti'ne bildirir. Burada, istemciler veya diğer hizmetler bunu bulabilir. Hizmetler dinamik olarak atanmış uygulama bağlantı noktaları kullanıyorsa, hizmet çoğaltması aynı fiziksel veya sanal makinede daha önce başka bir hizmetin aynı IP:bağlantı noktası uç noktasını tesadüfen kullanabilir. Bu, istemcinin yanlışlıkla yanlış hizmete bağlanmasına neden olabilir. Bu senaryo, aşağıdaki olay dizisi gerçekleşirse sonuçlanabilir:

  1. Hizmet A, HTTP üzerinden 10.0.0.1:30000 tarihinde dinler.
  2. İstemci A hizmetini çözümler ve 10.0.0.1:30000 adresini alır.
  3. A hizmeti farklı bir düğüme taşınır.
  4. B hizmeti 10.0.0.1'e yerleştirilir ve tesadüfen aynı 30000 numaralı bağlantı noktasını kullanır.
  5. İstemci, önbelleğe alınmış 10.0.0.1:30000 adresine sahip A hizmetine bağlanmayı dener.
  6. İstemci artık B hizmetine başarıyla bağlandı, yanlış hizmete bağlı olduğunu fark etmemektedir.

Bu, rastgele zamanlarda tanılanması zor olabilecek hatalara neden olabilir.

Benzersiz hizmet URL'lerini kullanma

Bu hataları önlemek için hizmetler, adlandırma hizmetine benzersiz bir tanımlayıcı ile bir uç nokta gönderebilir ve ardından istemci istekleri sırasında bu benzersiz tanımlayıcıyı doğrulayabilir. Bu, saldırgan olmayan kiracı güvenilir ortamındaki hizmetler arasında işbirliğine dayalı bir eylemdir. Saldırgan kiracı ortamında güvenli hizmet kimlik doğrulaması sağlamaz.

Güvenilir bir ortamda, yöntemi tarafından UseServiceFabricIntegration eklenen ara yazılım, Adlandırma Hizmeti'ne gönderilen adrese otomatik olarak benzersiz bir tanımlayıcı ekler. Her istekte bu tanımlayıcıyı doğrular. Tanımlayıcı eşleşmiyorsa ara yazılım hemen bir HTTP 410 Gone yanıtı döndürür.

Dinamik olarak atanmış bir bağlantı noktası kullanan hizmetler bu ara yazılımı kullanmalıdır.

Sabit bir benzersiz bağlantı noktası kullanan hizmetlerin işbirliği ortamında bu sorun yoktur. Sabit benzersiz bağlantı noktası genellikle istemci uygulamalarının bağlanabilmesi için iyi bilinen bir bağlantı noktasına ihtiyaç duyan dışarıdan kullanıma yönelik hizmetler için kullanılır. Örneğin, İnternet'e yönelik web uygulamalarının çoğu web tarayıcısı bağlantıları için 80 veya 443 numaralı bağlantı noktasını kullanır. Bu durumda benzersiz tanımlayıcı etkinleştirilmemelidir.

Aşağıdaki diyagramda ara yazılım etkinleştirilmiş olarak istek akışı gösterilmektedir:

Service Fabric ASP.NET Core tümleştirmesi

Hem Kestrel hem de HTTP.sys ICommunicationListener uygulamaları bu mekanizmayı tam olarak aynı şekilde kullanır. HTTP.sys, temel alınan HTTP.sys bağlantı noktası paylaşımı özelliğini kullanarak istekleri benzersiz URL yollarına göre dahili olarak ayırt edebilir, ancak bu işlev HTTP.sys ICommunicationListener uygulaması tarafından kullanılmaz. Bunun nedeni, daha önce açıklanan senaryoda HTTP 503 ve HTTP 404 hata durum kodlarıyla sonuçlandığıdır. Bu da http 503 ve HTTP 404 diğer hataları göstermek için yaygın olarak kullanıldığından istemcilerin hatanın amacını belirlemesini zorlaştırır.

Bu nedenle, hem Kestrel hem de HTTP.sys ICommunicationListener uygulamaları, uzantı yöntemi tarafından UseServiceFabricIntegration sağlanan ara yazılımlarda standart hale getirmektedir. Bu nedenle istemcilerin yalnızca HTTP 410 yanıtlarında bir hizmet uç noktası yeniden çözümleme eylemi gerçekleştirmesi gerekir.

Reliable Services'da HTTP.sys

Microsoft.ServiceFabric.AspNetCore.HttpSys NuGet paketini içeri aktararak Reliable Services'da HTTP.sys kullanabilirsiniz. Bu paket, uygulamasını ICommunicationListeneriçerirHttpSysCommunicationListener. HttpSysCommunicationListener, web sunucusu olarak HTTP.sys kullanarak güvenilir bir hizmet içinde ASP.NET Core bir WebHost oluşturmanıza olanak tanır.

HTTP.sys , Windows HTTP Server API'sinde oluşturulur. Bu API, HTTP isteklerini işlemek ve web uygulamalarını çalıştıran işlemlere yönlendirmek için HTTP.sys çekirdek sürücüsünü kullanır. Bu, aynı fiziksel veya sanal makinedeki birden çok işlemin web uygulamalarını aynı bağlantı noktasında barındırmasına olanak tanır ve benzersiz bir URL yolu veya ana bilgisayar adıyla kesinleştirilir. Bu özellikler Service Fabric'te aynı kümede birden çok web sitesi barındırmak için kullanışlıdır.

Not

HTTP.sys uygulaması yalnızca Windows platformunda çalışır.

Aşağıdaki diyagramda, HTTP.sys bağlantı noktası paylaşımı için Windows'taki HTTP.sys çekirdek sürücüsünü nasıl kullandığı gösterilmektedir:

HTTP.sys diyagramı

Durum bilgisi olmayan bir hizmette HTTP.sys

Durum bilgisi olmayan bir hizmette kullanmak HttpSys için yöntemini geçersiz kılın CreateServiceInstanceListeners ve bir HttpSysCommunicationListener örnek döndürin:

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new ServiceInstanceListener[]
    {
        new ServiceInstanceListener(serviceContext =>
            new HttpSysCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
                new WebHostBuilder()
                    .UseHttpSys()
                    .ConfigureServices(
                        services => services
                            .AddSingleton<StatelessServiceContext>(serviceContext))
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                    .UseStartup<Startup>()
                    .UseUrls(url)
                    .Build()))
    };
}

Durum bilgisi olan bir hizmette HTTP.sys

HttpSysCommunicationListener şu anda temelHTTP.sys bağlantı noktası paylaşımı özelliğindeki komplikasyonlar nedeniyle durum bilgisi olan hizmetlerde kullanılmak üzere tasarlanmamıştır. Daha fazla bilgi için HTTP.sys ile dinamik bağlantı noktası ayırma ile ilgili aşağıdaki bölüme bakın. Durum bilgisi olan hizmetler için Kestrel önerilen web sunucusudur.

Uç nokta yapılandırması

HTTP.sys dahil olmak üzere Windows HTTP Server API'sini kullanan web sunucuları için bir Endpoint yapılandırma gereklidir. Windows HTTP Server API'sini kullanan web sunucuları önce URL'lerini HTTP.sys ile ayırmalıdır (bu normalde netsh aracıyla gerçekleştirilir).

Bu eylem, hizmetlerinizin varsayılan olarak sahip olmadığı yükseltilmiş ayrıcalıklar gerektirir. ServiceManifest.xml'da yapılandırma özelliğinin ProtocolEndpoint "http" veya "https" seçenekleri, Service Fabric çalışma zamanının sizin adınıza HTTP.sys ile bir URL kaydetmesini bildirmek için özel olarak kullanılır. Bunu, güçlü joker KARAKTER URL ön ekini kullanarak yapar.

Örneğin, bir hizmete ayırmak http://+:80 için ServiceManifest.xml'da aşağıdaki yapılandırmayı kullanın:

<ServiceManifest ... >
    ...
    <Resources>
        <Endpoints>
            <Endpoint Name="ServiceEndpoint" Protocol="http" Port="80" />
        </Endpoints>
    </Resources>

</ServiceManifest>

Uç nokta adı oluşturucuya HttpSysCommunicationListener geçirilmelidir:

 new HttpSysCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
 {
     return new WebHostBuilder()
         .UseHttpSys()
         .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
         .UseUrls(url)
         .Build();
 })

Statik bağlantı noktasıyla HTTP.sys kullanma

HTTP.sys ile statik bağlantı noktası kullanmak için yapılandırmada Endpoint bağlantı noktası numarasını belirtin:

  <Resources>
    <Endpoints>
      <Endpoint Protocol="http" Name="ServiceEndpoint" Port="80" />
    </Endpoints>
  </Resources>

Dinamik bağlantı noktasıyla HTTP.sys kullanma

HTTP.sys ile dinamik olarak atanmış bir bağlantı noktası kullanmak için yapılandırmadaki özelliğini atlar PortEndpoint :

  <Resources>
    <Endpoints>
      <Endpoint Protocol="http" Name="ServiceEndpoint" />
    </Endpoints>
  </Resources>

Yapılandırma tarafından Endpoint ayrılan dinamik bağlantı noktası, konak işlemi başına yalnızca bir bağlantı noktası sağlar. Geçerli Service Fabric barındırma modeli, birden çok hizmet örneğinin ve/veya çoğaltmanın aynı işlemde barındırılmasına izin verir. Bu, her birinin yapılandırma aracılığıyla Endpoint ayrıldığında aynı bağlantı noktasını paylaşacağı anlamına gelir. Birden çok HTTP.sys örneği, temel HTTP.sys bağlantı noktası paylaşımı özelliğini kullanarak bir bağlantı noktasını paylaşabilir. Ancak istemci istekleri için sunduğu komplikasyonlar nedeniyle tarafından HttpSysCommunicationListener desteklenmez. Dinamik bağlantı noktası kullanımı için Kestrel önerilen web sunucusudur.

Reliable Services'da Kestrel

Microsoft.ServiceFabric.AspNetCore.Kestrel NuGet paketini içeri aktararak Reliable Services'da Kestrel kullanabilirsiniz. Bu paket, uygulamasını ICommunicationListeneriçerirKestrelCommunicationListener. KestrelCommunicationListener, web sunucusu olarak Kestrel kullanarak güvenilir bir hizmet içinde ASP.NET Core bir WebHost oluşturmanıza olanak tanır.

Kestrel, ASP.NET Core için platformlar arası bir web sunucusudur. kestrel, HTTP.sys aksine merkezi uç nokta yöneticisi kullanmaz. HTTP.sys aksine Kestrel, birden çok işlem arasında bağlantı noktası paylaşımını desteklemez. Kestrel'in her örneği benzersiz bir bağlantı noktası kullanmalıdır. Kestrel hakkında daha fazla bilgi için bkz. Uygulama Ayrıntıları.

Kestrel diyagramı

Durum bilgisi olmayan bir hizmette Kestrel

Durum bilgisi olmayan bir hizmette kullanmak Kestrel için yöntemini geçersiz kılın CreateServiceInstanceListeners ve bir KestrelCommunicationListener örnek döndürin:

protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new ServiceInstanceListener[]
    {
        new ServiceInstanceListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
                new WebHostBuilder()
                    .UseKestrel()
                    .ConfigureServices(
                        services => services
                            .AddSingleton<StatelessServiceContext>(serviceContext))
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                    .UseStartup<Startup>()
                    .UseUrls(url)
                    .Build();
            ))
    };
}

Durum bilgisi olan bir hizmette Kestrel

Durum bilgisi olan bir hizmette kullanmak Kestrel için yöntemini geçersiz kılın CreateServiceReplicaListeners ve bir KestrelCommunicationListener örnek döndürin:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new ServiceReplicaListener[]
    {
        new ServiceReplicaListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, (url, listener) =>
                new WebHostBuilder()
                    .UseKestrel()
                    .ConfigureServices(
                         services => services
                             .AddSingleton<StatefulServiceContext>(serviceContext)
                             .AddSingleton<IReliableStateManager>(this.StateManager))
                    .UseContentRoot(Directory.GetCurrentDirectory())
                    .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                    .UseStartup<Startup>()
                    .UseUrls(url)
                    .Build();
            ))
    };
}

Bu örnekte, WebHost bağımlılık ekleme kapsayıcısına tekil örneği IReliableStateManager sağlanmıştır. Bu kesinlikle gerekli değildir, ancak MVC denetleyici eylem yöntemlerinizde ve Güvenilir Koleksiyonlar'ı kullanmanıza IReliableStateManager olanak tanır.

Durum Endpoint bilgisi olan bir hizmette yapılandırma KestrelCommunicationListener adı sağlanmaz. Bu, aşağıdaki bölümde daha ayrıntılı olarak açıklanmıştır.

Kestrel’i HTTPS kullanacak şekilde yapılandırma

Hizmetinizde Kestrel ile HTTPS'yi etkinleştirirken birkaç dinleme seçeneği ayarlamanız gerekir. ServiceInstanceListenerUç NoktaHttps uç noktasını kullanacak şekilde güncelleştirin ve belirli bir bağlantı noktasını (443 numaralı bağlantı noktası gibi) dinleyin. Web konağını Kestrel web sunucusunu kullanacak şekilde yapılandırırken, Kestrel'i tüm ağ arabirimlerinde IPv6 adreslerini dinleyecek şekilde yapılandırmanız gerekir:

new ServiceInstanceListener(
serviceContext =>
    new KestrelCommunicationListener(
        serviceContext,
        "EndpointHttps",
        (url, listener) =>
        {
            ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

            return new WebHostBuilder()
                .UseKestrel(opt =>
                {
                    int port = serviceContext.CodePackageActivationContext.GetEndpoint("EndpointHttps").Port;
                    opt.Listen(IPAddress.IPv6Any, port, listenOptions =>
                    {
                        listenOptions.UseHttps(GetCertificateFromStore());
                        listenOptions.NoDelay = true;
                    });
                })
                .ConfigureAppConfiguration((builderContext, config) =>
                {
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
                })

                .ConfigureServices(
                    services => services
                        .AddSingleton<HttpClient>(new HttpClient())
                        .AddSingleton<FabricClient>(new FabricClient())
                        .AddSingleton<StatelessServiceContext>(serviceContext))
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                .UseUrls(url)
                .Build();
        }))

Öğreticideki tam bir örnek için bkz. Kestrel'i HTTPS kullanacak şekilde yapılandırma.

Uç nokta yapılandırması

Endpoint Kestrel kullanmak için yapılandırma gerekmez.

Kestrel basit bir tek başına web sunucusudur. HTTP.sys'den (veya HttpListener'dan) farklı olarak, ServiceManifest.xml'da bir Endpoint yapılandırma gerekmez çünkü başlamadan önce URL kaydı gerektirmez.

Kestrel'i statik bağlantı noktasıyla kullanma

Kestrel ile kullanmak üzere ServiceManifest.xml yapılandırmasında Endpoint statik bağlantı noktası yapılandırabilirsiniz. Bu kesinlikle gerekli olmasa da iki olası avantaj sunar:

  • Bağlantı noktası uygulama bağlantı noktası aralığına düşmezse Service Fabric tarafından işletim sistemi güvenlik duvarı üzerinden açılır.
  • Aracılığıyla KestrelCommunicationListener size sağlanan URL bu bağlantı noktasını kullanır.
  <Resources>
    <Endpoints>
      <Endpoint Protocol="http" Name="ServiceEndpoint" Port="80" />
    </Endpoints>
  </Resources>

yapılandırıldıysa Endpoint , adı oluşturucuya KestrelCommunicationListener geçirilmelidir:

new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => ...

ServiceManifest.xml yapılandırma Endpoint kullanmıyorsa, oluşturucudaki adı atlar KestrelCommunicationListener . Bu durumda dinamik bir bağlantı noktası kullanır. Bu konuda daha fazla bilgi için sonraki bölüme bakın.

Kestrel'i dinamik bağlantı noktasıyla kullanma

Kestrel, ServiceManifest.xml yapılandırmasından otomatik bağlantı noktası atamasını Endpoint kullanamaz. Bunun nedeni, yapılandırmadan Endpoint otomatik bağlantı noktası atama işleminin konak işlemi başına benzersiz bir bağlantı noktası ataması ve tek bir konak işleminin birden çok Kestrel örneği içermesidir. Bu, bağlantı noktası paylaşımını desteklemediğinden Kestrel ile çalışmaz. Bu nedenle, her Kestrel örneği benzersiz bir bağlantı noktasında açılmalıdır.

Kestrel ile dinamik bağlantı noktası atamasını kullanmak için, ServiceManifest.xml içindeki yapılandırmayı Endpoint tamamen atlayın ve oluşturucuya KestrelCommunicationListener aşağıdaki gibi bir uç nokta adı geçirmeyin:

new KestrelCommunicationListener(serviceContext, (url, listener) => ...

Bu yapılandırmada, KestrelCommunicationListener uygulama bağlantı noktası aralığından kullanılmayan bir bağlantı noktasını otomatik olarak seçer.

HTTPS için, uç noktanın ServiceManifest.xml belirtilen bir bağlantı noktası olmadan HTTPS protokolüyle yapılandırılmış olması ve uç nokta adını KestrelCommunicationListener oluşturucusuna geçirmesi gerekir.

IHost ve Minimum Barındırma tümleştirmesi

IWebHost/IWebHostBuilder'a ek olarak ve HttpSysCommunicationListener IHost/IHostBuilder KestrelCommunicationListener kullanarak ASP.NET Core hizmetleri derlemeyi destekler. Bu, ve Microsoft.ServiceFabric.AspNetCore.HttpSys paketlerinin v5.2.1363'ünden Microsoft.ServiceFabric.AspNetCore.Kestrel itibaren kullanılabilir.

// Stateless Service
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new ServiceInstanceListener[]
    {
        new ServiceInstanceListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
            {
                return Host.CreateDefaultBuilder()
                        .ConfigureWebHostDefaults(webBuilder =>
                        {
                            webBuilder.UseKestrel()
                                .UseStartup<Startup>()
                                .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                                .UseContentRoot(Directory.GetCurrentDirectory())
                                .UseUrls(url);
                        })
                        .ConfigureServices(services => services.AddSingleton<StatelessServiceContext>(serviceContext))
                        .Build();
            }))
    };
}

// Stateful Service
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new ServiceReplicaListener[]
    {
        new ServiceReplicaListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
            {
                return Host.CreateDefaultBuilder()
                        .ConfigureWebHostDefaults(webBuilder =>
                        {
                            webBuilder.UseKestrel()
                                .UseStartup<Startup>()
                                .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                                .UseContentRoot(Directory.GetCurrentDirectory())
                                .UseUrls(url);
                        })
                        .ConfigureServices(services =>
                        {
                            services.AddSingleton<StatefulServiceContext>(serviceContext);
                            services.AddSingleton<IReliableStateManager>(this.StateManager);
                        })
                        .Build();
            }))
    };
}

Not

KestrelCommunicationListener ve HttpSysCommunicationListener web hizmetleri için kullanıldığından, bir web sunucusunu IHost üzerinden kaydetmek/yapılandırmak ( ConfigureWebHostDefaults veya ConfigureWebHost yöntemini kullanarak) gerekir

ASP.NET 6, web uygulamaları oluşturmanın daha basitleştirilmiş ve kolaylaştırılmış bir yolu olan Minimal Hosting modelini tanıttı. Minimum barındırma modeli KestrelCommunicationListener ve HttpSysCommunicationListener ile de kullanılabilir.

// Stateless Service
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
    return new ServiceInstanceListener[]
    {
        new ServiceInstanceListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
            {
                var builder = WebApplication.CreateBuilder();

                builder.Services.AddSingleton<StatelessServiceContext>(serviceContext);
                builder.WebHost
                            .UseKestrel()
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                            .UseUrls(url);

                builder.Services.AddControllersWithViews();

                var app = builder.Build();

                if (!app.Environment.IsDevelopment())
                {
                    app.UseExceptionHandler("/Home/Error");
                }

                app.UseHttpsRedirection();
                app.UseStaticFiles();
                app.UseRouting();
                app.UseAuthorization();
                app.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");

                return app;
            }))
    };
}
// Stateful Service
protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new ServiceReplicaListener[]
    {
        new ServiceReplicaListener(serviceContext =>
            new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
            {
                var builder = WebApplication.CreateBuilder();

                builder.Services
                            .AddSingleton<StatefulServiceContext>(serviceContext)
                            .AddSingleton<IReliableStateManager>(this.StateManager);
                builder.WebHost
                            .UseKestrel()
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                            .UseUrls(url);

                builder.Services.AddControllersWithViews();

                var app = builder.Build();

                if (!app.Environment.IsDevelopment())
                {
                    app.UseExceptionHandler("/Home/Error");
                }
                app.UseStaticFiles();
                app.UseRouting();
                app.UseAuthorization();
                app.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");

                return app;
            }))
    };
}

Service Fabric yapılandırma sağlayıcısı

ASP.NET Core'da uygulama yapılandırması, yapılandırma sağlayıcısı tarafından oluşturulan anahtar-değer çiftlerini temel alır. Genel ASP.NET Core yapılandırma desteği hakkında daha fazla bilgi edinmek için ASP.NET Core yapılandırma bölümünü okuyun.

Bu bölümde, Service Fabric yapılandırma sağlayıcısının NuGet paketini içeri aktararak ASP.NET Core yapılandırmasıyla nasıl tümleştirdiği Microsoft.ServiceFabric.AspNetCore.Configuration açıklanır.

AddServiceFabricConfiguration başlangıç uzantıları

NuGet paketini içeri aktardıktan Microsoft.ServiceFabric.AspNetCore.Configuration sonra Service Fabric Yapılandırma kaynağını ASP.NET Core yapılandırma API'sine kaydetmeniz gerekir. Bunu, ad alanında Microsoft.ServiceFabric.AspNetCore.ConfigurationAddServiceFabricConfiguration uzantılarını ile IConfigurationBuilderkarşılaştırarak yaparsınız.

using Microsoft.ServiceFabric.AspNetCore.Configuration;

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddServiceFabricConfiguration() // Add Service Fabric configuration settings.
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

Artık ASP.NET Core hizmeti, diğer uygulama ayarları gibi Service Fabric yapılandırma ayarlarına erişebilir. Örneğin, ayarları kesin olarak yazılan nesnelere yüklemek için seçenekler desenini kullanabilirsiniz.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MyOptions>(Configuration);  // Strongly typed configuration object.
    services.AddMvc();
}

Varsayılan anahtar eşlemesi

Varsayılan olarak, Service Fabric yapılandırma sağlayıcısı paket adını, bölüm adını ve özellik adını içerir. Bunlar birlikte ASP.NET Core yapılandırma anahtarını aşağıdaki gibi oluşturur:

$"{this.PackageName}{ConfigurationPath.KeyDelimiter}{section.Name}{ConfigurationPath.KeyDelimiter}{property.Name}"

Örneğin, aşağıdaki içeriğe sahip adlı MyConfigPackage bir yapılandırma paketiniz varsa, yapılandırma değeri myConfigPackage:MyConfigSection:MyParameter aracılığıyla ASP.NET Core IConfiguration üzerinde kullanılabilir.

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">  
  <Section Name="MyConfigSection">
    <Parameter Name="MyParameter" Value="Value1" />
  </Section>  
</Settings>

Service Fabric yapılandırma seçenekleri

Service Fabric yapılandırma sağlayıcısı, anahtar eşlemenin varsayılan davranışını değiştirmeyi de destekler ServiceFabricConfigurationOptions .

Şifrelenmiş ayarlar

Service Fabric, Service Fabric yapılandırma sağlayıcısı gibi şifrelenmiş ayarları da destekler. Şifrelenmiş ayarların şifresi varsayılan olarak ASP.NET Core IConfiguration çözülemez. Bunun yerine şifrelenmiş değerler orada depolanır. Ancak, ASP.NET Core IConfiguration'da depolanacağı değerin şifresini çözmek istiyorsanız, uzantıda AddServiceFabricConfigurationDecryptValue bayrağını aşağıdaki gibi false olarak ayarlayabilirsiniz:

public Startup()
{
    ICodePackageActivationContext activationContext = FabricRuntime.GetActivationContext();
    var builder = new ConfigurationBuilder()        
        .AddServiceFabricConfiguration(activationContext, (options) => options.DecryptValue = false); // set flag to decrypt the value
    Configuration = builder.Build();
}

Birden çok yapılandırma paketi

Service Fabric birden çok yapılandırma paketini destekler. Varsayılan olarak, paket adı yapılandırma anahtarına eklenir. Ancak bayrağını IncludePackageName aşağıdaki gibi false olarak ayarlayabilirsiniz:

public Startup()
{
    ICodePackageActivationContext activationContext = FabricRuntime.GetActivationContext();
    var builder = new ConfigurationBuilder()        
        // exclude package name from key.
        .AddServiceFabricConfiguration(activationContext, (options) => options.IncludePackageName = false); 
    Configuration = builder.Build();
}

Özel anahtar eşlemesi, değer ayıklama ve veri popülasyonu

Service Fabric yapılandırma sağlayıcısı, ile anahtar eşlemesini özelleştirmek ve ile ExtractKeyFuncExtractValueFuncdeğerleri özel olarak ayıklamak için daha gelişmiş senaryoları da destekler. Service Fabric yapılandırmasından verileri doldurma işleminin tamamını kullanarak ASP.NET Core yapılandırma olarak bile değiştirebilirsinizConfigAction.

Aşağıdaki örneklerde, veri popülasyonunu özelleştirmek için nasıl kullanılacağı ConfigAction gösterilmektedir:

public Startup()
{
    ICodePackageActivationContext activationContext = FabricRuntime.GetActivationContext();
    
    this.valueCount = 0;
    this.sectionCount = 0;
    var builder = new ConfigurationBuilder();
    builder.AddServiceFabricConfiguration(activationContext, (options) =>
        {
            options.ConfigAction = (package, configData) =>
            {
                ILogger logger = new ConsoleLogger("Test", null, false);
                logger.LogInformation($"Config Update for package {package.Path} started");

                foreach (var section in package.Settings.Sections)
                {
                    this.sectionCount++;

                    foreach (var param in section.Parameters)
                    {
                        configData[options.ExtractKeyFunc(section, param)] = options.ExtractValueFunc(section, param);
                        this.valueCount++;
                    }
                }

                logger.LogInformation($"Config Update for package {package.Path} finished");
            };
        });
  Configuration = builder.Build();
}

Yapılandırma güncelleştirmeleri

Service Fabric yapılandırma sağlayıcısı yapılandırma güncelleştirmelerini de destekler. Değişiklik bildirimlerini almak için ASP.NET Core IOptionsMonitor kullanabilir ve ardından yapılandırma verilerini yeniden yüklemek için kullanabilirsinizIOptionsSnapshot. Daha fazla bilgi için bkz. ASP.NET Core seçenekleri.

Bu seçenekler varsayılan olarak desteklenir. Yapılandırma güncelleştirmelerini etkinleştirmek için başka kodlama gerekmez.

Senaryolar ve yapılandırmalar

Bu bölümde web sunucusu, bağlantı noktası yapılandırması, Service Fabric tümleştirme seçenekleri ve aşağıdaki senaryolarda sorun gidermenizi önerdiğimiz çeşitli ayarların birleşimi sağlanır:

  • Durum bilgisi olmayan hizmetler ASP.NET Core dışarıdan kullanıma sunuldu
  • Yalnızca şirket içi ASP.NET Core durum bilgisi olmayan hizmetler
  • Yalnızca şirket içi ASP.NET Core durum bilgisi olan hizmetler

Dışarıdan kullanıma sunulan hizmet, genellikle yük dengeleyici aracılığıyla küme dışından çağrılan bir uç noktayı kullanıma sunan hizmettir.

Yalnızca iç hizmet, uç noktası yalnızca küme içinden çağrılan hizmettir.

Not

Durum bilgisi olan hizmet uç noktaları genellikle İnternet'e sunulmamalıdır. Azure Load Balancer gibi Service Fabric hizmet çözümlemesinin farkında olmayan yük dengeleyicilerin arkasındaki kümeler, durum bilgisi olan hizmetleri kullanıma sunamaz. Bunun nedeni yük dengeleyicinin trafiği bulup uygun durum bilgisi olan hizmet çoğaltmasına yönlendirememeleridir.

Durum bilgisi olmayan hizmetler ASP.NET Core dışarıdan kullanıma sunuldu

Kestrel, dış, İnternet'e yönelik HTTP uç noktalarını kullanıma sunan ön uç hizmetleri için önerilen web sunucusudur. Windows'da HTTP.sys, aynı bağlantı noktasını kullanarak aynı düğüm kümesinde birden çok web hizmeti barındırmanıza olanak tanıyan bağlantı noktası paylaşımı özelliği sağlayabilir. Bu senaryoda web hizmetleri, HTTP yönlendirmesi sağlamak için bir ön uç ara sunucusuna veya ağ geçidine bağlı kalmadan konak adına veya yoluna göre ayırt edilir.

durum bilgisi olmayan bir hizmet İnternet'e sunulduğunda, yük dengeleyici aracılığıyla ulaşılabilen iyi bilinen ve kararlı bir uç nokta kullanmalıdır. Bu URL'yi uygulamanızın kullanıcılarına sağlayacaksınız. Aşağıdaki yapılandırmayı öneririz:

Tür Öneri Notlar
Web sunucusu Kestrel Kestrel, Windows ve Linux'ta desteklendiği için tercih edilen web sunucusudur.
Bağlantı noktası yapılandırması static http için 80 veya HTTPS için 443 gibi ServiceManifest.xml yapılandırmasında Endpoints iyi bilinen bir statik bağlantı noktası yapılandırılmalıdır.
ServiceFabricIntegrationOptions Hiçbiri ServiceFabricIntegrationOptions.None Hizmetin benzersiz bir tanımlayıcı için gelen istekleri doğrulamaya çalışmaması için Service Fabric tümleştirme ara yazılımını yapılandırırken seçeneğini kullanın. Uygulamanızın dış kullanıcıları ara yazılımının kullandığı benzersiz tanımlayıcı bilgileri bilmez.
Örnek Sayısı -1 Tipik kullanım örneklerinde örnek sayısı ayarı -1 olarak ayarlanmalıdır. Bu, yük dengeleyiciden trafik alan tüm düğümlerde bir örneğin kullanılabilir olması için yapılır.

Dışarıdan kullanıma sunulan birden çok hizmet aynı düğüm kümesini paylaşıyorsa, benzersiz ama kararlı bir URL yolu ile HTTP.sys kullanabilirsiniz. Bunu, IWebHost yapılandırırken sağlanan URL'yi değiştirerek gerçekleştirebilirsiniz. Bunun yalnızca HTTP.sys için geçerli olduğunu unutmayın.

new HttpSysCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
{
    url += "/MyUniqueServicePath";

    return new WebHostBuilder()
        .UseHttpSys()
        ...
        .UseUrls(url)
        .Build();
})

Yalnızca dahili durum bilgisi olmayan ASP.NET Core hizmeti

Yalnızca küme içinden çağrılan durum bilgisi olmayan hizmetler, birden çok hizmet arasında işbirliği sağlamak için benzersiz URL'ler ve dinamik olarak atanmış bağlantı noktaları kullanmalıdır. Aşağıdaki yapılandırmayı öneririz:

Tür Öneri Notlar
Web sunucusu Kestrel durum bilgisi olmayan iç hizmetler için HTTP.sys kullanabilirsiniz ancak Kestrel, birden çok hizmet örneğinin bir konağı paylaşmasına izin veren en iyi sunucudur.
Bağlantı noktası yapılandırması dinamik olarak atandı Durum bilgisi olan bir hizmetin birden çok çoğaltması bir konak işlemini veya konak işletim sistemini paylaşabilir ve bu nedenle benzersiz bağlantı noktalarına ihtiyaç duyar.
ServiceFabricIntegrationOptions UseUniqueServiceUrl Dinamik bağlantı noktası ataması ile bu ayar, daha önce açıklanan yanlış kimlik sorununu önler.
InstanceCount herhangi biri Örnek sayısı ayarı, hizmeti çalıştırmak için gereken herhangi bir değere ayarlanabilir.

Yalnızca iç durum bilgisi olan ASP.NET Core hizmeti

Yalnızca küme içinden çağrılan durum bilgisi olan hizmetler, birden çok hizmet arasında işbirliği sağlamak için dinamik olarak atanmış bağlantı noktalarını kullanmalıdır. Aşağıdaki yapılandırmayı öneririz:

Tür Öneri Notlar
Web sunucusu Kestrel , HttpSysCommunicationListener çoğaltmaların bir konak işlemini paylaştığı durum bilgisi olan hizmetler tarafından kullanılmak üzere tasarlanmamıştır.
Bağlantı noktası yapılandırması dinamik olarak atandı Durum bilgisi olan bir hizmetin birden çok çoğaltması bir konak işlemini veya konak işletim sistemini paylaşabilir ve bu nedenle benzersiz bağlantı noktalarına ihtiyaç duyar.
ServiceFabricIntegrationOptions UseUniqueServiceUrl Dinamik bağlantı noktası ataması ile bu ayar, daha önce açıklanan yanlış kimlik sorununu önler.

Sonraki adımlar

Visual Studio'yu kullanarak Service Fabric uygulamanızda hata ayıklama