Instalowanie wielu aplikacji spring-boot na jednym serwerze aplikacji

18 lutego 2016, Andrzej Karczyński

Spring-boot to bardzo dobry framework do szybkiego i łatwego tworzenie aplikacji. Posiada szereg wbudowanych funkcji niezbędnych dla współczesnych system m.in.: metryki, health-checks, możliwość wydzielenia konfiguracji do zewnętrznych zasobów. Z wykorzystaniem tego frameworku można tworzyć zarówno aplikacje „stand-alone” (uruchamiane z wbudowanego kontenera serwletów) lub też instalować je tradycyjnie na serwerach aplikacji. Niestety, w dokumentacji Spring-boot brakuje informacji w jaki sposób można instalować wiele aplikacji stworzonych w tym frameworku na pojedynczym serwerze aplikacji. W tym poście postaram się przybliżyć rozwiązanie tej kwestii.

Oczywiście rekomendowanym podejściem jest instalowanie różnych aplikacji na różnych instancjach serwerów. W takim modelu łatwiej zarządza się przydzielonymi zasobami. Łatwiej jest też wyizolować potencjalne błędy. Czasami jednak, ze względu na szczególne wymagania projektowe wymagane jest, aby aplikacje były uruchamiane na wspólnej instancji serwera.

W trakcie prac nad zagadnieniem natrafiłem na dwa główne problemy przy instalacji wielu aplikacji na pojedynczej instancji:

  • zmiana nazwy pliku application.properties
  • konflikty pomiędzy bean’ami JMX

Zmiana nazwy pliku application.properties

Spring-boot wspiera zmianę nazwy pliku application.properties przez wykorzystanie właściwości (property) spring.config.nameTakie podejście działa bezbłędnie przy pojedynczej aplikacji. Jeśli jednak chcemy, jak w naszym przypadku, wykorzystać ten mechanizm do więcej niż jednej aplikacji oznaczałoby zmianę konfiguracji tym jednym wpisem, dla wszystkich aplikacji (a nie o to nam chodzi). Możemy ten problem rozwiązać wprowadzając wartość tej właściwości w klasie ServletInitializer:

Jeśli chcemy uruchomić aplikację w trybie „stand-alone” lub z pluginu maven’owego Spring-boot wtedy wartość właściwości spring.config.name ustawiamy przez zmienną środowiskową lub ustawiamy ją przez poniższe wywołania w metodzie main klasy uruchomieniowej:

W przypadku uruchamiania testów jednostkowych możemy wykorzystać zmienną środowiskową do przekazania odpowiedniej wartości lub ustawić wartość właściwości w konstruktorze:

Konflikty pomiędzy bean’ami JMX

Wiele bibliotek publikuje bean’y JMX. Tak się składa, że bean’y JMX muszą mieć unikalną nazwę w ramach jednej maszyny wirtualnej Java (JVM). Kiedy instalujemy dwie (lub więcej) aplikacji Spring-boot na jednej instancji serwera pojawiają się kolizje. Na szczęście jest proste rozwiązanie tego problemu dzięki możliwości zmiany nazw publikowanych bean’ów. Najprostszym sposobem będzie zmiana domeny Spring-boot actuator przez ustawienie właściwości endpoints.jmx.domain.

Tagi: , , , , , , , ,

Zapraszamy do kontaktu!

Pretius jest firmą tworząca oprogramowanie wspierające biznes.
Tworzymy aplikacje webowe wykorzystując: Java, Oracle DB, Oracle Apex, AngularJS.
Skontaktuj się z nami, aby porozmawiać o tym jak możemy pomóc w realizacji Twojego projektu!