Java EE JCache gebruiken met Open Liberty of WebSphere Liberty in een AKS-cluster (Azure Kubernetes Service)

In dit artikel wordt beschreven hoe u Java EE JCache gebruikt in een containertoepassing die is geïmplementeerd in AKS.

In deze handleiding gaat u het volgende doen:

  • Maak de infrastructuur voor het uitvoeren van uw Java-, Java EE-, Jakarta EE- of MicroProfile-toepassing op de Open Liberty- of WebSphere Liberty-runtime.
  • Gebruik Java EE JCache ondersteund door Azure Cache voor Redis als sessiecache.
  • Bouw de Docker-toepassingsinstallatiekopieën met behulp van Open Liberty- of WebSphere Liberty-containerinstallatiekopieën.
  • Implementeer de containertoepassing in een AKS-cluster met behulp van de Open Liberty Operator.

Dit artikel is bedoeld om u snel te helpen bij de implementatie. Voordat u naar productie gaat, moet u Tuning Liberty verkennen.

Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint.

Vereisten

  • Voor dit artikel is de nieuwste versie van de Azure CLI vereist. Als u Azure Cloud Shell gebruikt, is de nieuwste versie al geïnstalleerd.
  • Als u de opdrachten in deze handleiding lokaal uitvoert (in plaats van Azure Cloud Shell):
    • Bereid een lokale computer voor waarop unix-achtig besturingssysteem is geïnstalleerd (bijvoorbeeld Ubuntu, macOS, Windows-subsysteem voor Linux).
    • Installeer een Java SE-implementatie, versie 17 of hoger (bijvoorbeeld Eclipse Open J9).
    • Installeer Maven 3.5.0 of hoger.
    • Installeer Docker voor uw besturingssysteem.
  • Zorg ervoor dat u een rol of ContributorUser Access Administrator rollen voor het abonnement hebt toegewezenOwner. U kunt uw toewijzingen controleren door de stappen te volgen in Roltoewijzingen weergeven voor een gebruiker of groep.

De infrastructuur maken

De stappen in deze sectie helpen u bij het maken van de toepassingsinfrastructuur in Azure. Nadat u deze stappen hebt voltooid, hebt u een Azure Container Registry, een Azure Kubernetes Service-cluster en een Azure Cache voor Redis exemplaar voor het uitvoeren van de voorbeeldtoepassing.

Een brongroep maken

Een Azure-resourcegroep is een logische groep waarin Azure-resources worden geïmplementeerd en beheerd.

Maak een resourcegroep met de naam java-liberty-project met behulp van de opdracht az group create in de locatie eastus. Deze resourcegroep wordt later gebruikt voor het maken van het ACR-exemplaar (Azure Container Registry) en het AKS-cluster.

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

Een ACR-exemplaar maken

Gebruik de opdracht az acr create om het ACR-exemplaar te maken. In het volgende voorbeeld wordt een ACR-exemplaar gemaakt met de naam youruniqueacrname. Zorg ervoor dat uwuniqueacrname uniek is binnen Azure.

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

Na korte tijd ziet u een JSON-uitvoer die het volgende bevat:

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

U kunt ook een exemplaar van een Azure-containerregister maken door de stappen in quickstart te volgen: Een Azure-containerregister maken met behulp van Azure Portal.

Verbinding maken naar het ACR-exemplaar

U moet zich aanmelden bij het ACR-exemplaar voordat u een installatiekopieën naar het exemplaar kunt pushen. Voer de volgende opdrachten uit om de verbinding te controleren:

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

Als u zich bij het ACR-exemplaar hebt aangemeld, ziet Login Succeeded u aan het einde van de opdrachtuitvoer.

Als u een probleem ondervindt bij het aanmelden bij het Azure-containerregister, raadpleegt u Aanmelding bij register oplossen.

Een AKS-cluster maken

Gebruik de opdracht az aks create om een AKS-cluster te maken en de pull-machtiging voor de installatiekopie van het ACR-exemplaar te verlenen. In het volgende voorbeeld wordt een cluster met de naam myAKSCluster gemaakt met één knooppunt. Het voltooien van deze opdracht duurt enkele minuten.

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

Na enkele minuten wordt de opdracht voltooid en retourneert JSON-geformatteerde informatie over het cluster, met inbegrip van de volgende regels:

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

Verbinding maken naar het AKS-cluster

Als u een Kubernetes-cluster wilt beheren, gebruikt u kubectl, de Kubernetes-opdrachtregelclient. Als u Azure Cloud Shell gebruikt, is kubectl al geïnstalleerd. Als u kubectl lokaal wilt installeren, gebruikt u de opdracht az aks install-cli:

az aks install-cli

Gebruik de opdracht az aks get-credentials om kubectl zodanig te configureren dat er verbinding wordt gemaakt met het Kubernetes-cluster. Bij deze opdracht worden referenties gedownload en wordt Kubernetes CLI geconfigureerd voor het gebruik van deze referenties.

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

Als u de verbinding met uw cluster wilt controleren, gebruikt u de opdracht kubectl get om een lijst met clusterknooppunten te retourneren.

kubectl get nodes

In de volgende voorbeelduitvoer ziet u het enkele knooppunt dat is gemaakt in de vorige stappen. Zorg ervoor dat de status van het knooppunt gereed is.

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

Open Liberty Operator installeren

Nadat u het cluster hebt gemaakt en er verbinding mee hebt gemaakt, installeert u de Open Liberty Operator door de volgende opdrachten uit te voeren.

# 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

Een instantie van Azure Cache voor Redis maken

Azure Cache voor Redis de persistentie van de HttpSession voor een Java-toepassing die wordt uitgevoerd op een Open Liberty- of WebSphere Liberty-server, wordt teruggezet. Volg de stappen in deze sectie om een Azure Cache voor Redis exemplaar te maken en noteer de verbindingsgegevens. We gebruiken deze informatie later.

  1. Volg de stappen in de quickstart: Gebruik Azure Cache voor Redis in Java tot, maar niet inclusief Inzicht in het Java-voorbeeld.

  2. Kopieer hostnaam en primaire toegangssleutel voor uw Azure Cache voor Redis exemplaar en voer vervolgens de volgende opdrachten uit om omgevingsvariabelen toe te voegen:

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

De toepassing bouwen

Volg de stappen in deze sectie om de voorbeeldtoepassing te bouwen en in een container te plaatsen. In deze stappen wordt Maven, liberty-maven-pluginen az acr build gebruikt. Zie Een webtoepassing bouwen met Maven voor meer informatie over de liberty-maven-pluginwebtoepassing.

De toepassing uitchecken

Gebruik de volgende opdrachten om de voorbeeldcode voor deze handleiding te klonen. Het voorbeeld bevindt zich in de opslagplaats open-liberty-on-aks op GitHub. Er zijn enkele voorbeelden in de opslagplaats. In dit artikel wordt java-app-jcache gebruikt.

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

Als u een bericht ziet over 'losgekoppelde HEAD'-status, is dit bericht veilig te negeren. Het betekent alleen dat je een tag hebt uitgecheckt.

De toepassing heeft de volgende bestandsstructuur:

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

De java-, resources- en webapp-mappen bevatten de broncode van de voorbeeldtoepassing.

In de aks-map wordt het implementatiebestand openlibertyapplication.yaml gebruikt om de toepassingsinstallatiekopie te implementeren.

In de docker-map plaatsen we twee Dockerfiles. Dockerfile wordt gebruikt voor het bouwen van installatiekopieën met Open Liberty en Dockerfile-wlp wordt gebruikt voor het bouwen van installatiekopieën met WebSphere Liberty.

In de map liberty/config wordt het bestand server.xml gebruikt voor het configureren van de sessiecache voor het Open Liberty- en WebSphere Liberty-cluster.

In de redisson-map wordt het bestand redisson-config.yaml gebruikt om de verbinding van het Azure Cache voor Redis exemplaar te configureren.

De toepassing in een container plaatsen

Als u uw Liberty-toepassing wilt implementeren en uitvoeren op het AKS-cluster, gebruikt u de volgende stappen om uw toepassing als docker-installatiekopieën te containeriseren. U kunt Open Liberty-containerinstallatiekopieën of WebSphere Liberty-containerinstallatiekopieën gebruiken.

  1. Wijzig de map in java-app-jcache van uw lokale kloon.

  2. Voer mvn clean package uit om de toepassing te verpakken.

  3. Voer deze opdracht mvn -Predisson validate uit om het Redisson-configuratiebestand naar de opgegeven locatie te kopiëren. Met deze stap worden de waarden van de omgevingsvariabelen ingevoegd en REDISCACHEKEY in het bestand redisson-config.yaml waarnaar wordt verwezen door het bestand server.xml.REDISCACHEHOSTNAME

  4. Voer deze opdracht uit mvn liberty:dev om de toepassing te testen. Als de test is geslaagd, ziet The defaultServer server is ready to run a smarter planet. u in de uitvoer van de opdracht. Als de Redis-verbinding is geslaagd, ziet u uitvoer die er ongeveer als volgt uitziet.

    [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. U kunt de http://localhost:9080/ toepassing bekijken die wordt uitgevoerd, maar het bewijs dat Redis werkt, is de uitvoer die in de vorige stap wordt vermeld.

  6. Gebruik Ctrl+C om de toepassing te stoppen.

  7. Gebruik de volgende opdrachten om waarden op te halen voor eigenschappen artifactId en version gedefinieerd in het pom.xml-bestand .

    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. Voer deze cd target opdracht uit om de map te wijzigen in de build van het voorbeeld.

  9. Voer een van de volgende opdrachten uit om de installatiekopieën van de toepassing te bouwen en deze naar het ACR-exemplaar te pushen.

    • Gebruik de volgende opdracht om te bouwen met een Open Liberty-basisinstallatiekopieën als u Open Liberty liever gebruikt als een lichtgewicht opensource Java-runtime™:

      # 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 .
      
    • Gebruik de volgende opdracht om te bouwen met een WebSphere Liberty-basisinstallatiekopieën als u liever een commerciële versie van Open Liberty gebruikt:

      # 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 .
      

De toepassing implementeren

Volg de stappen in deze sectie om de voorbeeldtoepassing in een container te implementeren op het AKS-cluster.

  1. Controleer of de huidige werkmap java-app-jcache/target is in uw lokale kloon.

  2. Gebruik de volgende opdrachten om een geheim te maken met redisson-configuratiegegevens. Met dit geheim kan de toepassing verbinding maken met het gemaakte Azure Cache voor Redis exemplaar.

    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. Gebruik de volgende opdrachten om uw Liberty-toepassing met drie replica's te implementeren in het AKS-cluster. De uitvoer van de opdracht wordt ook inline weergegeven.

    # 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. Wacht totdat u onder de READY kolom en 3 onder de AVAILABLE kolom ziet 3/3 en gebruik vervolgens Ctrl+C om het kubectl controleproces te stoppen.

De toepassing testen

Wanneer de toepassing wordt uitgevoerd, maakt een Kubernetes Load Balancer-service de front-end van de toepassing beschikbaar op internet. Dit proces kan enige tijd duren.

Gebruik de opdracht kubectl get service met het argument --watch om de voortgang te controleren.

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

Zodra het EXTERNAL-IP-adres is gewijzigd van in behandeling tot een daadwerkelijk openbaar IP-adres, gebruikt u Ctrl+C om het kubectl controleproces te stoppen.

Open een webbrowser naar het externe IP-adres van uw service (20.84.16.169 voor het bovenstaande voorbeeld) om de startpagina van de toepassing weer te geven. Als de pagina niet correct is geladen, komt dat doordat de app wordt gestart. U kunt even wachten en de pagina later vernieuwen. U ziet nu de podnaam van uw toepassingsreplica's in de linkerbovenhoek van de pagina (javaee-cafe-jcache-cluster-77d54bccd4-5xnzx voor dit geval).

Screenshot of Java liberty application successfully deployed on A K S.

Stel in het formulier Nieuwe koffie in sessie waarden in voor de velden Naam en Prijs en selecteer Vervolgens Verzenden. Na een paar seconden ziet u het aantal verzenden: 1 wordt linksonder op de pagina weergegeven.

Screenshot of sample application showing new coffee created and persisted in the session of the application.

Voer de volgende opdracht uit om de huidige replica met de naam van de pod javaee-cafe-jcache-cluster-<pod id from your running app>te verwijderen om te laten zien dat de sessiecache behouden blijft op alle replica's van de toepassing:

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

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

Vernieuw vervolgens de startpagina van de toepassing. U ziet dezelfde gegevens die worden weergegeven in de sectie Nieuwe koffie in sessie , maar er wordt een andere podnaam weergegeven in de linkerbovenhoek van de pagina.

Gebruik ten slotte de volgende stappen om aan te tonen dat de sessiegegevens in het Azure Cache voor Redis exemplaar worden bewaard. U kunt opdrachten aan uw Azure Cache voor Redis exemplaar uitgeven met behulp van de Redis-console.

  1. Zoek uw Azure Cache voor Redis exemplaar vanuit Azure Portal.

  2. Selecteer Console om de Redis-console te openen.

  3. Voer de volgende opdrachten uit om de sessiegegevens weer te geven:

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. Zoek naar café.model.entity.Coffee[id=1, name=Coffee 3, price=30.0] op de webpagina. Dit is de koffie die u hebt gemaakt en bewaard in het Azure Cache voor Redis exemplaar.

Resources opschonen

Om Azure-kosten te voorkomen, moet u overbodige resources opschonen. Wanneer het cluster niet meer nodig is, gebruikt u de opdracht az group delete om de resourcegroep, de containerservice, het containerregister en alle gerelateerde resources te verwijderen.

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

Als u het Azure Cache voor Redis exemplaar wilt verwijderen, zoekt u de naam van de resourcegroep en voert u de volgende opdracht uit:

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

Volgende stappen

In deze handleiding vindt u meer informatie over verwijzingen die worden gebruikt: