Snadno spravujte konfigurace mikroslužeb pomocí microconfig.io

Jedním z hlavních problémů při vývoji a následném provozu mikroslužeb je kompetentní a přesná konfigurace jejich instancí. Podle mého názoru s tím může pomoci nový framework microconfig.io. Umožňuje poměrně elegantně řešit některé rutinní úlohy konfigurace aplikací.

Pokud máte mnoho mikroslužeb a každá z nich přichází s vlastním konfiguračním souborem/soubory, pak je vysoká pravděpodobnost, že v jedné z nich uděláte chybu, kterou může být velmi obtížné zachytit bez patřičných dovedností a systému protokolování. Hlavním úkolem, který si framework stanoví, je minimalizovat duplicitní konfigurační parametry instance, a tím snížit pravděpodobnost přidání chyby.

Podívejme se na příklad. Řekněme, že máme jednoduchou aplikaci s konfiguračním souborem yaml. Může to být jakákoli mikroslužba v jakémkoli jazyce. Podívejme se, jak lze framework aplikovat na tuto službu.

Nejprve však pro větší pohodlí vytvoříme prázdný projekt v Idea IDE poté, co do něj nainstalujeme plugin microconfig.io:

Snadno spravujte konfigurace mikroslužeb pomocí microconfig.io

Nastavili jsme konfiguraci spouštění pluginu, můžete použít výchozí konfiguraci, jako na obrázku výše.

Naše služba se nazývá objednávka, pak v novém projektu vytvoříme podobnou strukturu:

Snadno spravujte konfigurace mikroslužeb pomocí microconfig.io

Umístěte konfigurační soubor do složky s názvem služby - aplikace.yaml. Všechny mikroslužby jsou spouštěny v nějakém prostředí, takže kromě vytvoření konfigurace pro samotnou službu je nutné popsat samotné prostředí: k tomu vytvoříme složku env a přidejte do něj soubor s názvem našeho pracovního prostředí. Framework tedy vytvoří konfigurační soubory pro služby v prostředí dev, protože tento parametr je nastaven v nastavení pluginu.

Struktura souboru dev.yaml bude to celkem jednoduché:

mainorder:
    components:
         - order

Rámec pracuje s konfiguracemi, které jsou seskupeny. Pro naši službu vyberte název skupiny hlavní objednávka. Framework najde každou takovou skupinu aplikací v souboru prostředí a pro všechny vytvoří konfigurace, které najde v odpovídajících složkách.

V samotném souboru nastavení služby objednat Uvedeme zatím pouze jeden parametr:

spring.application.name: order

Nyní spustíme plugin a ten vygeneruje požadovanou konfiguraci pro naši službu podle cesty zadané ve vlastnostech:

Snadno spravujte konfigurace mikroslužeb pomocí microconfig.io

Jeden může dostat se a bez instalace pluginu, jednoduše si stáhněte distribuci frameworku a spusťte ji z příkazového řádku.
Toto řešení je vhodné pro použití na sestavení serveru.

Za zmínku stojí, že framework dokonale rozumí majetek syntaxe, tedy běžné soubory vlastností, které lze použít společně yaml konfigurace.

Přidáme další službu platba a zkomplikovat ten stávající.
В objednat:

eureka:
 instance.preferIpAddress: true
 client:
   serviceUrl:
     defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100

В platba:

eureka:
 instance.preferIpAddress: true
 client:
   serviceUrl:
     defaultZone: http://192.89.89.111:6782/eureka/
server.port: 9998
spring.application.name: payments
db.url: 192.168.0.100

Hlavním problémem těchto konfigurací je přítomnost velkého množství copy-paste v nastavení služeb. Podívejme se, jak framework pomůže se toho zbavit. Začněme tím nejviditelnějším – přítomností konfigurace eureka v popisu každé mikroslužby. Vytvoříme nový adresář se souborem nastavení a přidáme do něj novou konfiguraci:

Snadno spravujte konfigurace mikroslužeb pomocí microconfig.io

A nyní přidejte řádek ke každému našemu projektu #zahrnout heuréku.

Framework automaticky najde konfiguraci heureky a zkopíruje ji do konfiguračních souborů služby, zatímco samostatná konfigurace heureky nebude vytvořena, protože ji nebudeme specifikovat v souboru prostředí. dev.yaml. Servis objednat:

#include eureka
server.port: 9999
spring.application.name: order
db.url: 192.168.0.100

Nastavení databáze můžeme také přesunout do samostatné konfigurace změnou řádku importu na #include heureka, oracle.

Stojí za zmínku, že framework sleduje každou změnu při regeneraci konfiguračních souborů a umístí ji do speciálního souboru vedle hlavního konfiguračního souboru. Záznam v jeho protokolu vypadá takto: „Uložená 1 vlastnost se změní na order/diff-application.yaml" To vám umožní rychle detekovat změny velkých konfiguračních souborů.

Odstranění společných částí konfigurace umožňuje zbavit se spousty zbytečného copy-paste, ale neumožňuje flexibilně vytvářet konfiguraci pro různá prostředí – koncové body našich služeb jsou unikátní a pevně zakódované, to je špatně. Zkusme to odstranit.

Dobrým řešením by bylo ponechat všechny koncové body v jedné konfiguraci, na kterou mohou ostatní odkazovat. Za tímto účelem byla do rámce zavedena podpora zástupných symbolů. Takto se změní konfigurační soubor eureka:

 client:
   serviceUrl:
     defaultZone: http://${endpoints@eurekaip}:6782/eureka/

Nyní se podívejme, jak tento zástupný symbol funguje. Systém najde komponent s názvem koncové body a hledá v tom smysl eurekaipa poté jej nahradí do naší konfigurace. Ale co různá prostředí? Chcete-li to provést, vytvořte soubor nastavení v koncové body následující typ application.dev.yaml. Rámec nezávisle, na základě přípony souboru, rozhodne, do kterého prostředí tato konfigurace patří, a načte ji:

Snadno spravujte konfigurace mikroslužeb pomocí microconfig.io

Obsah dev souboru:

eurekaip: 192.89.89.111
dbip: 192.168.0.100

Můžeme vytvořit stejnou konfiguraci pro porty našich služeb:

server.port: ${ports@order}.

Všechna důležitá nastavení jsou na jednom místě, čímž se snižuje pravděpodobnost chyb způsobených roztroušenými parametry v konfiguračních souborech.

Framework poskytuje mnoho hotových zástupných symbolů, například můžete získat název adresáře, ve kterém se nachází konfigurační soubor, a přiřadit jej:

#include eureka, oracle
server.port: ${ports@order}
spring.application.name: ${this@name}

Díky tomu není potřeba v konfiguraci dodatečně uvádět název aplikace a lze ji umístit i do společného modulu např. ve stejné heuréce:

client:
   serviceUrl:
     defaultZone: http://${endpoints@eurekaip}:6782/eureka/
 spring.application.name: ${this@name}

Konfigurační soubor objednat se zmenší na jeden řádek:

#include eureka, oracle
server.port: ${ports@order}

Pokud nepotřebujeme žádné nastavení z nadřazené konfigurace, můžeme jej specifikovat v naší konfiguraci a bude aplikováno při generování. To znamená, že pokud z nějakého důvodu potřebujeme jedinečný název pro objednávkovou službu, parametr prostě ponecháme jarní.název.aplikace.

Řekněme, že potřebujete do služby přidat vlastní nastavení protokolování, která jsou uložena v samostatném souboru, např. logback.xml. Vytvořme pro něj samostatnou skupinu nastavení:

Snadno spravujte konfigurace mikroslužeb pomocí microconfig.io

V základní konfiguraci sdělíme frameworku, kam umístit soubor nastavení protokolování, který potřebujeme, pomocí zástupného symbolu @ConfigDir:

microconfig.template.logback.fromFile: ${logback@configDir}/logback.xml

V souboru logback.xml konfigurujeme standardní appendery, které zase mohou obsahovat i zástupné symboly, které se framework změní během generování konfigurací, například:

<file>logs/${this@name}.log</file>

Přidáním importu do konfigurací služby přihlášení, automaticky získáme nakonfigurované protokolování pro každou službu:

#include eureka, oracle, logback
server.port: ${ports@order}

Je čas se podrobněji seznámit se všemi dostupnými zástupnými symboly rámce:

${this@env} - vrátí název aktuálního prostředí.
${…@name} — vrátí název komponenty.
${…@configDir} — vrátí úplnou cestu do konfiguračního adresáře komponenty.
${…@resultDir} — vrátí úplnou cestu k cílovému adresáři komponenty (výsledné soubory budou umístěny v tomto adresáři).
${this@configRoot} — vrátí úplnou cestu ke kořenovému adresáři úložiště konfigurace.

Systém také umožňuje získat proměnné prostředí, například cestu k java:
${env@JAVA_HOME}
Buď protože je framework napsán JAVA, můžeme získat systémové proměnné podobné volání System::getProperty pomocí takové struktury:
${[chráněno e-mailem]}
Za zmínku stojí podpora jazyka rozšíření Pružina EL. V konfiguraci jsou použitelné následující výrazy:

connection.timeoutInMs: #{5 * 60 * 1000}
datasource.maximum-pool-size: #{${[email protected]} + 10} 

a pomocí výrazu můžete v konfiguračních souborech používat lokální proměnné #var:

#var feedRoot: ${[email protected]}/feed
folder:
 root: ${this@feedRoot}
 success: ${this@feedRoot}/archive
 error: ${this@feedRoot}/error

Rámec je tedy poměrně výkonným nástrojem pro jemné ladění a flexibilní konfiguraci mikroslužeb. Framework dokonale plní svůj hlavní úkol – eliminaci kopírování a vkládání v nastavení, konsolidaci nastavení a ve výsledku minimalizaci případných chyb a zároveň umožňuje snadno kombinovat konfigurace a měnit je pro různá prostředí.

Pokud vás tento framework zaujal, doporučuji navštívit jeho oficiální stránku a seznámit se s plným dokumentacenebo kopat do zdrojů zde.

Zdroj: www.habr.com

Přidat komentář