Azure Service Fabric Reliable Services'da ASP.NET Core
ASP.NET Core, açık kaynak 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 hizmetlerini barındırmaya yönelik ayrıntılı bir kılavuzdur.
Service Fabric'te ASP.NET Core ile ilgili giriş niteliğinde bir öğretici ve geliştirme ortamınızı ayarlama yönergeleri için bkz . Öğretici: ASP.NET Core Web API ö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'a zaten aşina olduğunuz 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'i iki farklı şekilde kullanabilirsiniz:
- Konuk yürütülebilir dosyası olarak barındırılır. Bu yöntem öncelikli olarak, kod değişikliği olmadan Service Fabric'te mevcut ASP.NET Core uygulamalarını ç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 olanak tanır ve durum bilgisi olan ASP.NET Core hizmetlerine izin verir.
Bu makalenin geri kalanında, Service Fabric SDK'sı ile birlikte gelen ASP.NET Core tümleştirme bileşenleri aracılığıyla ASP.NET Core'un 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 bunu 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 ayırma, web uygulamalarının farklı web sunucuları arasında taşınabilir olmasını sağlar. Ayrıca web sunucularının şirket içinde 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şleminizin içinde ASP.NET başlatabilmeniz gerekir. ASP.NET Core kendi kendine barındırma bunu yapmanızı sağlar.
güvenilir bir hizmette ASP.NET Core barındırma
Genellikle, şirket içinde barındırılan ASP.NET Core uygulamaları, uygulamasındaki yöntemi Program.cs
gibi static void Main()
bir uygulamanın giriş noktasında bir WebHost oluşturur. Bu durumda, WebHost'un yaşam döngüsü işlemin yaşam döngüsüne bağlıdır.
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ünü kaydetmek için kullanılmasıdır, böylece bu hizmet türünün örneklerini oluşturabilir. WebHost, güvenilir bir hizmette 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.
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 nesnedirServiceContext
.string endpointName
: Bu, ServiceManifest.xml birEndpoint
yapılandırmanın adıdır. Öncelikle iki iletişim dinleyicisinin farklı olduğu yerdir. HTTP.sys için yapılandırmaEndpoint
gerekirken Kestrel gerekli değildir.Func<string, AspNetCoreCommunicationListener, IWebHost> build
: Bu, oluşturduğunuz ve döndürdüğünüz birIWebHost
lambdadır. Bir ASP.NET Core uygulamasında normalde yaptığınız gibi yapılandırmanızaIWebHost
olanak tanır. Lambda, kullandığınız Service Fabric tümleştirme seçeneklerine veEndpoint
sağladığınız yapılandırmaya bağlı olarak sizin için oluşturulan bir URL sağlar. Daha sonra 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, IWebHostBuilder
Service Fabric kullanan ara yazılımı ekleyen uzantı yöntemini içerirUseServiceFabricIntegration
. Bu ara yazılım, Service Fabric Adlandırma Hizmeti'ne benzersiz bir hizmet URL'si kaydetmek için Kestrel veya HTTP.sys ICommunicationListener
yapılandırıyor. Ardından, istemcilerin doğru hizmete bağlandığından emin olmak için istemci isteklerini doğrular.
İstemcilerin yanlışlıkla yanlış hizmete bağlanmasını önlemek için bu adım 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ında 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 oluşursa sonuçlanabilir:
- Hizmet A, HTTP üzerinden 10.0.0.1:30000 tarihinde dinler.
- İstemci, A Hizmetini çözümler ve 10.0.0.1:30000 adresini alır.
- Hizmet A farklı bir düğüme taşınır.
- B hizmeti 10.0.0.1 üzerine yerleştirilir ve tesadüfen aynı 30000 numaralı bağlantı noktasını kullanır.
- İstemci, önbelleğe alınmış 10.0.0.1:30000 adresiyle A hizmetine bağlanmayı dener.
- İstemci artık B hizmetine başarıyla bağlandı, yanlış hizmete bağlı olduğunu fark etmemektedir.
Bu, tanılaması zor olabilecek rastgele zamanlarda hatalara neden olabilir.
Benzersiz hizmet URL'lerini kullanma
Bu hataları önlemek için hizmetler, benzersiz bir tanımlayıcıyla Adlandırma Hizmeti'ne bir uç nokta gönderebilir ve ardından istemci istekleri sırasında bu benzersiz tanımlayıcıyı doğrulayabilir. Bu, düşmanca olmayan bir kiracı güvenilen ortamındaki hizmetler arasında işbirliğine dayalı bir eylemdir. Düşman kiracılı bir ortamda 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ış 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ının etkinleştirildiği istek akışı gösterilmektedir:
Hem Kestrel hem de HTTP.sys ICommunicationListener
uygulamaları bu mekanizmayı tam olarak aynı şekilde kullanır. HTTP.sys, temel 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. Http 503 ve HTTP 404 diğer hataları belirtmek için yaygın olarak kullanıldığından, bu durum 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ımda 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ı ICommunicationListener
içerirHttpSysCommunicationListener
. HttpSysCommunicationListener
, web sunucusu olarak HTTP.sys kullanarak güvenilir bir hizmet içinde ASP.NET Core 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 benzersiz bir URL yolu veya ana bilgisayar adıyla kesinleştirilmiş web uygulamalarını aynı bağlantı noktasında barındırmasına olanak tanır. 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'ta HTTP.sys çekirdek sürücüsünü nasıl kullandığı gösterilmektedir:
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 temel HTTP.sys bağlantı noktası paylaşımı özelliğiyle ilgili sorunlar 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ının önce URL'lerini HTTP.sys ayırmaları gerekir (bu normalde netsh aracıyla gerçekleştirilir).
Bu eylem, hizmetlerinizin varsayılan olarak sahip olmadığı yükseltilmiş ayrıcalıklar gerektirir. ServiceManifest.xml yapılandırmasının Protocol
Endpoint
özelliğine yönelik "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 URL ön ekini kullanarak yapar.
Örneğin, bir hizmete ayırmak http://+:80
için ServiceManifest.xml'de 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 atla Port
Endpoint
:
<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, aynı işlemde birden çok hizmet örneğinin ve/veya çoğaltmanın 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ı ICommunicationListener
içerirKestrelCommunicationListener
. KestrelCommunicationListener
, web sunucusu olarak Kestrel kullanarak güvenilir bir hizmet içinde ASP.NET Core 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ı.
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 bir örneği IReliableStateManager
sağlanı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. ServiceInstanceListener
Uç 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, başlamadan önce URL kaydı gerektirmediğinden ServiceManifest.xml'da bir Endpoint
yapılandırma gerekmez.
Kestrel'i statik bağlantı noktasıyla kullanma
Kestrel ile kullanmak üzere ServiceManifest.xml yapılandırmasında Endpoint
statik bir 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ı aracılığıyla 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>
Endpoint
yapılandırılırsa, adı oluşturucuya KestrelCommunicationListener
geçirilmelidir:
new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => ...
ServiceManifest.xml yapılandırma Endpoint
kullanmıyorsa oluşturucudaki adı atla 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, bir Endpoint
yapılandırmadan otomatik bağlantı noktası atamanın 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 Minimal Barındırma tümleştirmesi
IWebHost/IWebHostBuilder'a ek olarak ve KestrelCommunicationListener
HttpSysCommunicationListener
IHost/IHostBuilder 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 hizmetlerine yönelik olduğundan, IHost üzerinden bir web sunucusu (ConfigureWebHostDefaults veya ConfigureWebHost yöntemini kullanarak) kaydetmek/yapılandırmak 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'daki 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'da 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çıklanmaktadı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, karşı ad alanında IConfigurationBuilder
Microsoft.ServiceFabric.AspNetCore.Configuration
AddServiceFabricConfiguration uzantılarını denetleyerek 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'da IConfiguration
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şlemesinin 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'a IConfiguration
çözülmez. Bunun yerine şifrelenmiş değerler orada depolanır. Ancak ASP.NET Core IConfiguration'da depolanacağı değerin şifresini çözmek istiyorsanız, DecryptValue bayrağını uzantıda AddServiceFabricConfiguration
false olarak aşağıdaki gibi 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şleme, değer ayıklama ve veri popülasyonu
Service Fabric yapılandırma sağlayıcısı ile anahtar eşlemesini ExtractKeyFunc
özelleştirmek ve ile değerleri özel olarak ayıklamak için daha gelişmiş senaryoları ExtractValueFunc
da destekler. Service Fabric yapılandırmasından verileri doldurma işleminin tamamını kullanarak ASP.NET Core yapılandırmasına bile değiştirebilirsiniz ConfigAction
.
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 bildirimleri almak için ASP.NET Core'ı IOptionsMonitor
kullanabilir ve ardından yapılandırma verilerini yeniden yüklemek için kullanabilirsiniz IOptionsSnapshot
. Daha fazla bilgi için bkz . ASP.NET Çekirdek 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:
- Dış kullanıma sunulan ASP.NET Core durum bilgisi olmayan hizmetler
- Yalnızca dahili ASP.NET Çekirdek durum bilgisi olmayan hizmetler
- Yalnızca dahili ASP.NET Durum bilgisi olan temel 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.
Dış kullanıma sunulan ASP.NET Core durum bilgisi olmayan hizmetler
Kestrel, dış, İnternet'e yönelik HTTP uç noktalarını kullanıma sunan ön uç hizmetler 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. IWebHost yapılandırırken sağlanan URL'yi değiştirerek bunu 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ı gerekir. |
ServiceFabricIntegrationOptions | UseUniqueServiceUrl | Dinamik bağlantı noktası atamasıyla, bu ayar daha önce açıklanan hatalı kimlik sorununu önler. |
InstanceCount | herhangi bir | Ö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 atanan 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 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ı gerekir. |
ServiceFabricIntegrationOptions | UseUniqueServiceUrl | Dinamik bağlantı noktası atamasıyla, bu ayar daha önce açıklanan hatalı kimlik sorununu önler. |
Sonraki adımlar
Visual Studio'yu kullanarak Service Fabric uygulamanızda hata ayıklama