.NET .NET Aspire orkestrasyon genel bakış
.NET .NET Aspire, dağıtılmış uygulamanızdaki kaynakları ve bağımlılıkları ifade etmek için API'ler sağlar. Bu API'lere ek olarak , çeşitli cazip senaryolara olanak tanıyan araçlar da vardır. Orkestratör yerel geliştirme amaçlarına yöneliktir ve üretim ortamlarında desteklenmez.
Devam etmeden önce, .NET.NET Aspirekullanılan bazı yaygın terimleri göz önünde bulundurun:
-
Uygulama modeli: DistributedApplication ad alanında tanımlanan dağıtılmış uygulamanızı (Aspire.Hosting.ApplicationModel) oluşturan kaynak koleksiyonu. Daha resmi bir tanım için bkz. uygulama modelini tanımlama
. - Uygulama konağı/Orchestrator projesi: Uygulama modelini.NET projesini düzenleyen ve kurala göre *.AppHost soneki ile adlandırılan proje.
- Kaynak: kaynak, uygulamanın .NET projesi, kapsayıcı, yürütülebilir dosya, veritabanı, önbellek veya bulut hizmeti gibi bağımlı bir parçasıdır. Uygulamanın yönetilebilen veya başvurulabilen herhangi bir bölümünü temsil eder.
- Tümleştirme: Tümleştirme, bir kaynak modelleyen uygulama konağı için bir NuGet paketi veya bir istemciyi kullanan uygulamada kullanılmak üzere yapılandıran bir pakettir. Daha fazla bilgi için bkz. .NET.NET Aspire tümleştirmelere genel bakış.
- Başvuru: Başvuru, WithReference API'sini kullanarak bağımlılık olarak ifade edilen kaynaklar arasındaki bağlantıyı tanımlar. Daha fazla bilgi için bkz. Başvuru kaynakları veya Var olan kaynaklara başvurma.
Not
.NET .NET Aspiredüzenlemesi, buluta özel uygulamanızın yapılandırmasının ve ara bağlantılarının yönetimini basitleştirerek yerel geliştirme deneyiminizi geliştirmek için tasarlanmıştır. Geliştirme için çok değerli bir araç olsa da, Kubernetesgibi özellikle bu bağlamda excel'e yönelik olarak tasarlanmış üretim ortamı sistemlerinin yerini almak için tasarlanmamıştır.
Uygulama modelini tanımlama
.NET .NET Aspire, dağıtılmış uygulamalarınızı sorunsuz bir şekilde derlemenize, sağlamanıza, dağıtmanıza, yapılandırmanıza, test etmenize, çalıştırmanıza ve gözlemlemenize yardımcı olur. Bu özelliklerin tümü, .NET çözümünüzdeki kaynakları ve bunların ilişkilerini özetleyen bir .NET Aspire kullanılarak elde edilir. Bu kaynaklar, uygulamanızın bağımlı olduğu projeleri, yürütülebilir dosyaları, kapsayıcıları ve dış hizmetleri ve bulut kaynaklarını kapsar. Her bir .NET.NET Aspire çözümde, "Uygulama ana bilgisayar projesi" olarak adlandırılan belirli bir alan vardır; burada uygulama modeli, IDistributedApplicationBuilder üzerindeki kullanılabilir yöntemler kullanılarak tam olarak tanımlanır. Bu oluşturucu, DistributedApplication.CreateBuilder çağrılarak elde edilir.
// Create a new app model builder
var builder = DistributedApplication.CreateBuilder(args);
// TODO:
// Add resources to the app model
// Express dependencies between resources
builder.Build().Run();
Uygulama Sunucu Projesi
Uygulama barındırıcı projesi, .NET.NET Aspire projesinin parçası olan tüm projelerin çalıştırılmasını yönetir. Başka bir deyişle, uygulama modeli içindeki tüm uygulamaları düzenleme sorumluluğundadır. Bu projenin kendisi,
<Project Sdk="Microsoft.NET.Sdk">
<Sdk Name="Aspire.AppHost.Sdk" Version="9.1.0" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<IsAspireHost>true</IsAspireHost>
<!-- Omitted for brevity -->
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.1.0" />
</ItemGroup>
<!-- Omitted for brevity -->
</Project>
Aşağıdaki kod, iki proje başvurusu ve bir Program
önbelleği içeren bir uygulama konağı Redis açıklar:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(cache)
.WaitFor(cache)
.WithReference(apiService)
.WaitFor(apiService);
builder.Build().Run();
Önceki kod:
- CreateBuilder yöntemini kullanarak yeni bir uygulama modeli oluşturucusu oluşturur.
-
Redis yöntemini kullanarak "cache" adlı bir
cache
AddRedis kaynağı ekler. - AddProject yöntemini kullanarak "apiservice" adlı bir proje kaynağı ekler.
-
AddProject yöntemini kullanarak "webfrontend" adlı bir proje kaynağı ekler.
- projenin WithExternalHttpEndpoints yöntemini kullanarak dış HTTP uç noktalarına sahip olduğunu belirtir.
-
cache
kaynağına bir başvuru ekler ve WithReference ve WaitFor yöntemlerini kullanarak hazır olmasını bekler. -
apiservice
kaynağına bir başvuru ekler ve WithReference ve WaitFor yöntemlerini kullanarak hazır olmasını bekler.
- Build ve Run yöntemlerini kullanarak uygulama modelini derler ve çalıştırır.
Örnek kod, .NET AspireRedis barındırma tümleştirmesikullanır.
Uygulama konak projesi ile açıklandığı kaynaklar arasındaki ilişkiyi görselleştirmeye yardımcı olmak için aşağıdaki diyagramı göz önünde bulundurun:
Her kaynak benzersiz olarak adlandırılmalıdır. Bu diyagramda her kaynak ve aralarındaki ilişkiler gösterilir. Kapsayıcı kaynağı "cache" olarak, proje kaynakları ise "apiservice" ve "webfrontend" olarak adlandırılır. Web ön uç projesi önbellek ve API hizmeti projelerine başvurur. Başvuruları bu şekilde ifade ederken, web ön uç projesi bunun sırasıyla "önbellek" ve "apiservice" adlı bu iki kaynağa bağlı olduğunu söyler.
Yerleşik kaynak türleri
.NET .NET Aspire projeler bir kaynak kümesinden oluşur. 📦 Aspirebirincil temel kaynak türleri, Hosting.AppHost NuGet paketinde aşağıdaki tabloda açıklanmıştır:
Yöntem | Kaynak türü | Açıklama |
---|---|---|
AddProject | ProjectResource | Örneğin, bir .NET projesi, ASP.NET Core web uygulaması. |
AddContainer | ContainerResource | Docker imajı gibi bir kapsayıcı imaj. |
AddExecutable | ExecutableResource | Node.js uygulamasıgibi yürütülebilir bir dosya. |
AddParameter | ParameterResource | dış parametreleri ifade etmek için kullanılabilecek bir parametre kaynağı. |
Proje kaynakları, uygulama modelinin parçası olan .NET projeleri temsil eder. Uygulama ana bilgisayar projesine proje başvurusu eklediğinizde, .NET.NET Aspire SDK, başvurulan her proje için Projects
ad alanında bir tür oluşturur. Daha fazla bilgi için bkz. .NET.NET Aspire SDK: Proje Başvuruları.
Uygulama modeline proje eklemek için AddProject yöntemini kullanın:
var builder = DistributedApplication.CreateBuilder(args);
// Adds the project "apiservice" of type "Projects.AspireApp_ApiService".
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
Uygulama modeline aynı projenin birden çok örneği eklenerek projeler çoğaltılabilir ve ölçeklendirilebilir. Çoğaltmaları yapılandırmak için WithReplicas yöntemini kullanın:
var builder = DistributedApplication.CreateBuilder(args);
// Adds the project "apiservice" of type "Projects.AspireApp_ApiService".
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
.WithReplicas(3);
Yukarıdaki kod, uygulama modeline "apiservice" proje kaynağının üç çoğaltmasını ekler. Daha fazla bilgi için bkz. .NET.NET Aspire gösterge paneli: Kaynak çoğaltmaları.
Açıkça tanımlanmış kaynak başlangıcını yapılandırma
Proje, yürütülebilir dosya ve kapsayıcı kaynakları varsayılan olarak dağıtılmış uygulamanızla otomatik olarak başlatılır. Bir kaynak, WithExplicitStart yöntemiyle açık bir başlangıç yönergesi bekleyecek şekilde yapılandırılabilir. WithExplicitStart ile yapılandırılan bir kaynak KnownResourceStates.NotStartedile başlatılır.
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
builder.AddProject<Projects.AspireApp_DbMigration>("dbmigration")
.WithReference(postgresdb)
.WithExplicitStart();
Önceden hazırlanan kodda "dbmigration" kaynağı, dağıtılmış uygulamayla otomatik olarak başlatılmayacak şekilde yapılandırılır.
Açık başlangıçlı kaynaklar, "Başlat" komutuna tıklanarak .NET.NET Aspire panosundan başlatılabilir. Daha fazla bilgi için bkz. .NET.NET Aspire pano: Kaynağı durdur veya başlat.
Başvuru kaynakları
Başvuru, kaynaklar arasındaki bağımlılığı temsil eder. Örneğin, web ön ucun Redis önbelleğine bağlı olduğu bir senaryo hayal edebilirsiniz.
Program
C# kodu içeren aşağıdaki örnek uygulama barındırıcısını göz önünde bulundurun:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithReference(cache);
"webfrontend" proje kaynağı, "önbellek" kapsayıcı kaynağına bağımlılık eklemek için WithReference kullanır. Bu bağımlılıklar bağlantı dizelerini veya hizmet bulma bilgilerini temsil edebilir. Yukarıdaki örnekte, bir ortam değişkeni ConnectionStrings__cache
adıyla "webfrontend" kaynağına eklenir. Bu ortam değişkeni, webfrontend
'nın Redisaracılığıyla .NET Aspire'e bağlanmak için kullandığı bir bağlantı dizisini içerir, örneğin Redis.
Kaynak bekleniyor
Bazı durumlarda, başka bir kaynağı başlatmadan önce kaynağın hazır olmasını beklemek isteyebilirsiniz. Örneğin, bağımlı olan bir API'yi başlatmadan önce veritabanının hazır olmasını beklemek isteyebilirsiniz. Bu bağımlılığı ifade etmek için WaitFor yöntemini kullanın:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
.WithReference(postgresdb)
.WaitFor(postgresdb);
Yukarıdaki kodda , "apiservice" proje kaynağı "postgresdb" veritabanı kaynağının KnownResourceStates.Runninggirmesini bekler. Örnek kod,
Diğer durumlarda, bağımlı kaynak başlamadan önce, ya KnownResourceStates.Exited ya da KnownResourceStates.Finished kaynağının tamamlanmasını beklemek gerekebilir. Kaynağın tamamlanmasını beklemek için WaitForCompletion yöntemini kullanın:
var builder = DistributedApplication.CreateBuilder(args);
var postgres = builder.AddPostgres("postgres");
var postgresdb = postgres.AddDatabase("postgresdb");
var migration = builder.AddProject<Projects.AspireApp_Migration>("migration")
.WithReference(postgresdb)
.WaitFor(postgresdb);
builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
.WithReference(postgresdb)
.WaitForCompletion(migration);
Yukarıdaki kodda , "apiservice" proje kaynağı başlamadan önce "geçiş" proje kaynağının tamamlanmasını bekler. "Geçiş" proje kaynağı, "postgresdb" veritabanı kaynağının KnownResourceStates.Running içine girmesini bekler. Bu, örneğin API hizmetini başlatmadan önce veritabanı geçişini çalıştırmak istediğiniz senaryolarda yararlı olabilir.
Panodaki kaynakları başlatmayı zorlama
Kaynak bekleme, panodaki "Başlat" komutu kullanılarak atlanabilir. Panoda bekleyen bir kaynağa "Başlat" tıklanması, kaynağın iyi durumda olmasını veya tamam olmasını beklemeden hemen başlatılmasını ister. Bu, bir kaynağı hemen test etmek ve uygulamanın doğru durumda olmasını beklemek istemediğinizde yararlı olabilir.
Kaynak ekleme ve ifade etme API'leri
.NET .NET Aspire barındırma tümleştirmeleri ve istemci tümleştirmeleri her ikisi de NuGet paketleri olarak sunulur, ancak farklı amaçlara hizmet eder. istemci tümleştirmeleri uygulama konağı kapsamı dışındaki uygulamaları kullanmaya yönelik istemci kitaplığı yapılandırması sağlarken, barındırma tümleştirmeleri uygulama konağı içindeki kaynakları ve bağımlılıkları ifade etmek için API'ler sağlar. Daha fazla bilgi için bkz. .NET.NET Aspire tümleştirmelere genel bakış: Tümleştirme sorumlulukları.
Express kapsayıcı kaynakları
Bir ContainerResource ifadesini bir IDistributedApplicationBuilder örneğine eklemek için AddContainer yöntemini çağırırsınız.
var builder = DistributedApplication.CreateBuilder(args);
var ollama = builder.AddContainer("ollama", "ollama/ollama")
.WithBindMount("ollama", "/root/.ollama")
.WithBindMount("./ollamaconfig", "/usr/config")
.WithHttpEndpoint(port: 11434, targetPort: 11434, name: "ollama")
.WithEntrypoint("/usr/config/entrypoint.sh")
.WithContainerRuntimeArgs("--gpus=all");
Daha fazla bilgi için bkz.
Yukarıdaki kod, ollama/ollama
görüntüsüyle "ollama" adlı bir kapsayıcı kaynağı ekler. Kapsayıcı kaynağı, birden fazla bağlama montajı, adlandırılmış bir HTTP uç noktası, Unix kabuk betiğine yönlendirilen bir giriş noktası ve WithContainerRuntimeArgs yöntemiyle yapılandırılan kapsayıcı çalıştırma argümanları ile yapılandırılmıştır.
Kapsayıcı kaynaklarını özelleştirme
Tüm ContainerResource alt sınıfları, özel gereksinimlerinizi karşılayacak şekilde özelleştirilebilir. Bu, kapsayıcı kaynağını modelleyen ancak değişiklik gerektiren barındırma entegrasyonu kullanıldığında yararlı olabilir. Bir IResourceBuilder<ContainerResource>
varsa, kapsayıcı kaynağını değiştirmek için kullanılabilir API'lerden herhangi birine çağrıları zincirleyebilirsiniz.
.NET
.NET Aspire kapsayıcı kaynakları genellikle sabitlenmiş etiketleri gösterir, ancak bunun yerine latest
etiketini kullanmak isteyebilirsiniz.
Bunu daha iyi açıklamak için .NET AspireRedis entegrasyonunukullandığınız bir senaryo hayal edin.
Redis tümleştirmesi 7.4
etiketine bağlıysa ve bunun yerine latest
etiketini kullanmak istiyorsanız, WithImageTag API'sine bir çağrı zincirleyebilirsiniz:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache")
.WithImageTag("latest");
// Instead of using the "7.4" tag, the "cache"
// container resource now uses the "latest" tag.
Daha fazla bilgi ve ek API'ler için bkz. ContainerResourceBuilderExtensions.
Container kaynaklarının yaşam döngüsü
Uygulama konağı çalıştırıldığında, oluşturulacak ve başlatılacak kapsayıcı görüntüsünü belirlemek için ContainerResource kullanılır. .NET Aspire, tanımlanan kapsayıcı görüntüsünü kullanarak, OCI uyumlu kapsayıcı çalışma zamanında Docker veya Podman üzerinden çağrılar yaparak kapsayıcıyı çalıştırır. Aşağıdaki komutlar kullanılır:
İlk olarak, kapsayıcı docker container create
komutu kullanılarak oluşturulur. Ardından kapsayıcı, docker container start
komutu kullanılarak başlatılır.
- docker kapsayıcı oluştur: Belirtilen imajdan, başlatmadan yeni bir kapsayıcı oluşturur.
- docker kapsayıcısını başlat: Bir veya daha fazla durdurulmuş kapsayıcıyı başlatın.
Bu komutlar ekli kapsayıcı ağlarını, birimleri ve bağlantı noktalarını yönetmek için docker run
yerine kullanılır. Bu komutları bu sırayla çağırmak, ilk başlangıçta tüm IP'lerin (ağ yapılandırması) zaten mevcut olmasını sağlar.
temel kaynak türlerinin ötesinde, ProjectResource, ContainerResourceve ExecutableResource.NET.NET Aspire, uygulama modelinize ortak kaynaklar eklemek için uzantı yöntemleri sağlar. Daha fazla bilgi için bkz. Barındırma tümleştirmeleri.
Kapsayıcı kaynak ömrü
Varsayılan olarak, kapsayıcı kaynakları oturum kapsayıcı ömrünü kullanır. Bu, uygulama ana bilgisayar süreci her başlatıldığında kapsayıcının oluşturulup başlatıldığını gösterir. Uygulama barındırıcısı durduğunda kapsayıcı durdurulur ve kaldırılır. Kapsayıcı kaynakları, gereksiz yeniden başlatmaları önlemek ve kalıcı kapsayıcı durumunu kullanmak için kalıcı ömrünü kabul edebilir. Bunu başarmak için ContainerResourceBuilderExtensions.WithLifetime API'sine bir çağrı zincirleyin ve ContainerLifetime.Persistent'i iletin.
var builder = DistributedApplication.CreateBuilder(args);
var ollama = builder.AddContainer("ollama", "ollama/ollama")
.WithLifetime(ContainerLifetime.Persistent);
Yukarıdaki kod, "ollama/ollama" görüntüsüne ve kalıcı bir yaşam süresine sahip "ollama" adlı bir kapsayıcı kaynağı ekler.
Bağlantı dizesi ve uç nokta referansları
Proje kaynakları arasındaki bağımlılıkları ifade etmek yaygın bir durumdır. Aşağıdaki örnek kodu göz önünde bulundurun:
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice");
builder.AddProject<Projects.AspireApp_Web>("webfrontend")
.WithReference(cache)
.WithReference(apiservice);
Projeden projeye başvurular, iyi tanımlanmış bağlantı dizelerine sahip kaynaklardan farklı şekilde işlenir. "webfrontend" kaynağına bağlantı dizesi eklemek yerine, hizmet bulmayı desteklemek için ortam değişkenleri eklenir.
Yöntem | Ortam değişkeni |
---|---|
WithReference(cache) |
ConnectionStrings__cache="localhost:62354" |
WithReference(apiservice) |
services__apiservice__http__0="http://localhost:5455" services__apiservice__https__0="https://localhost:7356" |
"apiservice" projesine referans eklenmesi, hizmet bulma ortamı değişkenlerinin ön uca eklenmesine yol açar. Bunun nedeni genellikle projeden projeye iletişimin HTTP/gRPC üzerinden gerçekleşmesidir. Daha fazla bilgi için bkz. .NET.NET Aspire hizmet bulma.
ContainerResource veya ExecutableResource'den belirli uç noktaları almak için aşağıdaki uç nokta API'lerinden birini kullanın.
Ardından GetEndpoint yönteminde uç noktaya başvurmak için kullanılabilecek uç noktayı almak için WithReference API'sini çağırın:
var builder = DistributedApplication.CreateBuilder(args);
var customContainer = builder.AddContainer("myapp", "mycustomcontainer")
.WithHttpEndpoint(port: 9043, name: "endpoint");
var endpoint = customContainer.GetEndpoint("endpoint");
var apiservice = builder.AddProject<Projects.AspireApp_ApiService>("apiservice")
.WithReference(endpoint);
Yöntem | Ortam değişkeni |
---|---|
WithReference(endpoint) |
services__myapp__endpoint__0=https://localhost:9043 |
port
parametresi, kapsayıcının dinlediği bağlantı noktasıdır. Kapsayıcı bağlantı noktaları hakkında daha fazla bilgi için bkz. kapsayıcı bağlantı noktaları. Hizmet bulma hakkında daha fazla bilgi için bkz. .NET.NET Aspire hizmet bulma.
Hizmet uç noktası ortam değişken biçimi
Önceki bölümde, kaynaklar arasındaki bağımlılıkları ifade etmek için WithReference yöntemi kullanılır. Hizmet uç noktaları, bağımlı kaynağa ortam değişkenlerinin eklenmiş olmasına neden olduğunda, biçim belirgin olmayabilir. Bu bölümde bu biçimle ilgili ayrıntılar sağlanır.
Bir kaynak başka bir kaynağa bağımlı olduğunda, uygulama konağı ortam değişkenlerini bağımlı kaynağa ekler. Bu ortam değişkenleri bağımlı kaynağı bağımlı olduğu kaynağa bağlanacak şekilde yapılandırıyor. Ortam değişkenlerinin biçimi .NET.NET Aspire özgüdür ve hizmet uç noktalarını Service Discoveryile uyumlu bir şekilde ifade eder.
Hizmet uç noktası ortam değişkeni adlarının önüne services__
(çift alt çizgi), ardından hizmet adı, uç nokta adı ve son olarak dizin eklenir. Dizin, ilk uç nokta için 0
ile başlayıp her uç nokta için artımlı olarak tek bir hizmet için birden çok uç noktayı destekler.
Aşağıdaki ortam değişkeni örneklerini göz önünde bulundurun:
services__apiservice__http__0
Yukarıdaki ortam değişkeni, apiservice
hizmeti için ilk HTTP uç noktasını ifade eder. Ortam değişkeninin değeri, hizmet uç noktasının URL'sidir. Adlandırılmış uç nokta aşağıdaki gibi ifade edilebilir:
services__apiservice__myendpoint__0
Yukarıdaki örnekte, apiservice
hizmetinin myendpoint
adlı adlandırılmış bir uç noktası vardır. Ortam değişkeninin değeri, hizmet uç noktasının URL'sidir.
Mevcut kaynaklara başvurma
Bazı durumlarda, bir bulut sağlayıcısına dağıtılan mevcut bir kaynağa başvurmanız gerekebilir. Örneğin, Azure veritabanına başvurmak isteyebilirsiniz. Bu durumda, uygulama ana bilgisayarının "çalıştırma" modunda mı yoksa "yayımlama" modunda mı çalıştığını dinamik olarak belirlemek için Yürütme bağlamı kullanırsınız. Yerel olarak çalıştırıyorsanız ve bir bulut kaynağına güvenmek istiyorsanız, başvuruyu koşullu olarak eklemek için IsRunMode
özelliğini kullanabilirsiniz. Bunun yerine kaynağı yayımlama modunda oluşturmayı seçebilirsiniz. Bazı barındırma tümleştirmeleri, var olan bir kaynağa başvurmak için kullanılabilecek bir bağlantı dizesinin doğrudan sağlanmasını destekler.
Benzer şekilde, .NET.NET Aspire mevcut bir çözümle tümleştirmek istediğiniz kullanım örnekleri de olabilir. Yaygın yaklaşımlardan biri, .NET.NET Aspire uygulama ana bilgisayarı projesini mevcut bir çözüme eklemektir. Uygulama konağınızda, uygulama konağına proje başvuruları ekleyerek ve uygulama modelini oluşturarak bağımlılıkları ifade edebilirsiniz. Örneğin, bir proje diğerine bağımlı olabilir. Bu bağımlılıklar WithReference yöntemi kullanılarak ifade edilir. Daha fazla bilgi için bkz. Var olan bir .NET Aspire uygulamasına .NET ekleme.
Uygulama barındırıcı yaşam döngüleri
.NET .NET Aspire uygulama konağı, IDistributedApplicationLifecycleHook arabirimini uygulayarak bağlanabileceğiniz çeşitli yaşam döngülerini kullanıma sunar. Aşağıdaki yaşam döngüsü yöntemleri kullanılabilir:
Sipariş | Yöntem | Açıklama |
---|---|---|
1 | BeforeStartAsync | Dağıtılmış uygulama başlamadan önce yürütülür. |
2 | AfterEndpointsAllocatedAsync | Uygulama modelindeki kaynaklar için uç noktalar tahsis edildikten sonra düzenleyici tarafından yürütülür. |
3 | AfterResourcesCreatedAsync | Orkestratör tarafından kaynak oluşturulduktan sonra yürütülür. |
Uygulama konağı yaşam döngüsü kancaları sağlarken, özel olayları kaydetmek isteyebilirsiniz. Daha fazla bilgi için Eventing bölümüne bkz. .NET.NET Aspire.
Yaşam döngüsü kancasını kaydet
Yaşam döngüsü kancasını kaydetmek için IDistributedApplicationLifecycleHook arabirimini uygulayın ve AddLifecycleHook API'sini kullanarak kancayı uygulama konağına kaydedin:
using Aspire.Hosting.Lifecycle;
using Microsoft.Extensions.Logging;
var builder = DistributedApplication.CreateBuilder(args);
builder.Services.AddLifecycleHook<LifecycleLogger>();
builder.Build().Run();
internal sealed class LifecycleLogger(ILogger<LifecycleLogger> logger)
: IDistributedApplicationLifecycleHook
{
public Task BeforeStartAsync(
DistributedApplicationModel appModel, CancellationToken cancellationToken = default)
{
logger.LogInformation("BeforeStartAsync");
return Task.CompletedTask;
}
public Task AfterEndpointsAllocatedAsync(
DistributedApplicationModel appModel, CancellationToken cancellationToken = default)
{
logger.LogInformation("AfterEndpointsAllocatedAsync");
return Task.CompletedTask;
}
public Task AfterResourcesCreatedAsync(
DistributedApplicationModel appModel, CancellationToken cancellationToken = default)
{
logger.LogInformation("AfterResourcesCreatedAsync");
return Task.CompletedTask;
}
}
Önceki kod:
-
IDistributedApplicationLifecycleHook arabirimini
LifecycleLogger
olarak uygular. - Yaşam döngüsü kancasını AddLifecycleHook API'sini kullanarak uygulama barındırıcısına kaydeder.
- Tüm olaylar için bir ileti günlüğe kaydeder.
Bu uygulama barındırıcısı çalıştırıldığında, her olay için yaşam döngüsü kancası devreye girer. Aşağıdaki çıkış oluşturulur:
info: LifecycleLogger[0]
BeforeStartAsync
info: Aspire.Hosting.DistributedApplication[0]
Aspire version: 9.0.0
info: Aspire.Hosting.DistributedApplication[0]
Distributed application starting.
info: Aspire.Hosting.DistributedApplication[0]
Application host directory is: ..\AspireApp\AspireApp.AppHost
info: LifecycleLogger[0]
AfterEndpointsAllocatedAsync
info: Aspire.Hosting.DistributedApplication[0]
Now listening on: https://localhost:17043
info: Aspire.Hosting.DistributedApplication[0]
Login to the dashboard at https://localhost:17043/login?t=d80f598bc8a64c7ee97328a1cbd55d72
info: LifecycleLogger[0]
AfterResourcesCreatedAsync
info: Aspire.Hosting.DistributedApplication[0]
Distributed application started. Press Ctrl+C to shut down.
Uygulama konağı yaşam döngüsüne bağlanmanın tercih edilen yolu, olay api'sini kullanmaktır. Daha fazla bilgi için Eventing bölümüne bkz. .NET.NET Aspire.
Yürütme bağlamı
IDistributedApplicationBuilder, uygulama ana bilgisayarının mevcut yürütmesi hakkında bilgi sağlayan bir yürütme bağlamını (DistributedApplicationExecutionContext) ortaya çıkarır. Bu bağlam, uygulama ana bilgisayarının "çalıştırma" modu olarak mı yoksa yayımlama işleminin bir parçası olarak mı yürütülmekte olup olmadığını değerlendirmek için kullanılabilir. Aşağıdaki özellikleri göz önünde bulundurun:
-
IsRunMode: Geçerli işlem çalışıyorsa
true
döndürür. -
IsPublishMode: Geçerli işlem yayımlanıyorsa
true
döndürür.
Bu bilgiler, geçerli işleme göre koşullu olarak kod yürütmek istediğinizde yararlı olabilir.
IsRunMode
özelliğinin kullanılmasını gösteren aşağıdaki örneği göz önünde bulundurun. Bu durumda, yerel geliştirme çalışmaları için RabbitMQ kararlı bir düğüm adı oluşturmak için bir uzantı yöntemi kullanılır.
private static IResourceBuilder<RabbitMQServerResource> RunWithStableNodeName(
this IResourceBuilder<RabbitMQServerResource> builder)
{
if (builder.ApplicationBuilder.ExecutionContext.IsRunMode)
{
builder.WithEnvironment(context =>
{
// Set a stable node name so queue storage is consistent between sessions
var nodeName = $"{builder.Resource.Name}@localhost";
context.EnvironmentVariables["RABBITMQ_NODENAME"] = nodeName;
});
}
return builder;
}
Yürütme bağlamı genellikle var olan kaynaklara işaret eden kaynakları veya bağlantı dizelerini koşullu olarak eklemek için kullanılır. Yürütme bağlamını temel alarak koşullu olarak Redis veya bağlantı dizesi eklemeyi gösteren aşağıdaki örneği göz önünde bulundurun:
var builder = DistributedApplication.CreateBuilder(args);
var redis = builder.ExecutionContext.IsRunMode
? builder.AddRedis("redis")
: builder.AddConnectionString("redis");
builder.AddProject<Projects.WebApplication>("api")
.WithReference(redis);
builder.Build().Run();
Yukarıdaki kodda:
- Uygulama konağı "çalıştır" modunda çalışıyorsa bir Redis kapsayıcı kaynağı eklenir.
- Uygulama konağı "yayımlama" modunda çalışıyorsa bir bağlantı dizesi eklenir.
Bu mantık, yerel olarak çalışırken mevcut bir Redis kaynağına bağlanmak ve yayımlarken yeni bir Redis kaynağı oluşturmak için kolayca tersine çevrilebilir.
Önemli
.NET
.NET Aspire, kaynak oluşturucularının modalitesini denetlemek için ortak API'ler sağlar ve kaynakların yürütme moduna göre farklı davranmasına olanak tanır. Akıcı API'ler RunAs*
ve PublishAs*
ile öneklenir.
RunAs*
API'leri yerel geliştirme (veya çalıştırma modu) davranışını etkilerken, PublishAs*
API'leri kaynağın yayımlanmasını etkiler.
Azure kaynaklarının bu API'leri nasıl kullandığı hakkında daha fazla bilgi için bkz. Var olan Azure kaynaklarını kullanma.
Kaynak ilişkileri
Kaynak ilişkileri kaynakları birbirine bağlar. İlişkiler bilgilendirme amaçlıdır ve bir uygulamanın çalışma zamanı davranışını etkilemez. Bunun yerine, bunlar panodaki kaynaklar hakkındaki ayrıntılar görüntülenirken kullanılır. Örneğin, ilişkiler panosunun kaynak ayrıntılarındagörünür ve Parent
ilişkiler kaynaklar sayfasında kaynak iç içe yerleştirmeyi denetler.
İlişkiler bazı uygulama modeli API'leri tarafından otomatik olarak oluşturulur. Örneğin:
-
WithReference, hedef kaynağa
Reference
türüyle bir ilişki ekler. -
WaitFor, hedef kaynağa
WaitFor
türüyle bir ilişki ekler. - Veritabanı kapsayıcısına veritabanı eklemek, veritabanından kapsayıcıya
Parent
türüyle bir ilişki oluşturur.
İlişkiler, WithRelationship ve WithParentRelationshipkullanılarak uygulama modeline açıkça eklenebilir.
var builder = DistributedApplication.CreateBuilder(args);
var catalogDb = builder.AddPostgres("postgres")
.WithDataVolume()
.AddDatabase("catalogdb");
builder.AddProject<Projects.AspireApp_CatalogDbMigration>("migration")
.WithReference(catalogDb)
.WithParentRelationship(catalogDb);
builder.Build().Run();
Yukarıdaki örnekte, catalogdb
veritabanını migration
projesinin üst öğesi olarak yapılandırmak için WithParentRelationship kullanılır. Kaynak sayfasında kaynakların iç içe yerleştirilmesini kontrol ettiği için Parent
ilişkisi özeldir. Bu örnekte, migration
catalogdb
altında iç içe yerleştirilmiştir.
Not
Bir kaynağın birden fazla ebeveyn ilişkisine sahip olmasını veya döngüsel bir başvuru oluşturmasını önlemek için doğrulama vardır. Bu yapılandırmalar kullanıcı arabiriminde işlenemez ve uygulama modeli bir hata oluşturur.
Ayrıca bkz.
.NET Aspire