Tomcat-toepassingen migreren naar Azure Container Apps

In deze handleiding wordt beschreven waar u rekening mee moet houden wanneer u een bestaande Tomcat-toepassing wilt migreren die moet worden uitgevoerd in Azure Container Apps (ACA).

Premigratie

Voltooi voordat u begint de evaluatie- en inventarisstappen die in de volgende secties worden beschreven om een geslaagde migratie te garanderen.

Externe resources inventariseren

Externe resources, zoals gegevensbronnen, JMS-berichtenbrokers en andere resources, worden ingevoerd via Java Naming and Directory Interface (JNDI). Voor sommige resources kan migratie of herconfiguratie vereist zijn.

Binnen uw toepassing

Inspecteer het bestand META-INF/context.xml. Zoek naar <Resource>-elementen in het <Context>-element.

Op de toepassingsserver(s)

Inspecteer de bestanden $CATALINA_BASE/conf/context.xml en $CATALINA_BASE/conf/server.xml, evenals de .xml-bestanden die zich bevinden in de mappen $CATALINA_BASE/conf/[engine-name]/[host-name].

In context.xml-bestanden worden JNDI-resources beschreven door de <Resource>-elementen binnen het <Context>-element op het hoogste niveau.

In server.xml-bestanden worden JNDI-resources beschreven door de <Resource>-elementen binnen het <GlobalNamingResources>-element.

Gegevensbronnen

Gegevensbronnen zijn JNDI-resources waarvoor het kenmerk type is ingesteld op javax.sql.DataSource. Documenteer voor elke gegevensbron de volgende informatie:

  • Wat is de naam van de gegevensbron?
  • Wat is de configuratie van de verbindingsgroep?
  • Waar vind ik het JAR-bestand van het JDBC-stuurprogramma?

Raadpleeg JNDI Datasource HOW-TO in de Tomcat-documentatie.

Alle andere externe resources

Het is niet haalbaar om alle mogelijke externe afhankelijkheden in deze handleiding te documenteren. Het is de verantwoordelijkheid van uw team om alle externe afhankelijkheden van uw toepassing te verifiëren na de migratie.

Geheimen inventariseren

Wachtwoorden en beveiligde tekenreeksen

Controleer alle eigenschaps- en configuratiebestanden op de productieserver(s) op geheime tekenreeksen en wachtwoorden. Controleer in elk geval server.xml en context.xml in $CATALINA_BASE/conf. U kunt ook configuratiebestanden met wachtwoorden of referenties in uw toepassing aantreffen. Het kan gaan om de bestanden META-INF/context.xml en, voor Spring Boot-toepassingen, application.properties of application.yml.

Nagaan of en hoe het bestandssysteem wordt gebruikt

Voor het gebruik van het bestandssysteem op de toepassingsserver is herconfiguratie vereist of zijn in zeldzame gevallen architectuurwijzigingen vereist. U kunt enkele of elk van de volgende scenario's identificeren.

Statische alleen-lezeninhoud

Als uw toepassing momenteel met statische inhoud werkt, hebt u hiervoor een alternatieve locatie nodig. U kunt statische inhoud verplaatsen naar Azure Blob Storage en Azure CDN toevoegen voor razendsnelle downloads wereldwijd. Zie statische websitehosting in Azure Storage en quickstart: Een Azure-opslagaccount integreren met Azure CDN voor meer informatie. U kunt de statische inhoud ook rechtstreeks implementeren in een app in het Azure Spring Apps Enterprise-abonnement. Zie Statische webbestanden implementeren voor meer informatie.

Dynamisch gepubliceerde statische inhoud

Als uw toepassing statische inhoud toestaat die wordt geüpload/geproduceerd door uw toepassing, maar onveranderbaar is nadat deze is gemaakt, kunt u Azure Blob Storage en Azure CDN gebruiken zoals hierboven beschreven, met een Azure-functie om uploads en CDN-vernieuwing te verwerken. U vindt een voorbeeldimplementatie voor gebruik in Statische inhoud uploaden en via CDN vooraf laden met Azure Functions. U kunt de statische inhoud ook rechtstreeks implementeren in een app in het Azure Spring Apps Enterprise-abonnement. Zie Statische webbestanden implementeren voor meer informatie.

Methode voor de sessiepersistentie bepalen

Controleer de context.xml-bestanden in uw toepassing en Tomcat-configuratie om te bepalen welk sessiepersistentiebeheer wordt gebruikt. Ga naar het element <Manager> en noteer de waarde van het kenmerk className.

De ingebouwde PersistentManager-implementaties van Tomcat, zoals StandardManager of FileStore, zijn niet ontworpen voor gebruik met een gedistribueerd, geschaald platform zoals ACA. ACA kan een taakverdeling tussen verschillende exemplaren uitvoeren en elk exemplaar op elk gewenst moment transparant opnieuw opstarten, zodat de onveranderbare status van een bestandssysteem niet wordt aanbevolen.

Als sessiepersistentie vereist is, moet u een alternatieve PersistentManager implementatie gebruiken die naar een extern gegevensarchief schrijft, zoals VMware Tanzu Session Manager met Redis Cache.

Speciale gevallen

Voor bepaalde productiescenario's zijn mogelijk meer wijzigingen vereist of worden er meer beperkingen opgelegd. Hoewel dergelijke scenario's incidenteel kunnen zijn, is het belangrijk om ervoor te zorgen dat deze niet van toepassing zijn op uw toepassing of correct zijn opgelost.

Bepalen of de toepassing gebruikmaakt van geplande taken

Geplande taken, zoals Quartz Scheduler-taken of Cron-taken, kunnen niet worden gebruikt met in containers geplaatste Tomcat-implementaties. Als uw toepassing wordt uitgeschaald, kan één geplande taak meer dan één keer per geplande periode worden uitgevoerd. Deze situatie kan tot onbedoelde gevolgen leiden.

Maak een inventaris van de geplande taken binnen of buiten de toepassingsserver.

Bepalen of uw toepassing code bevat die specifiek is voor het besturingssysteem

Als uw toepassing code bevat met afhankelijkheden van het hostbesturingssysteem, moet u de toepassing herstructureren om die afhankelijkheden te verwijderen. Zo moet u mogelijk de / of \ vervangen in bestandssysteempaden met File.Separator of Paths.get.

Bepalen of MemoryRealm wordt gebruikt

Voor MemoryRealm is een persistent XML-bestand vereist. In ACA moet u dit bestand toevoegen aan de containerinstallatiekopieën of uploaden naar gedeelde opslag die beschikbaar wordt gesteld aan containers. (Zie voor meer informatie de Sectie sessiepersistentiemechanisme identificeren.) De pathName parameter moet dienovereenkomstig worden gewijzigd.

Als u wilt bepalen of MemoryRealm op het huidige moment wordt gebruikt, controleert u de bestanden server.xml en context.xml en zoekt u naar <Realm>-elementen waarbij het kenmerk className is ingesteld op org.apache.catalina.realm.MemoryRealm.

In-place tests

Voordat u containerinstallatiekopieën maakt, migreert u uw toepassing naar de JDK en Tomcat die u op ACA wilt gebruiken. Test uw toepassing grondig op compatibiliteit en prestaties.

De configuratie parameteriseren

In de fase voorafgaand aan de migratie hebt u waarschijnlijk de geheimen en externe afhankelijkheden geïdentificeerd, zoals gegevensbronnen, in de bestanden server.xml en context.xml. Vervang voor elk item dat als zodanig is geïdentificeerd de gebruikersnaam, het wachtwoord, de verbindingsreeks of URL door een omgevingsvariabele.

Stel bijvoorbeeld dat het bestand context.xml het volgende element bevat:

<Resource
    name="jdbc/dbconnection"
    type="javax.sql.DataSource"
    url="jdbc:postgresql://postgresdb.contoso.com/wickedsecret?ssl=true"
    driverClassName="org.postgresql.Driver"
    username="postgres"
    password="t00secure2gue$$"
/>

In dat geval kunt u dit wijzigen zoals wordt weergegeven in het volgende voorbeeld:

<Resource
    name="jdbc/dbconnection"
    type="javax.sql.DataSource"
    url="${postgresdb.connectionString}"
    driverClassName="org.postgresql.Driver"
    username="${postgresdb.username}"
    password="${postgresdb.password}"
/>

Migratie

Notitie

In sommige Tomcat-implementaties worden mogelijk meerdere toepassingen uitgevoerd op één Tomcat-server. Als dit het geval is in uw implementatie, wordt het ten zeerste aanbevolen elke toepassing uit te voeren in een afzonderlijke pod. Zo kunt u het resourcegebruik voor elke toepassing optimaliseren en tegelijkertijd de complexiteit en koppeling minimaliseren.

De implementatieartefacten voorbereiden

Kloon de Tomcat on Containers Quickstart GitHub-opslagplaats. Deze opslagplaats bevat een Dockerfile- en Tomcat-configuratiebestanden met veel aanbevolen optimalisaties. In de onderstaande stappen worden wijzigingen beschreven die u waarschijnlijk moet aanbrengen in deze bestanden voordat u de containerinstallatiekopieën bouwt en implementeert in ACA.

JNDI-resources toevoegen

Bewerk server.xml om de resources toe te voegen die u hebt voorbereid in de stappen vóór de migratie, zoals gegevensbronnen, zoals wordt weergegeven in het volgende voorbeeld:

<!-- Global JNDI resources
      Documentation at /docs/jndi-resources-howto.html
-->
<GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml"
               />

    <!-- Migrated datasources here: -->
    <Resource
        name="jdbc/dbconnection"
        type="javax.sql.DataSource"
        url="${postgresdb.connectionString}"
        driverClassName="org.postgresql.Driver"
        username="${postgresdb.username}"
        password="${postgresdb.password}"
    />
    <!-- End of migrated datasources -->
</GlobalNamingResources>

Raadpleeg de volgende gedeelten van JNDI Datasource How-To in de Tomcat-documentatie voor aanvullende gegevensbroninstructies:

De installatiekopie bouwen en pushen

De eenvoudigste manier om de installatiekopieën te bouwen en te uploaden naar Azure Container Registry (ACR) voor gebruik door ACA, is door de az acr build opdracht te gebruiken. Voor deze opdracht hoeft Docker niet op uw computer geïnstalleerd te zijn. Als u bijvoorbeeld de Dockerfile uit de opslagplaats tomcat-container-quickstart en het toepassingspakket petclinic.war in de huidige map hebt, kunt u de containerinstallatiekopie in ACR bouwen met de volgende opdracht:

az acr build \
    --registry $acrName \
    --image "${acrName}.azurecr.io/petclinic:{{.Run.ID}}" 
    --build-arg APP_FILE=petclinic.war \
    --build-arg SERVER_XML=prod.server.xml .

U kunt de parameter --build-arg APP_FILE... weglaten als uw WAR-bestand de naam ROOT.war heeft. U kunt de parameter --build-arg SERVER_XML... weglaten als uw XML-bestand de naam server.xml heeft. Beide bestanden moeten zich in dezelfde map als Dockerfile bevinden.

U kunt ook Docker CLI gebruiken om de installatiekopieën lokaal te bouwen met behulp van de volgende opdrachten. Met deze aanpak kunt u het testen en verfijnen van de installatiekopie voorafgaand aan de initiële implementatie in ACR vereenvoudigen. Hiervoor moet Docker CLI zijn geïnstalleerd en de Docker-daemon actief zijn.

# Build the image locally.
sudo docker build . --build-arg APP_FILE=petclinic.war -t "${acrName}.azurecr.io/petclinic:1"

# Run the image locally.
sudo docker run -d -p 8080:8080 "${acrName}.azurecr.io/petclinic:1"

# You can now access your application with a browser at http://localhost:8080.

# Sign in to ACR.
sudo az acr login --name $acrName

# Push the image to ACR.
sudo docker push "${acrName}.azurecr.io/petclinic:1"

Zie Containerinstallatiekopieën bouwen en opslaan met Azure Container Registry voor meer informatie.

Implementeren in Azure Container Apps

De volgende opdracht toont een voorbeeldimplementatie:

az containerapp create \
    --resource-group <RESOURCE_GROUP> \
    --name <APP_NAME> \
    --environment <ENVIRONMENT_NAME> \
    --image <IMAGE_NAME> \
    --target-port 8080 \
    --ingress 'external' \
    --registry-server <REGISTRY_SERVER> \
    --min-replicas 1

Zie Quickstart: Uw eerste container-app implementeren voor een uitgebreidere quickstart.

Postmigratie

Nu u uw toepassing naar ACA hebt gemigreerd, moet u controleren of deze werkt zoals verwacht. Wanneer u dat gedaan hebt, hebben we enkele aanbevelingen voor u aan de hand waarvan u de toepassing geschikter kunt maken voor de cloud.

Aanbevelingen

  • Ontwerp en implementeer een strategie voor bedrijfscontinuïteit en herstel na noodgevallen. Voor bedrijfskritische toepassingen kunt u het beste een implementatiearchitectuur voor meerdere regio's gebruiken. Zie Best practices voor bedrijfscontinuïteit en herstel na noodgevallen in Azure Kubernetes Service (AKS) voor meer informatie.

  • Controleer de items in het bestand logging.properties. U kunt een deel van de logboekuitvoer elimineren of beperken om de prestaties te verbeteren.

  • Overweeg om de grootte van de codecache te bewaken en de parameters -XX:InitialCodeCacheSize en -XX:ReservedCodeCacheSize de JAVA_OPTS variabele in het Dockerfile toe te voegen om de prestaties verder te optimaliseren. Zie Codecache Tuning (Engelstalig) in de documentatie van Oracle voor meer informatie.

  • Overweeg om waarschuwingsregels en actiegroepen van Azure Monitor toe te voegen om snel aberrante voorwaarden te detecteren en op te lossen.

  • Overweeg om de Implementatie van Azure Container Apps in een andere regio te repliceren voor lagere latentie en hogere betrouwbaarheid en fouttolerantie. Gebruik Azure Traffic Manager om de taakverdeling tussen implementaties te verdelen of Azure Front Door te gebruiken om SSL-offloading en Web Application Firewall toe te voegen met DDoS-beveiliging.

  • Als geo-replicatie niet nodig is, kunt u een Azure-toepassing-gateway toevoegen om SSL-offloading en Web Application Firewall toe te voegen met DDoS-beveiliging.