V rámci vývoje aplikací v ASP.NET Core 9 je často nezbytné získávat a spravovat konfigurace z různých zdrojů, jako jsou soubory, databáze nebo environmentální proměnné. ASP.NET Core 9 nabízí robustní framework pro správu konfigurací, ale někdy se může stát, že aplikace vyžaduje integraci s vlastním poskytovatelem konfigurace. Tento proces zahrnuje vytvoření třídy, která definuje způsob, jakým se konfigurace načítá a poskytuje aplikaci.
K tomu, abyste vytvořili vlastní poskytovatele konfigurace v ASP.NET Core 9, musíte rozumět několika klíčovým principům. Začněme tím, jak ASP.NET Core nativně zajišťuje správu konfigurace a jak lze tento proces přizpůsobit pro vlastní potřeby.
ASP.NET Core 9 nabízí několik vestavěných poskytovatelů konfigurace, jako jsou AddEnvironmentVariables() pro získávání konfigurace z environmentálních proměnných nebo AddCommandLine() pro načítání parametrů příkazové řádky. Tyto metody jsou součástí frameworku a umožňují aplikacím jednoduše získávat konfiguraci z různých zdrojů. Nicméně pro složitější scénáře, jako je připojení k vlastní databázi nebo cloudovým službám, může být nutné vytvořit vlastní poskytovatele konfigurace.
Vytváření vlastního poskytovatele konfigurace
Abychom vytvořili vlastní poskytovatele konfigurace, potřebujeme implementovat dvě hlavní třídy: ConfigurationSource a ConfigurationProvider.
Třída ConfigurationSource implementuje rozhraní IConfigurationSource a zodpovídá za vytvoření instance poskytovatele konfigurace. Tento krok odděluje logiku, odkud konfigurace pochází, od toho, jak je načítána. Tento princip je známý jako návrhový vzor Factory, který usnadňuje testovatelnost a údržbu kódu.
Třída ConfigurationProvider, která dědí od abstraktní třídy ConfigurationProvider, se stará o samotné načítání a poskytování dat. Je zodpovědná za to, jak jsou data čtena, cachována a zpřístupněna aplikaci.
Příklad implementace CustomConfigurationSource může vypadat takto:
Tato třída má pouze jednu metodu Build(), která vrací instanci poskytovatele konfigurace. Tento design nám umožňuje mít čistý a snadno rozšiřitelný kód, protože se zde oddělují odpovědnosti za získávání a načítání dat.
Pokud jde o samotné načítání dat, třída CustomConfigurationProvider by mohla vypadat následovně:
V tomto příkladu třída CustomConfigurationProvider dědí od ConfigurationProvider a přepisuje metodu Load(), která načítá data a ukládá je do vlastnosti Data. Tato data mohou pocházet z různých zdrojů, jako jsou soubory, databáze nebo externí API, ale v tomto případě je používán jednoduše Dictionary.
Po implementaci vlastního poskytovatele je nutné přidat tento poskytovatel do aplikace pomocí metody Add() v souboru Program.cs:
Pro získání hodnoty z nové konfigurace pak stačí použít metody jako GetValue(), které jsou součástí rozhraní IConfiguration:
Možnosti rozšíření a silně typovaná konfigurace
I když je tento příklad poměrně jednoduchý, lze vlastní poskytovatele konfigurace rozšířit a připojit je k různým trvalým úložištím, jako jsou databáze nebo cloudová úložiště. Tento flexibilní přístup k poskytovatelům konfigurace umožňuje vývojářům přizpůsobit aplikaci specifickým potřebám.
Pokud se aplikace vyžaduje silně typovanou konfiguraci, můžete kombinovat vlastní poskytovatele s technikou, jakou je Options Pattern. Tento vzor nabízí způsob, jak spravovat konfiguraci ve formě silně typovaných tříd, což zlepšuje údržbu, testovatelnost a poskytuje větší bezpečnost při práci s konfiguracemi.
Výhody a flexibilité poskytovatelů konfigurace
Poskytovatelé konfigurace v ASP.NET Core 9 jsou skvělým nástrojem pro práci s dynamickými a externími konfiguracemi. Umožňují aplikacím být flexibilní, protože poskytovatel může snadno přistupovat k různým externím zdrojům konfigurace. Ať už se jedná o cloudové prostředí, API třetích stran nebo vlastní formáty souborů, vlastním poskytovatelem lze implementovat libovolný způsob načítání a poskytování konfigurace.
Tento přístup rovněž poskytuje možnost měnit a přizpůsobovat konfiguraci za běhu aplikace, což je velmi užitečné pro dynamické prostředí, kde se nastavení mohou měnit bez nutnosti restartu aplikace. Při správné implementaci mohou vlastní poskytovatelé konfigurace přispět k lepší správě a bezpečnosti aplikace.
Jak generovat balíčky pro publikování aplikace v ASP.NET Core 9?
Generování balíčků pro publikování aplikace je jedním z klíčových kroků při přípravě na nasazení a hostování aplikace. K tomu, abyste pochopili, jak tento proces funguje, použijeme příklad aplikace, který jsme již stáhli z GitHubu a který budeme využívat po celou dobu této kapitoly.
Pro práci s aplikací a jejím publikováním využíváme nástroj CLI platformy .NET, což je nástroj příkazového řádku, který jsme podrobně prozkoumali v předchozích kapitolách. Tento nástroj poskytuje specifický příkaz pro generování balíčků pro ASP.NET Core 9 projekty – příkaz dotnet publish.
Příkaz dotnet publish poskytuje několik možností, které nám umožňují nastavit parametry výstupu publikovaného balíčku. Některé z těchto možností jsou:
-
-c, --configuration: Určuje konfiguraci sestavení (například Debug nebo Release). Konfigurace Debug je optimalizována pro ladění, zatímco Release je určena pro produkční nasazení a je optimalizována pro výkon.
-
-f, --framework: Určuje cílový rámec aplikace, například net8.0.
-
-r, --runtime: Určuje, pro jakou platformu bude aplikace publikována (například win-x64 nebo linux-x64).
-
-o, --output: Určuje adresář, do kterého budou umístěny publikované soubory.
-
--self-contained: Publikuje aplikaci jako samostatně spustitelnou, včetně .NET runtime, což znamená, že na cílovém serveru není nutné mít nainstalován .NET SDK nebo runtime.
-
--no-restore: Zakazuje obnovení závislostí při publikování, což je užitečné například při použití CI/CD pipeline.
Chcete-li vygenerovat balíček pro aplikaci UrlShortener, stačí otevřít terminál nebo Bash, přejít do složky s aplikací a spustit následující příkaz:
Tento příkaz vygeneruje balíček v adresáři ./published, který bude připraven pro nasazení. Pokud se podíváme na obsah tohoto adresáře, uvidíme nejen soubory konfigurace, ale také všechny závislosti aplikace – různé .dll soubory, které aplikace používá, a statické soubory, jako jsou obrázky, CSS a JavaScript, umístěné v adresáři wwwroot. Takto připravený balíček je připraven k nasazení na server.
Po publikování můžeme aplikaci spustit z terminálu příkazem:
Tento soubor UrlShortener.dll je spustitelný soubor pro aplikaci ASP.NET Core 9, který lze spustit na vývojovém stroji, kde je nainstalováno .NET SDK. Na serverech, které budou aplikaci hostovat, však není potřeba mít nainstalován .NET SDK, ale pouze .NET Runtime.
.NET Runtime je prostředí, které umožňuje spuštění aplikací postavených na .NET platformě. Na rozdíl od SDK, které slouží k vývoji aplikací, .NET Runtime obsahuje pouze součásti potřebné k samotnému spuštění aplikací, jako je správa paměti, sběr nevyužívané paměti a zachytávání výjimek. Tento runtime je tedy dostatečný pro provoz aplikací na serverech, které nevyžadují vývojové nástroje.
Pokud se rozhodneme aplikaci publikovat do cloudového prostředí, musíme také zohlednit několik dalších aspektů. V dnešní době je téměř nemožné vynechat cloudové prostředí při nasazování aplikací. Cloudové prostředí nabízí obrovské výhody, jako je snadná škálovatelnost, vysoká dostupnost a integrované nástroje pro správu a monitorování aplikací.
Pokud plánujete hostovat svou aplikaci na veřejném serveru nebo v cloudovém prostředí, je důležité mít na paměti specifické požadavky na servery v závislosti na operačním systému, který používáte. Aplikace ASP.NET Core 9 mohou běžet na různých operačních systémech, jako jsou Linux, macOS nebo Windows, a každý z těchto systémů může vyžadovat specifické servery a služby pro běh aplikace, například Kestrel, Nginx nebo IIS.
Připravenost aplikace na nasazení je důležitým krokem, který zahrnuje nejen generování publikovatelného balíčku, ale i rozhodnutí o tom, jakým způsobem bude aplikace hostována a jak bude zajištěn její výkon a dostupnost v reálném prostředí.
Pokud máte aplikaci připravenou pro publikování a hosting, je dalším krokem automatizace tohoto procesu pomocí CI/CD, což vám umožní efektivně spravovat nasazení a aktualizace aplikace v produkčním prostředí. Tento přístup si podrobněji probereme v dalších kapitolách, kde se budeme věnovat DevOps přístupu a automatizaci pomocí CI/CD pipeline.
Jak správně vytvořit a nasadit Docker kontejner pro .NET aplikaci
Docker je nástroj, který umožňuje balení aplikací a jejich závislostí do kontejnerů, které mohou běžet na jakémkoliv systému bez ohledu na jeho specifikace. Pro vývojáře .NET je tato technologie klíčová při vytváření a nasazování aplikací. Tento proces zahrnuje několik fází, které umožňují vytvořit optimalizovaný obraz aplikace, minimalizovat velikost a zajistit její efektivní běh na různých prostředích.
Pro nasazení aplikace v Dockeru používáme tzv. multi-stage build, což znamená, že celý proces výstavby aplikace probíhá v několika krocích. Každý z těchto kroků využívá jiný základní obraz, což vede k optimalizovanému výsledku. Tento přístup pomáhá odstranit všechny nepotřebné soubory a nástroje, které by mohly zvětšit velikost finálního obrazu. V následujícím textu si popíšeme, jak se tento proces realizuje v praxi.
Prvním krokem je vytvoření fáze Build, která bude zodpovědná za kompilaci aplikace. Začíná se vybráním obrazu, který obsahuje .NET SDK, v tomto případě verze 8.0, z repozitáře MCR (Microsoft Container Registry). Tato fáze definuje pracovní adresář a následně kopíruje projektové soubory do kontejneru. Poté následuje příkaz pro obnovení závislostí aplikace (dotnet restore), aby bylo možné pokračovat v dalším kroku – samotné kompilaci aplikace.
V druhé fázi Publish dojde k publikování aplikace. Tento krok zahrnuje kompilaci aplikace do verze připravené pro nasazení a umístění všech potřebných souborů do adresáře pro publikaci. Jakmile jsou všechny soubory zkompilovány a připraveny, přichází fáze, která vytváří finální obraz pro běh aplikace.
Poslední fází je Final stage, která používá výsledky z předchozích fází pro vytvoření obrazu, který bude skutečně nasazen na server. Tento obraz obsahuje pouze nezbytné součásti pro běh aplikace – samotný běhový prostředek a všechny související knihovny, ale žádné nástroje pro kompilaci nebo jiné nepotřebné soubory. Tento krok se soustředí na minimalizaci velikosti obrazu a maximalizaci výkonu.
Pokud bychom chtěli použít jednodušší přístup, mohli bychom obětovat některé optimalizace a zjednodušit Dockerfile na verzi, která přímo kopíruje již zkompilovaný balíček aplikace do kontejneru. Tento způsob sice vyžaduje manuální kompilaci a publikaci aplikace před samotným vytvořením obrazu, ale může být užitečný v případech, kdy chceme mít jednoduchý, ale funkční proces. Výsledný Dockerfile by vypadal takto:
Tento přístup je však vhodný pouze v případě, že máme jistotu, že naše aplikace bude vždy správně zkompilována před tím, než vytvoříme Docker image.
Jakmile máme připravený Dockerfile, můžeme přistoupit k samotnému procesu generování Docker obrazu. K tomu slouží příkaz docker build, který spustí definovaný proces podle instrukcí v Dockerfile. Příkaz vypadá takto:
Tento příkaz spustí kompilaci obrazu s názvem urlshortener:1.0. Je důležité si uvědomit, že tagování obrazu verzí (v tomto případě 1.0) je doporučeno, protože umožňuje lepší správu verzí a kontrolu nad nasazovanými verzemi aplikace. Po úspěšném vytvoření obrazu lze pomocí příkazu docker images zkontrolovat, jaké obrazy jsou k dispozici v místním repozitáři.
Následuje fáze, kdy musíme spustit kontejner na základě vygenerovaného obrazu. K tomu slouží příkaz:
Tento příkaz spustí kontejner na pozadí (-d) a mapuje porty, což znamená, že aplikace běžící na portu 8080 uvnitř kontejneru bude dostupná na portu 8899 na hostitelském počítači. Tento přístup umožňuje snadné testování aplikace v izolovaném prostředí.
Pokud budeme mít více verzí aplikace, můžeme jednoduše přidělovat různé tagy pro každý vygenerovaný obraz, což nám umožní mít přehled o jednotlivých verzích a jejich nasazení. Je důležité si uvědomit, že kontejnery jsou neměnné objekty. Jakákoliv změna aplikace si vyžádá vygenerování nového obrazu s novým tagem, což je zásadní pro udržení konzistence a správu verzí.
Při práci s kontejnery je důležité zaměřit se na optimalizaci velikosti obrazů. Menší obrazy nejen zrychlují proces nasazování aplikace, ale také šetří prostředky na serveru a zkracují čas potřebný k jejich spuštění. Z tohoto důvodu byste se měli vždy snažit o minimalizaci množství nepotřebných souborů a nástrojů, které jsou zahrnuty v konečném Docker obrazu.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский