Verwenden von Java EE JCache mit Open Liberty oder WebSphere Liberty auf einem Azure Kubernetes Service (AKS)-Cluster

In diesem Artikel wird beschrieben, wie Sie Java EE JCache in einer containerisierten Anwendung verwenden, die in AKS bereitgestellt wird.

In diesem Leitfaden werden Sie:

  • Erstellen Sie die Infrastruktur, um Ihre Java-, Java EE-, Jakarta EE- oder MicroProfile-Anwendung auf der Open Liberty- oder WebSphere Liberty-Laufzeit auszuführen.
  • Verwenden Sie Java EE JCache, der von Azure Cache für Redis als Sitzungscache unterstützt wird.
  • Erstellen Sie das Docker-Image der Anwendung mithilfe von Open Liberty- oder WebSphere Liberty-Containerimages.
  • Stellen Sie die containerisierte Anwendung mithilfe des Open Liberty-Operators in einem AKS-Cluster bereit.

Dieser Artikel soll Ihnen helfen, schnell zur Bereitstellung zu gelangen. Bevor Sie in die Produktion gehen, sollten Sie Tuning Liberty erkunden.

Wenn Sie kein Azure-Abonnement besitzen, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.

Voraussetzungen

  • Verwenden Sie die Bash-Umgebung in Azure Cloud Shell. Weitere Informationen finden Sie unter Schnellstart für Bash in Azure Cloud Shell.

  • Wenn Sie CLI-Referenzbefehle lieber lokal ausführen, installieren Sie die Azure CLI. Wenn Sie Windows oder macOS ausführen, sollten Sie die Azure CLI in einem Docker-Container ausführen. Weitere Informationen finden Sie unter Ausführen der Azure CLI in einem Docker-Container.

    • Wenn Sie eine lokale Installation verwenden, melden Sie sich mithilfe des Befehls az login bei der Azure CLI an. Führen Sie die in Ihrem Terminal angezeigten Schritte aus, um den Authentifizierungsprozess abzuschließen. Informationen zu anderen Anmeldeoptionen finden Sie unter Anmelden mit der Azure CLI.

    • Installieren Sie die Azure CLI-Erweiterung beim ersten Einsatz, wenn Sie dazu aufgefordert werden. Weitere Informationen zu Erweiterungen finden Sie unter Verwenden von Erweiterungen mit der Azure CLI.

    • Führen Sie az version aus, um die installierte Version und die abhängigen Bibliotheken zu ermitteln. Führen Sie az upgrade aus, um das Upgrade auf die aktuelle Version durchzuführen.

  • Für diesen Artikel ist die aktuelle Azure CLI-Version erforderlich. Bei Verwendung von Azure Cloud Shell ist die aktuelle Version bereits installiert.
  • Wenn Sie die Befehle in diesem Handbuch lokal (anstelle von Azure Cloud Shell) ausführen:
    • Bereiten Sie einen lokalen Computer mit installiertem UNIX-ähnlichem Betriebssystem vor (z. B. Ubuntu, macOS, Windows-Subsystem für Linux).
    • Installieren einer Java SE-Implementierung, Version 17 oder höher (z. B . Eclipse Open J9)
    • Installieren Sie Maven 3.5.0 oder höher.
    • Installieren Sie Docker für Ihr Betriebssystem.
  • Stellen Sie sicher, dass Ihnen entweder Owner Rollen oder ContributorUser Access Administrator Rollen für das Abonnement zugewiesen wurden. Sie können Ihre Aufgaben überprüfen, indem Sie die Schritte in Listenrollenzuweisungen für einen Benutzer oder eine Gruppe ausführen.

Erstellen der Infrastruktur

Die Schritte in diesem Abschnitt führen Sie zum Erstellen der Anwendungsinfrastruktur in Azure. Nach Abschluss dieser Schritte verfügen Sie über eine Azure-Containerregistrierung, einen Azure Kubernetes-Dienstcluster und einen Azure Cache für Redis-Instanz zum Ausführen der Beispielanwendung.

Erstellen einer Ressourcengruppe

Eine Azure-Ressourcengruppe ist eine logische Gruppe, in der Azure-Ressourcen bereitgestellt und verwaltet werden.

Erstellen Sie am Standort eastus mithilfe des Befehls az group create die Ressourcengruppe java-liberty-project. Diese Ressourcengruppe wird zu einem späteren Zeitpunkt zum Erstellen der Azure Container Registry-Instanz (ACR) und des AKS-Clusters verwendet.

export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus

Erstellen einer ACR-Instanz

Verwenden Sie den Befehl az acr create zum Erstellen der ACR-Instanz. Im folgenden Beispiel wird die ACR-Instanz youruniqueacrname erstellt. Stellen Sie sicher, dass youruniqueacrname in Azure eindeutig ist.

export REGISTRY_NAME=youruniqueacrname
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic \
    --admin-enabled

Nach kurzer Zeit sollte eine JSON-Ausgabe mit Folgendem angezeigt werden:

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "java-liberty-project",

Alternativ können Sie eine Azure-Containerregistrierungsinstanz erstellen, indem Sie die Schritte in der Schnellstartanleitung ausführen: Erstellen einer Azure-Containerregistrierung mithilfe der Azure-Portal.

Herstellen einer Verbindung mit der ACR-Instanz

Sie müssen sich bei der ACR-Instanz anmelden, bevor Sie ein Bild an diese übertragen können. Führen Sie die folgenden Befehle zum Überprüfen der Verbindung aus:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'loginServer' \
    --output tsv)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'passwords[0].value' \
    --output tsv)

docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

Sie sollten am Ende der Befehlsausgabe angezeigt Login Succeeded werden, wenn Sie sich erfolgreich bei der ACR-Instanz angemeldet haben.

Wenn beim Anmelden bei der Azure-Containerregistrierung ein Problem auftritt, lesen Sie die Problembehandlung bei der Registrierungsanmeldung.

Erstellen eines AKS-Clusters

Verwenden Sie den Befehl "az aks create " zum Erstellen eines AKS-Clusters und erteilen Sie ihm die Bild-Pull-Berechtigung aus der ACR-Instanz. Im folgenden Beispiel wird ein Cluster mit dem Namen myAKSCluster mit einem Knoten erstellt. Dieser Befehl dauert mehrere Minuten, bis er abgeschlossen ist.

export CLUSTER_NAME=myAKSCluster
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --generate-ssh-keys \
    --enable-managed-identity \
    --attach-acr $REGISTRY_NAME

Nach ein paar Minuten wird der Befehl abgeschlossen und gibt JSON-formatierte Informationen zum Cluster zurück, einschließlich der folgenden Zeilen:

  "nodeResourceGroup": "MC_java-liberty-project_myAKSCluster_eastus",
  "privateFqdn": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "java-liberty-project",

Herstellen einer Verbindung mit dem AKS-Cluster

Verwenden Sie zum Verwalten eines Kubernetes-Clusters den Kubernetes-Befehlszeilenclient kubectl. Bei Verwendung von Azure Cloud Shell ist kubectl bereits installiert. Verwenden Sie für die lokale Installation von kubectl den Befehl az aks install-cli:

az aks install-cli

Mit dem Befehl az aks get-credentials können Sie kubectl für die Verbindungsherstellung mit Ihrem Kubernetes-Cluster konfigurieren. Mit diesem Befehl werden die Anmeldeinformationen heruntergeladen, und die Kubernetes-Befehlszeilenschnittstelle wird für deren Verwendung konfiguriert.

az aks get-credentials \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --overwrite-existing

Überprüfen Sie die Verbindung mit Ihrem Cluster mithilfe des Befehls kubectl get, um eine Liste der Clusterknoten zurückzugeben.

kubectl get nodes

Die folgende Beispielausgabe zeigt den in den vorherigen Schritten erstellten Knoten. Stellen Sie sicher, dass der Status des Knotens bereit ist.

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.18.10

Installieren von Open Liberty Operator

Nachdem Sie den Cluster erstellt und eine Verbindung damit hergestellt haben, installieren Sie den Open Liberty Operator durch Ausführung der folgenden Befehle.

# Install cert-manager Operator
CERT_MANAGER_VERSION=v1.11.2
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml

# Install Open Liberty Operator
export OPERATOR_VERSION=1.2.2
mkdir -p overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/olo-all-namespaces.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/cluster-roles.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/kustomization.yaml -q -P ./overlays/watch-all-namespaces
mkdir base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/kustomization.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-crd.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-operator.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-roles.yaml -q -P ./base
kubectl create namespace open-liberty
kubectl apply --server-side -k overlays/watch-all-namespaces

Erstellen einer Azure Cache for Redis-Instanz

Der Azure Cache für Redis sichert die Persistenz einer Java-Anwendung, die HttpSession in einem Open Liberty- oder WebSphere Liberty-Server ausgeführt wird. Führen Sie die Schritte in diesem Abschnitt aus, um einen Azure Cache für Redis-Instanz zu erstellen und die Verbindungsinformationen zu notieren. Wir verwenden diese Informationen später.

  1. Führen Sie die Schritte in der Schnellstartanleitung aus : Verwenden von Azure Cache für Redis in Java bis hin, aber nicht einschließlich Grundlegendes zum Java-Beispiel.

  2. Kopieren Sie Hostname und Primärzugriffsschlüssel für Ihren Azure-Cache für Redis-Instanz, und führen Sie dann die folgenden Befehle aus, um Umgebungsvariablen hinzuzufügen:

    export REDISCACHEHOSTNAME=<YOUR_HOST_NAME>
    export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
    

Erstellen der Anwendung

Führen Sie die Schritte in diesem Abschnitt aus, um die Beispielanwendung zu erstellen und zu containern. Diese Schritte verwenden Maven, liberty-maven-pluginund az acr Build. Weitere Informationen zu liberty-maven-plugin finden Sie unter Erstellen einer Webanwendung mit Maven.

Auschecken der Anwendung

Verwenden Sie die folgenden Befehle, um den Beispielcode für dieses Handbuch zu klonen. Das Beispiel befindet sich im Open-liberty-on-aks-Repository auf GitHub. Es gibt ein paar Beispiele im Repository. In diesem Artikel wird java-app-jcache verwendet.

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20230906

Wenn eine Meldung angezeigt wird, dass Sie sich im Status „detached HEAD“ befinden, können Sie diese Meldung problemlos ignorieren. Sie bedeutet nur, dass Sie ein Tag ausgecheckt haben.

Die Anwendung weist die folgende Dateistruktur auf:

java-app-jcache/
├── pom.xml
└── src
    └── main
        ├── aks
        │   └── openlibertyapplication.yaml
        ├── docker
        │   ├── Dockerfile
        │   └── Dockerfile-wlp
        ├── java
        ├── liberty
        │   └── config
        │       └── server.xml
        ├── redisson
        │   └── redisson-config.yaml
        ├── resources
        └── webapp

Die Java-, Ressourcen- und Webappverzeichnisse enthalten den Quellcode der Beispielanwendung.

Im aks-Verzeichnis wird die Bereitstellungsdatei openlibertyapplication.yaml verwendet, um das Anwendungsimage bereitzustellen.

Im Docker-Verzeichnis platzieren wir zwei Dockerfiles. Dockerfile wird verwendet, um Image mit Open Liberty und Dockerfile-wlp zu erstellen, um Image mit WebSphere Liberty zu erstellen.

Im Verzeichnis "liberty/config" wird die server.xml Datei verwendet, um den Sitzungscache für den Open Liberty- und WebSphere Liberty-Cluster zu konfigurieren.

Im Redisson-Verzeichnis wird die Datei "redisson-config.yaml" verwendet, um die Verbindung der Azure Cache für Redis-Instanz zu konfigurieren.

Packen der Anwendung in Container

Um Ihre Liberty-Anwendung im AKS-Cluster bereitzustellen und auszuführen, führen Sie die folgenden Schritte aus, um Ihre Anwendung als Docker-Image zu containern. Sie können Open Liberty-Containerimages oder WebSphere Liberty-Containerimages verwenden.

  1. Ändern Sie das Verzeichnis in "java-app-jcache " Ihres lokalen Klons.

  2. Führen Sie mvn clean package zum Verpacken der Anwendung aus.

  3. Führen Sie den Befehl mvn -Predisson validate aus, um die Redisson-Konfigurationsdatei an den angegebenen Speicherort zu kopieren. In diesem Schritt werden die Werte der Umgebungsvariablen REDISCACHEHOSTNAME und REDISCACHEKEY in die Datei "redisson-config.yaml " eingefügt, auf die von der datei server.xml verwiesen wird.

  4. Führen Sie zum Testen der Anwendung mvn liberty:dev aus. Wenn der Test erfolgreich ist, sollten Sie in der Befehlsausgabe sehen The defaultServer server is ready to run a smarter planet. . Die Ausgabe sollte etwa wie folgt angezeigt werden, wenn die Redis-Verbindung erfolgreich ist.

    [INFO] [err] [Default Executor-thread-5] INFO org.redisson.Version - Redisson 3.16.7
    [INFO] [err] [redisson-netty-2-2] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    [INFO] [err] [redisson-netty-2-20] INFO org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    
  5. Sie können besuchen http://localhost:9080/ , um die Anwendung zu sehen, die ausgeführt wird, aber der Nachweis der Redis-Arbeit ist die Ausgabe, die im vorherigen Schritt aufgeführt ist.

  6. Verwenden Sie STRG+C, um die Anwendung zu beenden.

  7. Verwenden Sie die folgenden Befehle, um Werte für Eigenschaften artifactId abzurufen und version in der datei pom.xml definiert.

    export artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec)
    export version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
    
  8. Führen Sie cd target aus, um das Verzeichnis in den Build des Beispiels zu ändern.

  9. Führen Sie einen der folgenden Befehle aus, um das Anwendungsimage zu erstellen und es an die ACR-Instanz zu pushen.

    • Verwenden Sie den folgenden Befehl, um mit einem Open Liberty-Basisimage zu erstellen, wenn Sie Open Liberty als einfache Open-Source-Java-Runtime™ verwenden möchten:

      # Build and tag application image. This will cause the ACR instance to pull the necessary Open Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME .
      
    • Verwenden Sie den folgenden Befehl, um mit einem WebSphere Liberty-Basisimage zu erstellen, wenn Sie eine kommerzielle Version von Open Liberty verwenden möchten:

      # Build and tag application image. This will cause the ACR instance to pull the necessary WebSphere Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME --file=Dockerfile-wlp .
      

Bereitstellen der Anwendung

Führen Sie die Schritte in diesem Abschnitt aus, um die containerisierte Beispielanwendung im AKS-Cluster bereitzustellen.

  1. Überprüfen Sie, ob das aktuelle Arbeitsverzeichnis java-app-jcache/target in Ihrem lokalen Klon ist.

  2. Verwenden Sie die folgenden Befehle, um einen geheimen Schlüssel mit Redisson-Konfigurationsinformationen zu erstellen. Mit diesem geheimen Schlüssel kann die Anwendung eine Verbindung mit dem erstellten Azure-Cache für Redis-Instanz herstellen.

    export REDISSON_CONFIG_SECRET_NAME=redisson-config-secret
    kubectl create secret generic ${REDISSON_CONFIG_SECRET_NAME} --from-file=$(pwd)/liberty/wlp/usr/servers/defaultServer/redisson-config.yaml
    
  3. Verwenden Sie die folgenden Befehle, um Ihre Liberty-Anwendung mit drei Replikaten im AKS-Cluster bereitzustellen. Die Befehlsausgabe wird auch inline angezeigt.

    # Set number of application replicas
    export REPLICAS=3
    
    # Create OpenLibertyApplication "javaee-cafe-jcache-cluster"
    envsubst < openlibertyapplication.yaml | kubectl create -f -
    
    openlibertyapplication.openliberty.io/javaee-cafe-jcache-cluster created
    
    # Check if OpenLibertyApplication instance is created
    kubectl get openlibertyapplication ${artifactId}-cluster
    
    NAME                               IMAGE                                                         EXPOSED      RECONCILED   AGE
    javaee-cafe-jcache-cluster         youruniqueacrname.azurecr.io/javaee-cafe-jcache:1.0.0                      True         59s
    
    # Check if deployment created by Operator is ready
    kubectl get deployment ${artifactId}-cluster --watch
    
    NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-jcache-cluster         0/3     3            0           20s
    
  4. Warten Sie, bis sie unter der READY Spalte und 3 unter der AVAILABLE Spalte angezeigt wird3/3, und verwenden Sie dann STRG+C, um den kubectl Überwachungsvorgang zu beenden.

Testen der Anwendung

Wenn die Anwendung ausgeführt wird, macht ein Kubernetes-Lastenausgleichsdienst das Anwendungs-Front-End im Internet verfügbar. Es kann eine Weile dauern, bis dieser Vorgang abgeschlossen ist.

Verwenden Sie zum Überwachen des Fortschritts den Befehl kubectl get service mit dem Argument --watch.

kubectl get service ${artifactId}-cluster --watch

NAME                               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
javaee-cafe-jcache-cluster         LoadBalancer   10.0.50.29     20.84.16.169    80:31732/TCP     68s

Sobald sich die EXTERNE-IP-Adresse von einer tatsächlichen öffentlichen IP-Adresse ändert, verwenden Sie STRG+C, um den kubectl Überwachungsvorgang zu beenden.

Öffnen Sie einen Webbrowser für die externe IP-Adresse Ihres Diensts (20.84.16.169 für das vorstehende Beispiel), um die Startseite der Anwendung anzuzeigen. Wenn die Seite nicht ordnungsgemäß geladen wird, liegt dies daran, dass die App gestartet wird. Sie können eine Weile warten und die Seite später aktualisieren. Der Podname Ihrer Anwendungsreplikate sollte oben links auf der Seite angezeigt werden (javaee-cafe-jcache-cluster-77d54bccd4-5xnzx für diesen Fall).

Screenshot der Java Liberty-Anwendung, die erfolgreich auf A K S bereitgestellt wurde.

Legen Sie in der Sitzung "Neuer Kaffee" Werte für felder "Name" und "Preis" fest, und wählen Sie dann "Absenden" aus. Nach ein paar Sekunden wird die Anzahl "Absenden" angezeigt: 1 wird unten auf der Seite angezeigt.

Screenshot der Beispielanwendung, in der neue Kaffee erstellt und in der Sitzung der Anwendung beibehalten wird.

Um zu veranschaulichen, dass der Sitzungscache in allen Replikaten der Anwendung beibehalten wird, führen Sie den folgenden Befehl aus, um das aktuelle Replikat mit dem Podnamen javaee-cafe-jcache-cluster-<pod id from your running app>zu löschen:

kubectl delete pod javaee-cafe-jcache-cluster-77d54bccd4-5xnzx

pod "javaee-cafe-jcache-cluster-77d54bccd4-5xnzx" deleted

Aktualisieren Sie dann die Startseite der Anwendung. Die gleichen Daten werden im Abschnitt "Neuer Kaffee" in der Sitzung angezeigt, aber ein anderer Podname wird oben links auf der Seite angezeigt.

Führen Sie schließlich die folgenden Schritte aus, um zu veranschaulichen, dass die Sitzungsdaten in der Azure Cache für Redis-Instanz beibehalten werden. Sie können Befehle in Ihrem Azure Cache für Redis-Instanz mithilfe der Redis-Konsole ausstellen.

  1. Suchen Sie Ihren Azure-Cache für Redis-Instanz aus dem Azure-Portal.

  2. Wählen Sie "Konsole" aus, um die Redis-Konsole zu öffnen.

  3. Führen Sie die folgenden Befehle aus, um die Sitzungsdaten anzuzeigen:

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. Suchen Sie auf der Webseite nach café.model.entity.Coffee[id=1, name=Coffee 3, price=30.0] von der Webseite, die Sie erstellt haben und im Azure Cache für Redis-Instanz beibehalten haben.

Bereinigen von Ressourcen

Zum Vermeiden von Azure-Gebühren sollten Sie nicht benötigte Ressourcen bereinigen. Wenn der Cluster nicht mehr benötigt wird, entfernen Sie mit dem Befehl az group delete die Ressourcengruppe, den Containerdienst, die Containerregistrierung und alle zugehörigen Ressourcen.

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Um den Azure-Cache für Redis-Instanz zu löschen, suchen Sie den Namen der Ressourcengruppe, und führen Sie den folgenden Befehl aus:

az group delete --name <AZURE_CACHE_FOR_REDIS_RESOURCE_GROUP_NAME> --yes --no-wait

Nächste Schritte

Weitere Informationen finden Sie über die in diesem Handbuch verwendeten Verweise: