Aller au contenu

Générer rapidement un backend en Java

Générer un projet Spring Boot avec Spring Initializer

Se rendre sur https://start.spring.io/.

Créer une image Docker

Pour créer une image Docker compatible avec une application Spring, il faut surchargé l'image principale de gradle pour pouvoir générer le livrable et ensuite le copié et utilisé l'image du JDK GraalVM pour le runtime.

FROM gradle:8.1.1-jdk17-alpine AS build
COPY --chown=gradle:gradle . /home/gradle/src
WORKDIR /home/gradle/src
RUN gradle build --no-daemon

FROM ghcr.io/graalvm/jdk-community:17-ol9

EXPOSE 8080

COPY --from=build /home/gradle/src/build/libs/*.jar spring-boot-application.jar

ENTRYPOINT ["java", "-XX:+UnlockExperimentalVMOptions", "-Djava.security.egd=file:/dev/./urandom","-jar","spring-boot-application.jar"]

Déployer un backend en Spring Boot sur AWS

WIP

Faire un heap dump d'un container light java déployé sur k8s

On utilise l'utilitaire jcmd packagé avec tout openjdk.

Quand on a très peu d'outils à disposition on devient créatif. Pour copier des fichiers vers l'extérieur il faut avoir le binaire tar d'installé dans le container pour pouvoir executer la commande kubectl cp <source> <desitination>.

Quand il n'est pas installer, on peut toujours utiliser la sortie standard et piper ça dans un fichier. On encode en base64 pour éviter de corrompre le fichier avec un mauvais affichage.

kubectl exec <pod> -- bash -c "jcmd 1 GC.run" # Pour clean avant de record la mémoire
sleep 10
kubectl exec <pod> -- bash -c "jcmd 1 GC.heap_dump filename=/tmp/dump.hprof"
kubectl exec <pod> -- bash -c "base64 /tmp/dump.hprof > /tmp/dump64.hprof"
kubectl exec <pod> -- bash -c "cat /tmp/dump64.hprof" | base64 -d > ~/dump.hprof

Il ne vous reste plus qu'à le loader dans VisualVM ou JProfiler.

Faire un recording JFR d'un container light java déployé sur k8s

Même process pour le transfert de fichier, il n'y a que la commande qui change.

kubectl exec <pod> -- bash -c "jcmd 1 JFR.start duration=1h delay=5s filename=/tmp/recording.jfr"
# Maintenant on fait nos opérations pendant une heure
kubectl exec <pod> -- bash -c "base64 /tmp/recording.jfr > /tmp/recording64.jfr"
kubectl exec <pod> -- bash -c "cat /tmp/recording64.jfr" | base64 -d > ~/recording.jfr

Et ensuite on le load dans VisualVM ou JProfiler.