Gdzie mam umieścić konfigurację mojej aplikacji?

17

Czytałem ostatnio debatę na temat „ Gdzie powinny być przechowywane nieruchomości zależne od środowiska? ”.

Klasycznym sposobem jest posiadanie wielu plików właściwości, po jednym dla środowiska i na podstawie zmiennej środowiskowej (DEV, PROD ...), wybierasz, gdzie je odczytać przy uruchamianiu aplikacji (jak w przypadku profili Spring).

Z drugiej strony, jeśli używasz kontenera do wdrożenia aplikacji, mówi się, że tego rodzaju konfiguracja powinna pochodzić z samego środowiska (przy użyciu zmiennych środowiskowych odczytywanych przez aplikację), więc obraz nie zmienia się między środowiskami.

Jakie są zalety i wady każdego podejścia? Czy istnieje „najlepsze” podejście do scenariusza dotyczącego kontenera?

Carcaret
źródło
Co sprawia, że ​​myślisz, że oparcie się na zmiennej środowiskowej w celu wybrania pliku jest niezgodne z użyciem zmiennej środowiskowej, więc obraz się nie zmienia? (główną wadą jest pozostawianie poświadczeń prod w kontenerach dev i qa bardziej niż cokolwiek innego)
Tensibai

Odpowiedzi:

6

Kto powiedział, że pliki właściwości i zmienne środowiskowe wykluczają się wzajemnie?

Należy rozróżnić „gdzie mam zapisać konfigurację mojej aplikacji?” I „gdzie moja aplikacja źródło to konfiguracja?”

Najbardziej prawdopodobnym rezultatem jest to, że wszyscy prawdopodobnie powinni po prostu robić to, co robią z plikami konfiguracyjnymi jako mechanizmem przechowywania (pomyśl długoterminowo, stan trwały, dopóki istnieje środowisko).

Jednak zamiast upuszczać ten plik konfiguracyjny do kontekstu aplikacji i pozwalać na jego uruchomienie, aplikacja powinna oczekiwać, że te zmienne będą już dostępne w środowisku podczas uruchamiania.

Oznacza to, że musisz mieć dwa przepływy pracy wdrażania -

  1. Wdrażam aplikację w środowisku, przechodząc przez proces kontroli zmian X i robiąc recenzje Y za pomocą narzędzia Z, cokolwiek.
  2. Wdrażam swoją konfigurację środowiska w środowisku, przechodząc przez proces kontroli zmiany A i wykonując recenzje B za pomocą narzędzia C, ten sam proces, inny wynik.

Aby użyć przykładu zarządzania zmiennymi środowiskowymi jako parami wartości klucza w narzędziu takim jak konsul, jeśli przechowujesz pliki konfiguracyjne w git, to narzędzia takie jak git2consul z uchwytem pobierają tę konfigurację do środowiska, gdy jest aktualizowana.

Jeśli masz aplikację, która spodziewa się, że będzie dostępna konfiguracja jako plik konfiguracyjny, możesz uniknąć wysyłania wielu kopii pliku konfiguracyjnego z aplikacją, budując proces wdrażania z czymś takim jak konsul-szablon, który ma możliwość zmiany twojego konsul wartości z powrotem do pliku.

hvindin
źródło
0

W ten sposób mamy 3 elementy (lub artefakty) dla każdej uruchomionej aplikacji.

  1. Opracowywana przez nas aplikacja. Tak samo jest bez względu na środowisko. Dla przykładu, będzie to aplikacja Spring jako jar / war.
  2. Kontener, który uruchomi aplikację. Tak samo jest bez względu na środowisko. Jeśli używasz Spring Boot, nie potrzebujesz już Tomcat, a tylko środowisko wykonawcze Java. Więc użyj kontenera Openjdk Docker.
  3. Konfiguracja potrzebna aplikacji. To jedyna rzecz, która różni się w zależności od środowiska. W aplikacji Spring prawdopodobnie będziesz używać pliku właściwości.

Plik konfiguracyjny znajduje się w osobnej kontroli źródła. Kiedyś był to Git, ale teraz korzystamy z SaaS, który zbudowaliśmy o nazwie Config, pod adresem http://www.configapp.com . Podstawową funkcją Config jest łatwa obsługa konfiguracji specyficznej dla środowiska. Aby uruchomić naszą aplikację na nowym serwerze, pobieramy kontener Docker, artefakt aplikacji i plik konfiguracyjny dla tego środowiska. W kontenerze montujemy katalog, w którym przechowywana jest aplikacja i plik konfiguracyjny, w ramach działania kontenera. Nasza aplikacja jest taka sama. Nasz pojemnik / obraz jest taki sam. Tylko plik konfiguracyjny jest inny.

Jeśli chodzi o plik konfiguracyjny a zmienne środowiskowe. Najdłużej korzystaliśmy z plików konfiguracyjnych. Kiedy korzystaliśmy z PaaS / cloud, używaliśmy zmiennych środowiskowych. To była dodatkowa praca, jeśli masz dużo konfiguracji, więc do określenia poprawnego pliku konfiguracyjnego wykorzystaliśmy zmienne środowiskowe. Mamy jedną aplikację, która przekształciła właściwości w zmienne środowiskowe, ale to nietypowe. Jeśli mamy sankcjonowany przez firmę scentralizowany serwer konfiguracji, korzystamy z niego, w przeciwnym razie lubimy prostotę plików konfiguracyjnych.

Podsumowując, pobieramy app.jar, app.properties, openjdk Docker. Następnie uruchamiamy Docker openjdk, instalując lokalizację app.jar i app.properties. Jedyne, co jest specyficzne dla środowiska, to app.properties. Aby łatwo zarządzać app.properties, niezależnie od liczby kluczy właściwości, środowisk, wystąpień klastra / regionu, używamy Config.

Bienvenido David
źródło