Spring Boot-toepassingen migreren naar Azure Container Apps
In deze handleiding wordt beschreven waar u rekening mee moet houden wanneer u een bestaande Spring Boot-toepassing wilt migreren om te worden uitgevoerd in Azure Container Apps.
Premigratie
Voltooi voordat u begint de evaluatie- en inventarisstappen die in de volgende secties worden beschreven om een geslaagde migratie te garanderen.
Als u niet aan een van deze vereisten vóór de migratie kunt voldoen, raadpleegt u de volgende aanvullende migratiehandleidingen:
- Uitvoerbare JAR-toepassingen migreren naar containers in Azure Kubernetes Service (handleiding gepland)
- Uitvoerbare JAR-toepassingen migreren naar Azure Virtual Machines (handleiding gepland)
Toepassingsonderdelen inspecteren
Lokale status identificeren
In PaaS-omgevingen wordt gegarandeerd dat er op elk moment precies één toepassing wordt uitgevoerd. Zelfs als u een toepassing configureert voor uitvoering in één exemplaar, kan in de volgende gevallen een duplicaatexemplaren worden gemaakt:
- De toepassing moet worden verplaatst naar een fysieke host vanwege een fout of systeemupdate.
- De toepassing wordt bijgewerkt.
In een van deze gevallen blijft het oorspronkelijke exemplaar actief totdat het nieuwe exemplaar is gestart. Dit patroon kan de volgende aanzienlijke gevolgen hebben voor uw toepassing:
- Geen singleton kan gegarandeerd echt single zijn.
- Gegevens die niet naar buiten de opslag worden bewaard, gaan waarschijnlijk sneller verloren dan op één fysieke server of VM.
Voordat u naar Azure Container Apps migreert, moet u ervoor zorgen dat uw code geen lokale status bevat die niet verloren of gedupliceerd mag worden. Als de lokale status bestaat, wijzigt u de code om die status buiten de toepassing op te slaan. Cloudklare toepassingen slaan doorgaans de toepassingsstatus op op locaties zoals de volgende opties:
- Azure Cache voor Redis
- Azure Cosmos DB
- Een andere externe database, zoals Azure SQL, Azure Database for MySQL of Azure Database for PostgreSQL.
- Azure Storage, gebruikt voor het opslaan van ongestructureerde gegevens of zelfs geserialiseerde objecten.
Nagaan of en hoe het bestandssysteem wordt gebruikt
Zoek alle exemplaren waar uw services schrijven naar en/of lezen vanuit het lokale bestandssysteem. Bepaal waar korte-termijn-/tijdelijke bestanden worden geschreven en gelezen en waar langlevende bestanden worden geschreven en gelezen.
Azure Container Apps biedt verschillende typen opslag. Tijdelijke opslag kan tijdelijke gegevens lezen en schrijven en beschikbaar zijn voor een actieve container of replica. Azure File biedt permanente opslag en kan worden gedeeld tussen meerdere containers. Zie Opslagkoppelingen gebruiken in Azure Container Apps voor meer informatie.
Statische alleen-lezeninhoud
Als uw toepassing momenteel statische inhoud bedient, hebt u een alternatieve locatie nodig. U kunt overwegen statische inhoud te verplaatsen naar Azure Blob Storage en Azure CDN toe te voegen voor razendsnelle downloads wereldwijd. Zie statische websitehosting in Azure Storage en quickstart: Een Azure-opslagaccount integreren met Azure CDN voor meer informatie.
Dynamisch gepubliceerde statische inhoud
Als uw toepassing statische inhoud ondersteunt, ongeacht of deze is geüpload of gegenereerd door de toepassing zelf, die na het maken ongewijzigd blijft, kunt u Azure Blob Storage en Azure CDN integreren. U kunt ook een Azure-functie gebruiken om uploads te beheren en CDN-vernieuwingen te activeren wanneer dat nodig is. U vindt een voorbeeldimplementatie voor gebruik in Statische inhoud uploaden en via CDN vooraf laden met Azure Functions.
Bepalen of een van de services besturingssysteemspecifieke code bevat
Als uw toepassing code bevat met afhankelijkheden van het host-besturingssysteem, moet u deze herstructureren om deze afhankelijkheden te verwijderen. U moet bijvoorbeeld het gebruik van /
of \
in bestandssysteempaden vervangen door File.Separator
of Paths.get
als uw toepassing wordt uitgevoerd in Windows.
Overschakelen naar een ondersteund platform
Als u uw Dockerfile handmatig maakt en een containertoepassing implementeert in Azure Container Apps, hebt u volledige controle over uw implementatie, inclusief JRE/JDK-versies.
Voor implementatie van artefacten biedt Azure Container Apps ook specifieke versies van Java (8, 11, 17 en 21) en specifieke versies van Spring Boot- en Spring Cloud-onderdelen. Om compatibiliteit te garanderen, migreert u eerst uw toepassing naar een van de ondersteunde versies van Java in de huidige omgeving en gaat u vervolgens verder met de resterende migratiestappen. Zorg ervoor dat de uiteindelijke configuratie volledig wordt getest. Gebruik in dergelijke tests de laatste stabiele versie van uw Linux-distributie.
Notitie
Deze validatie is vooral belangrijk als uw huidige server wordt uitgevoerd in een niet-ondersteunde JDK (zoals Oracle JDK of IBM OpenJ9).
Meld u aan bij uw productieserver en voer de volgende opdracht uit om uw huidige Java-versie te verkrijgen:
java -version
Zie het overzicht van Java in Azure Container Apps voor ondersteunde versies van Java, Spring Boot en Spring Cloud, evenals instructies voor het bijwerken.
Bepalen of uw toepassing gebruikmaakt van geplande taken
Kortstondige toepassing zoals Unix-cron-taken of kortstondige toepassingen die zijn gebaseerd op het Spring Batch-framework, moet worden uitgevoerd als een taak in Azure Container Apps. Zie Taken in Azure Container Apps voor meer informatie. Als uw toepassing een langlopende toepassing is en taken regelmatig uitvoert met behulp van een planningsframework zoals Quartz of Spring Batch, kan Azure Container Apps die toepassing hosten. De toepassing moet echter op de juiste wijze schalen afhandelen om racevoorwaarden te voorkomen waarbij dezelfde toepassingsexemplaren meer dan één keer per geplande periode worden uitgevoerd tijdens het uitschalen of implementeren van een upgrade.
Inventariseer geplande taken die worden uitgevoerd op de productieservers, binnen of buiten de toepassingscode.
Spring Boot-versies identificeren
Bekijk de afhankelijkheden van elke toepassing die wordt gemigreerd om de Spring Boot-versie te bepalen.
Maven
In Maven-projecten wordt de Spring Boot-versie meestal gevonden in het <parent>
element van het POM-bestand:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
Gradle
In Gradle-projecten wordt de Spring Boot-versie meestal gevonden in de plugins
sectie, als de versie van de org.springframework.boot
invoegtoepassing:
plugins {
id 'org.springframework.boot' version '3.3.3'
id 'io.spring.dependency-management' version '1.1.6'
id 'java'
}
Voor alle toepassingen die Spring Boot-versies vóór 3.x gebruiken, volgt u de Spring Boot 2.0-migratiehandleiding of Spring Boot 3.0-migratiehandleiding om deze bij te werken naar een ondersteunde Spring Boot-versie. Zie de Spring Boot- en Spring Cloud-versies voor ondersteunde versies.
Oplossingen voor logboekaggregatie identificeren
Identificeer eventuele oplossingen voor logboekaggregatie die worden gebruikt door de toepassingen die u migreert. U moet diagnostische instellingen configureren in de migratie om geregistreerde gebeurtenissen beschikbaar te maken voor gebruik. Zie de sectie Logboekregistratie van de console controleren en diagnostische instellingen configureren voor meer informatie.
APM-agents (Application Performance Management) identificeren
Identificeer alle agents voor het beheer van toepassingsprestaties die door uw toepassingen worden gebruikt. Azure Containers Apps biedt geen ingebouwde ondersteuning voor APM-integratie. U moet uw containerinstallatiekopieën voorbereiden of APM-hulpprogramma rechtstreeks integreren in uw code. Als u de prestaties van uw toepassing wilt meten, maar nog geen APM hebt geïntegreerd, kunt u overwegen om Azure-toepassing Insights te gebruiken. Zie de sectie Migratie voor meer informatie.
Externe resources inventariseren
Identificeer externe resources, zoals gegevensbronnen, JMS-bericht-brokers en URL's van andere services. In Spring Boot-toepassingen kunt u doorgaans de configuratie voor dergelijke resources vinden in de map src/main/resources , in een bestand met de naam application.properties of application.yml.
Databases
Voor een Spring Boot-toepassing worden verbindingsreeks meestal weergegeven in configuratiebestanden wanneer deze afhankelijk is van een externe database. Hier volgt een voorbeeld van een application.properties-bestand:
spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=dbuser
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Hier volgt een voorbeeld van een application.yaml-bestand:
spring:
data:
mongodb:
uri: mongodb://mongouser:deepsecret@mongoserver.contoso.com:27017
Raadpleeg de Spring Data-documentatie voor meer mogelijke configuratiescenario's:
JMS-berichtbrokers
Identificeer de broker of brokers die in gebruik zijn door te zoeken in het buildmanifest (meestal een pom.xml - of build.gradle-bestand ) voor de relevante afhankelijkheden.
Een Spring Boot-toepassing die Gebruikmaakt van ActiveMQ bevat bijvoorbeeld meestal deze afhankelijkheid in het pom.xml-bestand :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
Spring Boot-toepassingen die commerciële brokers gebruiken, bevatten doorgaans rechtstreeks afhankelijkheden in de JMS-stuurprogrammabibliotheken van de brokers. Hier volgt een voorbeeld van een build.gradle-bestand:
dependencies {
...
compile("com.ibm.mq:com.ibm.mq.allclient:9.4.0.5")
...
}
Nadat u de broker of brokers hebt geïdentificeerd die in gebruik zijn, zoekt u de bijbehorende instellingen. In Spring Boot-toepassingen kunt u ze meestal vinden in de application.properties en application.yml bestanden in de toepassingsmap.
Notitie
Microsoft raadt aan de veiligste verificatiestroom te gebruiken die beschikbaar is. De verificatiestroom die in deze procedure wordt beschreven, zoals voor databases, caches, berichten of AI-services, vereist een zeer hoge mate van vertrouwen in de toepassing en brengt risico's met zich mee die niet aanwezig zijn in andere stromen. Gebruik deze stroom alleen wanneer veiligere opties, zoals beheerde identiteiten voor wachtwoordloze of sleutelloze verbindingen, niet haalbaar zijn. Voor bewerkingen van lokale machines geeft u de voorkeur aan gebruikersidentiteiten voor verbindingen zonder wachtwoord of sleutelloze verbindingen.
Hier volgt een ActiveMQ-voorbeeld uit een bestand application.properties :
spring.activemq.brokerurl=broker:(tcp://localhost:61616,network:static:tcp://remotehost:61616)?persistent=false&useJmx=true
spring.activemq.user=admin
spring.activemq.password=<password>
Zie de Spring Boot Messaging-documentatie voor meer informatie over de ActiveMQ-configuratie.
Hier volgt een IBM MQ-voorbeeld uit een application.yaml-bestand :
ibm:
mq:
queueManager: qm1
channel: dev.ORDERS
connName: localhost(14)
user: admin
password: <password>
Zie de documentatie voor IBM MQ Spring-onderdelen voor meer informatie over de IBM MQ MQ-configuratie.
Externe caches identificeren
Identificeer eventuele externe caches die in gebruik zijn. Redis wordt vaak gebruikt via Spring Data Redis. Zie de Spring Data Redis-documentatie voor configuratie-informatie.
Bepaal of sessiegegevens worden opgeslagen in de cache via Spring Session door te zoeken naar de respectieve configuratie (in Java of XML).
Id-providers
Identificeer een of meer id-providers die door uw toepassing worden gebruikt. Raadpleeg het volgende voor informatie over hoe id-providers kunnen worden geconfigureerd:
- Zie de Spring Security-referentie voor OAuth2-configuratie.
- Zie de documentatie voor Auth0 Spring Security voor Auth0 Voor de configuratie van Spring Security.
- Zie de Auth0 PingFederate-instructies voor PingFederate voor de configuratie van PingFederate Spring Security.
Clients identificeren die afhankelijk zijn van een niet-standaardpoort
Met Azure Container Apps kunt u poort beschikbaar maken op basis van uw Azure Container Apps-resourceconfiguratie. Een Spring Boot-toepassing luistert bijvoorbeeld standaard naar poort 8080, maar kan naar behoefte worden ingesteld met server.port
of omgevingsvariabele SERVER_PORT
.
Alle andere externe resources
Het is niet haalbaar voor deze handleiding om elke mogelijke externe afhankelijkheid te documenteren. Na de migratie is het uw verantwoordelijkheid om te controleren of u aan elke externe afhankelijkheid van uw toepassing kunt voldoen.
Inventarisconfiguratiebronnen en -geheimen
Wachtwoorden en beveiligde tekenreeksen inventariseren
Controleer alle eigenschaps- en configuratiebestanden en alle omgevingsvariabelen in de productie-implementatie(s) op geheime tekenreeksen en wachtwoorden. In een Spring Boot-toepassing kunt u dergelijke tekenreeksen meestal vinden in de application.properties of application.yml-bestand .
Certificaten inventariseren
Documenteer alle certificaten die worden gebruikt voor openbare SSL-eindpunten of communicatie met back-enddatabases en andere systemen. U kunt alle certificaten op de productieserver(s) weergeven door de volgende opdracht uit te voeren:
keytool -list -v -keystore <path to keystore>
De implementatiearchitectuur controleren
Hardwarevereisten voor elke service documenteer
Documenteer de volgende informatie voor uw Spring Boot-toepassing:
- Het aantal exemplaren dat wordt uitgevoerd.
- Het aantal CPU's dat aan elk exemplaar is toegewezen.
- De hoeveelheid RAM die aan elk exemplaar is toegewezen.
Geo-replicatie/distributie document
Bepaal of uw Spring Boot-toepassingsexemplaren momenteel worden gedistribueerd tussen verschillende regio's of datacenters. Documenteer de uptimevereisten/SLA voor de toepassingen die u migreert.
Migratie
Een Azure Container Apps-omgeving maken en apps implementeren
Richt een Azure Container Apps-exemplaar in uw Azure-abonnement in. De beveiligde hostingomgeving wordt samen met deze omgeving gemaakt. Zie voor meer informatie Quickstart: uw eerste container-app implementeren met behulp van Azure Portal.
Logboekregistratie van de console controleren en diagnostische instellingen configureren
Configureer uw logboekregistratie om ervoor te zorgen dat alle uitvoer naar de console wordt gerouteerd in plaats van naar bestanden.
Nadat een toepassing is geïmplementeerd in Azure Container Apps, kunt u de logboekregistratieopties in uw Container Apps-omgeving configureren om een of meer bestemmingen van de logboeken te definiëren. Deze bestemmingen kunnen Azure Monitor Log Analytics, Azure Event Hub of zelfs andere bewakingsoplossingen van derden omvatten. U hebt ook de mogelijkheid om logboekgegevens uit te schakelen en logboeken alleen tijdens runtime weer te geven. Zie Logboekopslag- en bewakingsopties in Azure Container Apps voor gedetailleerde configuratie-instructies.
Permanente opslag configureren
Als een deel van uw toepassing leest of schrijft naar het lokale bestandssysteem, moet u permanente opslag configureren om het lokale bestandssysteem te vervangen. U kunt het pad opgeven dat in de container moet worden gekoppeld via de app-instellingen en deze uitlijnen op het pad dat uw app gebruikt. Zie Opslagkoppelingen gebruiken in Azure Container Apps voor meer informatie.
Alle certificaten migreren naar KeyVault
Azure Containers Apps ondersteunt beveiligde communicatie tussen apps. Uw toepassing hoeft het proces voor het tot stand brengen van beveiligde communicatie niet te beheren. U kunt het privécertificaat uploaden naar Azure Container Apps of een gratis beheerd certificaat gebruiken dat wordt geleverd door Azure Container Apps. Het gebruik van Azure Key Vault voor het beheren van certificaten is een aanbevolen benadering. Zie Certificaten in Azure Container Apps voor meer informatie.
APM-integraties (Application Performance Management) configureren
Of uw app nu wordt geïmplementeerd vanuit een containerinstallatiekopie of vanuit code, Azure Container Apps heeft geen invloed op uw installatiekopie of code. Daarom is de integratie van uw toepassing met een APM-hulpprogramma afhankelijk van uw eigen voorkeuren en implementatie.
Als uw toepassing geen ondersteunde APM gebruikt, is Azure-toepassing Insights één optie. Zie Azure Monitor Application Insights gebruiken met Spring Boot voor meer informatie.
De toepassing implementeren
Implementeer elk van de gemigreerde microservices (niet inclusief Spring Cloud Config Server en Spring Cloud Service Registry), zoals beschreven in Azure Container Apps implementeren met de opdracht az containerapp up.
Geheimen per service en externe instellingen configureren
U kunt configuratie-instellingen in elke toepassing injecteren als omgevingsvariabelen. U kunt deze variabelen instellen als handmatige vermeldingen of als verwijzingen naar geheimen. Zie Omgevingsvariabelen beheren in Azure Container Apps voor meer informatie over configuratie.
De id-provider migreren en inschakelen
Als voor een van de Spring Cloud-toepassingen verificatie of autorisatie is vereist, moet u ervoor zorgen dat deze zijn geconfigureerd voor toegang tot de id-provider:
- Als de id-provider Microsoft Entra-id is, zijn er geen wijzigingen nodig.
- Als de id-provider een on-premises Active Directory-forest is, kunt u overwegen om een hybride identiteitsoplossing met Microsoft Entra-id te implementeren. Zie de documentatie voor hybride identiteiten voor meer informatie.
- Als de id-provider een andere on-premises oplossing is, zoals PingFederate, raadpleegt u de aangepaste installatie van Microsoft Entra Connect-onderwerp om federatie met Microsoft Entra-id te configureren. U kunt ook Spring Security gebruiken om uw id-provider te gebruiken via OAuth2/OpenID Connect of SAML.
De toepassing beschikbaar maken
Standaard is een toepassing die is geïmplementeerd in Azure Container Apps toegankelijk via een toepassings-URL. Als uw app wordt geïmplementeerd in de context van een beheerde omgeving met een eigen virtueel netwerk, moet u het toegankelijkheidsniveau van de app bepalen om alleen openbare toegangs- of toegangsbeheerobjecten vanuit uw virtuele netwerk toe te staan. Zie Netwerken in de Azure Container Apps-omgeving voor meer informatie.
Postmigratie
Nu u de migratie hebt voltooid, controleert u of uw toepassing werkt zoals verwacht. U kunt uw toepassing vervolgens cloudeigender maken met behulp van de volgende aanbevelingen.
Overweeg uw toepassing in te schakelen voor gebruik met Spring Cloud Registry. Met dit onderdeel kan uw toepassing dynamisch worden gedetecteerd door andere geïmplementeerde Spring-toepassingen en -clients. Zie Instellingen configureren voor de Eureka Server voor Spring-onderdeel in Azure Container Apps voor meer informatie. Wijzig vervolgens alle toepassingsclients om de Spring Client Load Balancer te gebruiken. Met de Spring Client Load Balancer kan de client adressen verkrijgen van alle actieve exemplaren van de toepassing en een exemplaar zoeken dat werkt als een ander exemplaar beschadigd raakt of niet meer reageert. Zie Spring Tips: Spring Cloud Load Balancer in de Spring Blog voor meer informatie.
In plaats van uw toepassing openbaar te maken, kunt u overwegen een Spring Cloud Gateway-exemplaar toe te voegen. Spring Cloud Gateway biedt één eindpunt voor alle toepassingen die zijn geïmplementeerd in uw Azure Container Apps-omgeving. Als een Spring Cloud Gateway al is geïmplementeerd, moet u ervoor zorgen dat een routeringsregel is geconfigureerd om verkeer naar uw zojuist geïmplementeerde toepassing te routeren.
Overweeg om een Spring Cloud-configuratieserver toe te voegen voor centraal beheer en configuratie van versiebeheer voor al uw Spring Cloud-toepassingen. Maak eerst een Git-opslagplaats voor het huis van de configuratie en configureer het app-exemplaar om deze te gebruiken. Zie Instellingen configureren voor de Configuratieserver voor Spring-onderdeel in Azure Container Apps voor meer informatie. Migreer vervolgens uw configuratie met behulp van de volgende stappen:
Maak in de map src/main/resources van de toepassing een bootstrap.yml-bestand met de volgende inhoud:
spring: application: name: <your-application-name>
Maak in de Git-opslagplaats voor de configuratie een <naam voor> uw toepassing.yml bestand, waar
your-application-name
hetzelfde is als in de vorige stap. Verplaats de instellingen van application.yml bestand in src/main/resources naar het nieuwe bestand dat u hebt gemaakt. Als de instellingen zich eerder in een .properties-bestand bevonden, converteert u deze eerst naar YAML. U vindt onlinehulpprogramma's of IntelliJ-invoegtoepassingen om deze conversie uit te voeren.Maak een application.yml-bestand in de bovenstaande map. U kunt dit bestand gebruiken om instellingen en resources te definiëren die worden gedeeld tussen alle toepassingen in de Azure Container Apps-omgeving. Dergelijke instellingen omvatten doorgaans gegevensbronnen, logboekregistratie-instellingen, Spring Boot Actuator-configuratie en andere.
Voer deze wijzigingen door en push deze wijzigingen naar de Git-opslagplaats.
Verwijder het bestand application.properties of application.yml uit de toepassing.
Overweeg om het beheerde onderdeel Beheerder voor Spring toe te voegen om een beheerinterface in te schakelen voor Spring Boot-webtoepassingen die actuatoreindpunten beschikbaar maken. Zie Het spring Boot-beheeronderdeel configureren in Azure Container Apps voor meer informatie.
Overweeg om een implementatiepijplijn toe te voegen voor automatische, consistente implementaties. Er zijn instructies beschikbaar voor Azure Pipelines en voor GitHub Actions.
Overweeg om revisies, revisielabels en gewichten voor inkomend verkeer te gebruiken om blauwgroene implementatie mogelijk te maken, zodat u codewijzigingen in productie kunt testen voordat ze beschikbaar worden gesteld aan sommige of alle eindgebruikers. Zie Blue-Green Deployment in Azure Container Apps voor meer informatie.
Overweeg servicebindingen toe te voegen om uw toepassing te verbinden met ondersteunde Azure-databases. Met deze servicebindingen hoeft u geen verbindingsgegevens, inclusief referenties, aan uw Spring Cloud-toepassingen op te geven.
Overweeg om de Java-ontwikkelingsstack in te schakelen voor het verzamelen van metrische JVM-kerngegevens voor uw toepassingen. Zie metrische Java-gegevens voor Java-apps in Azure Container Apps voor meer informatie.
Overweeg om waarschuwingsregels en actiegroepen van Azure Monitor toe te voegen om snel aberrante voorwaarden te detecteren en op te lossen. Zie Waarschuwingen instellen in Azure Container Apps voor meer informatie.
Overweeg om uw app over de zones in de regio te repliceren door redundantie van de Azure Container Apps-zone in te schakelen. Verkeer wordt gelijkmatig verdeeld en automatisch doorgestuurd naar replica's als er een zonestoring optreedt. Zie Betrouwbaarheid in Azure Container Apps voor meer informatie over redundante instellingen.
Overweeg om Azure Container Apps te beschermen tegen veelvoorkomende aanvallen en beveiligingsproblemen met behulp van Web Application Firewall in Application Gateway. Zie Azure Container Apps beveiligen met Web Application Firewall in Application Gateway voor meer informatie.