Framework Spring Boot zapewnia możliwość monitorowania i zarządzania aplikacją za pomocą Spring Boot Actuator.
Moduł ten jest przeznaczony do audytu, kondycji i gromadzenia metryk, ale może również otwierać ukryte drzwi do serwera, gdy jest źle skonfigurowany (na przykład ustawić odpowiedni poziom dziennika aplikacji w czasie wykonywania). Jeśli nie jesteś z nim zaznajomiony, możesz zapoznać się z pełną dokumentacją na oficjalnej stronie.
Moduł Actuator pozwala uzyskać dostęp do wszystkich dostępnych punktów końcowych za pomocą protokołu HTTP lub rozszerzeń Java Management Extensions(JMX). Nie jestem wielkim entuzjastą udostępniania punktów końcowych zarządzania jako publicznego API, więc rozsądnym rozwiązaniem jest duet JMX i JConsole.
Opis problemu
Jeśli Twoja aplikacja Spring Boot jest dockeryzowana i zarządzana przez Docker Compose, możesz napotkać problem z połączeniem JMX. Problem staje się bardziej skomplikowany, jeśli chcesz połączyć JConsole z aplikacją zainstalowaną na zewnętrznym serwerze i uruchomioną wewnątrz Dockera. Moje próby połączenia JConsole ze zdalnymi punktami końcowymi JMX prowadzą do następujących błędów:
java.rmi.ConnectIOException: error during JRMP connection establishment;
nested exception is: java.io.EOFException
lub
java.net.ConnectException
Rozwiązanie
Zanim zaczniemy...
Zanim przedstawię pełny opis, chciałbym przedstawić moje założenia:
- aplikacja jest dockeryzowana i uruchamiana przez instrukcję Docker ENTRYPOINT:
ENTRYPOINT ["java", "-jar", "app.jar"]
- Docker Compose obsługuje wszystkie komponenty mojego projektu
- port JMX nie będzie publicznie dostępny, dostęp do JMX zostanie ustanowiony przez przekierowanie portu SSH lub SOCKS Proxy.
Jak to skonfigurować...
- Włącz Funkcja JMX wewnątrz aplikacji, ustawiając następującą właściwość w aplikacji
application.properties
plik:spring.jmx.enabled=true
- W
Dockerfile
zdefiniować i udostępnić port JMX (w naszym przypadku 5000):EXPOSE 5000
- Wewnątrz
Dockerfile
definiują następujące elementyENV
oświadczenie:ENV JAVA_TOOL_OPTIONS "-Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.port=5000 \ -Dcom.sun.management.jmxremote.rmi.port=5000 \ -Dcom.sun.management.jmxremote.host=0.0.0.0 \ -Djava.rmi.server.hostname=0.0.0.0"
Trudną częścią jest przekazanie całej konfiguracji do zmiennej środowiskowej JAVA_TOOL_OPTIONS zamiast JAVA_OPTS.
- W swoim
docker-compose.yml
mapując port poprzez dodanie następującej linii w sekcji portów:ports: - 5000:5000
- Uruchom aplikację Spring Boot za pomocą polecenia:
docker-compose up -d
Jak go uruchomić...
Jak wspomniałem wcześniej, port 5000 nie jest publicznie dostępny w Internecie. Użyję proxy SOCKS, aby połączyć JConsole z moją aplikacją. Aby to zrobić, wykonaj następujące kroki:
- W konsoli uruchom poniższe polecenie SSH, aby ustanowić połączenie proxy SOCKS:
ssh -fN -D 7777 YOUR_HOST
- Uruchom konsolę JConsole z następującymi parametrami:
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 service:jmx:rmi:///jndi/rmi://localhost:5000/jmxrmi -J-DsocksNonProxyHosts=
Powinieneś być w stanie zobaczyć panel JConsole podobny do tego:
Podsumowanie
Spring Boot Actuator to potężne narzędzie do monitorowania i zarządzania aplikacją. Pomyśl dwa razy o bezpieczeństwie i nie wystawiaj wrażliwych punktów końcowych na działanie sieci publicznej.
Chcesz porozmawiać z naszymi ekspertami o rozwiązaniach technologicznych dla Twojej firmy?
P: Czym jest Spring Boot Actuator?
Spring Boot Actuator to moduł przeznaczony do audytu, kondycji i zbierania metryk w aplikacjach Spring Boot.
P: Jak mogę uzyskać dostęp do punktów końcowych Actuator?
Dostęp do punktów końcowych Actuator można uzyskać za pomocą protokołu HTTP lub rozszerzeń Java Management Extensions (JMX) i JConsole.