Stellen Sie eine Spring Boot-App für Azure bereit
1. Einführung
Microsoft Azure bietet jetzt eine solide Java-Unterstützung.
In diesem Lernprogramm wird Schritt für Schritt gezeigt, wie unsere Spring Boot-Anwendung auf der Azure-Plattform funktioniert.
2. Maven-Abhängigkeit und Konfiguration
Erstenswe do need an Azure subscription to make use of the cloud services there; Derzeit können wir ein kostenloses Kontohere eröffnen.
Melden Sie sich als Nächstes bei der Plattform an und erstellen Sie einen Dienstprinzipal mitAzure CLI:
> az login
To sign in, use a web browser to open the page \
https://microsoft.com/devicelogin and enter the code XXXXXXXX to authenticate.
> az ad sp create-for-rbac --name "app-name" --password "password"
{
"appId": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"displayName": "app-name",
"name": "http://app-name",
"password": "password",
"tenant": "tttttttt-tttt-tttt-tttt-tttttttttttt"
}
Jetztwe configure Azure service principal authentication settings in our Maven settings.xml mit Hilfe des folgenden Abschnitts unter<servers>:
azure-auth
aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa
tttttttt-tttt-tttt-tttt-tttttttttttt
password
AZURE
Wir werden uns beim Hochladen unserer Spring Boot-Anwendung auf die Microsoft-Plattform mitazure-webapp-maven-plugin auf die oben beschriebene Authentifizierungskonfiguration verlassen.
Fügen wir denpom.xml das folgende Maven-Plugin hinzu:
com.microsoft.azure
azure-webapp-maven-plugin
1.1.0
Wir können die neueste Release-Versionhere überprüfen.
Es gibt eine Reihe konfigurierbarer Eigenschaften für dieses Plugin, die in der folgenden Einführung behandelt werden.
3. Stellen Sie eine Spring Boot-App für Azure bereit
Nachdem wir die Umgebung eingerichtet haben, versuchen wir, unsere Spring Boot-Anwendung in Azure bereitzustellen.
Unsere Anwendung antwortet mit "hello azure!", wenn wir auf "/hello" zugreifen:
@GetMapping("/hello")
public String hello() {
return "hello azure!";
}
Die Plattform ermöglicht nun die Bereitstellung von Java Web App für Tomcat und Jetty. Mitazure-webapp-maven-plugin können wir unsere Anwendung direkt auf unterstützten Webcontainern als Standardanwendung (ROOT) oder über FTP bereitstellen.
Beachten Sie, dass wir die Anwendung bei der Bereitstellung in Webcontainern als WAR-Archiv verpacken sollten. Zur schnellen Erinnerung haben wir einen Artikel mithow to deploy a Spring Boot WAR into Tomcat.
3.1. Webcontainer-Bereitstellung
Wir verwenden die folgende Konfiguration fürazure-webapp-maven-plugin, wenn wir beabsichtigen, Tomcat auf einer Windows-Instanz bereitzustellen:
1.8
tomcat 8.5
Versuchen Sie für eine Linux-Instanz die folgende Konfiguration:
tomcat 8.5-jre8
Vergessen wir nicht die Azure-Authentifizierung:
azure-auth
spring-azure
example
Wenn wir unsere Anwendung in Azure bereitstellen, wird sie als App-Dienst angezeigt. Hier haben wir die Eigenschaft<appName> angegeben, um den App Service zu benennen. Außerdem muss der App-Service als Ressource vonresource group container gehalten werden, sodass auch<resourceGroup> erforderlich sind.
Now we’re ready to pull the trigger using the azure-webapp:deploy Maven target, und wir werden die Ausgabe sehen:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanssssssss-bbbb-0000'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://spring-example.azurewebsites.net
...
Now we can access https://spring-example.azurewebsites.net/hello und sehen Sie die Antwort: "Hallo Azurblau!".
Während des Bereitstellungsprozesses hat Azure automatisch einen App-Serviceplan für uns erstellt. Weitere Informationen zu Azure App Service-Plänen finden Sie inofficial document. Wenn wir bereits einen App Service-Plan haben, können wir die Eigenschaft<appServicePlanName> festlegen, um zu vermeiden, dass eine neue erstellt wird:
ServicePlanssssssss-bbbb-0000
3.2. FTP-Bereitstellung
Für die Bereitstellung über FTP können wir die Konfiguration verwenden:
azure-auth
spring-example
example
1.8
ftp
${project.basedir}/target
webapps
*.war
In der obigen Konfiguration veranlasst das Plugin die WAR-Datei im Verzeichnis$\{project.basedir}/target und stellt sie im Verzeichniswebappsdes Tomcat-Containers bereit.
Angenommen, unser letztes Artefakt heißtazure-0.1.war,. Sobald wir mit der Bereitstellung beginnen, wird die Ausgabe wie folgt angezeigt:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App spring-example...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Target Web App doesn't exist. Creating a new one...
[INFO] Creating App Service Plan 'ServicePlanxxxxxxxx-xxxx-xxxx'...
[INFO] Successfully created App Service Plan.
[INFO] Successfully created Web App.
...
[INFO] Finished uploading directory: \
/xxx/.../target/azure-webapps/spring-example --> /site/wwwroot
[INFO] Successfully uploaded files to FTP server: \
xxxx-xxxx-xxx-xxx.ftp.azurewebsites.windows.net
[INFO] Successfully deployed Web App at \
https://spring-example.azurewebsites.net
Beachten Sie, dass wir unsere Anwendung hier nicht als Standard-Webanwendung für Tomcat bereitgestellt haben, sodass wir nur über "https://spring-example.azurewebsites.net/azure-0.1/hello" darauf zugreifen können. Der Server antwortet mit "Hallo Azurblau!" wie erwartet.
4. Bereitstellen mit benutzerdefinierten Anwendungseinstellungen
In den meisten Fällen erfordert unsere Spring Boot-Anwendung Datenzugriff, um Dienste bereitzustellen. Azure unterstützt jetzt Datenbanken wie SQL Server, MySQL und PostgreSQL.
Der Einfachheit halber verwenden wir In-App MySQL als Datenquelle, da die Konfiguration anderen Azure-Datenbankdiensten sehr ähnlich ist.
4.1. Aktivieren Sie In-App-MySQL in Azure
Da es keinen Einzeiler gibt, um eine Web-App mit aktiviertem In-App MySQL zu erstellen, müssen wir die Web-App zuerst über die CLI erstellen:
az group create --location japanwest --name bealdung-group
az appservice plan create --name example-plan --resource-group bealdung-group --sku B1
az webapp create --name example-webapp --resource-group example-group \
--plan example-plan --runtime java|1.8|Tomcat|8.5
Dannenable MySQL in App inthe portal:
Nachdem In-App MySQL aktiviert wurde, finden wir die Standarddatenbank, die Datenquellen-URL und die Standardkontoinformationen in einer Datei mit dem NamenMYSQLCONNSTR_xxx.txt im Verzeichnis/home/data/mysql des Dateisystems.
4.2. Spring Boot-Anwendung mit Azure In-App MySQL
Hier erstellen wir für Demonstrationsanforderungen eineUser-Entität und zwei Endpunkte, die fürregister undlistUsers: verwendet werden
@PostMapping("/user")
public String register(@RequestParam String name) {
userRepository.save(userNamed(name));
return "registered";
}
@GetMapping("/user")
public Iterable userlist() {
return userRepository.findAll();
}
Wir werden eine H2-Datenbank in unserer lokalen Umgebung verwenden und sie unter Azure auf MySQL umstellen. Im Allgemeinen konfigurieren wir Datenquelleneigenschaften in der Dateiapplication.properties:
spring.datasource.url=jdbc:h2:file:~/test
spring.datasource.username=sa
spring.datasource.password=
Während für die Azure-Bereitstellungwe need to configure azure-webapp-maven-plugin in *<appSettings>*:
azure-auth
1.8
example-group
example-webapp
bealdung-plan
spring.datasource.url
jdbc:mysql://127.0.0.1:55738/localdb
spring.datasource.username
uuuuuu
spring.datasource.password
pppppp
Jetzt können wir mit dem Deployment beginnen:
> mvn clean package azure-webapp:deploy
...
[INFO] Start deploying to Web App custom-webapp...
[INFO] Authenticate with ServerId: azure-auth
[INFO] [Correlation ID: cccccccc-cccc-cccc-cccc-cccccccccccc] \
Instance discovery was successful
[INFO] Updating target Web App...
[INFO] Successfully updated Web App.
[INFO] Starting to deploy the war file...
[INFO] Successfully deployed Web App at \
https://example-webapp.azurewebsites.net
Aus dem Protokoll können wir ersehen, dass die Bereitstellung abgeschlossen ist.
Testen wir unsere neuen Endpunkte:
> curl -d "" -X POST https://example-webapp.azurewebsites.net/user\?name\=example
registered
> curl https://example-webapp.azurewebsites.net/user
[{"id":1,"name":"example"}]
Die Antwort des Servers sagt alles. Es klappt!
5. Stellen Sie eine containerisierte Spring Boot-App für Azure bereit
In den vorherigen Abschnitten haben wir gezeigt, wie Anwendungen auf Servlet-Containern bereitgestellt werden (in diesem Fall Tomcat). Wie wäre es mit der Bereitstellung als eigenständiges, lauffähiges Gefäß?
Im Moment müssen wir unsere Spring Boot-Anwendung möglicherweise in Container packen. Insbesondere können wir es andocken und das Bild in Azure hochladen.
Wir haben bereits einen Artikel überhow to dockerize a Spring Boot App, aber hierwe’re about to make use of another maven plugin: docker-maven-plugin, to automate dockerization for us:
com.spotify
docker-maven-plugin
1.1.0
Die neueste Version finden Sie unterhere.
5.1. Azure Container-Registrierung
Erstenswe need a Container Registry on Azure to upload our docker image.
Erstellen wir also eines:
az acr create --admin-enabled --resource-group example-group \
--location japanwest --name exampleadr --sku Basic
Wir benötigen auch die Authentifizierungsinformationen der Container-Registrierung. Diese können abgefragt werden mit:
> az acr credential show --name exampleadr --query passwords[0]
{
"additionalProperties": {},
"name": "password",
"value": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
Fügen Sie dann die folgende Serverauthentifizierungskonfiguration in Mavenssettings.xmlhinzu:
exampleadr
exampleadr
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
5.2. Maven Plugin Konfiguration
Fügen wir denpom.xml die folgende Maven-Plugin-Konfiguration hinzu:
exampleadr
${azure.containerRegistry}.azurecr.io
com.spotify
docker-maven-plugin
1.0.0
${docker.image.prefix}/${project.artifactId}
https://${docker.image.prefix}
${azure.containerRegistry}
docker
/
${project.build.directory}
${project.build.finalName}.jar
In der obigen Konfiguration haben wir den Namen des Docker-Images, die Registrierungs-URL und einige ähnliche Eigenschaften wie bei der FTP-Bereitstellung angegeben.
Beachten Sie, dass das Plugin Werte in<dockerDirectory> verwendet, um dieDockerfile zu lokalisieren. Wir legen dieDockerfile in das Verzeichnisdocker und ihr Inhalt ist:
FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD azure-0.1.jar app.jar
RUN sh -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
5.3. Führen Sie die Spring Boot App in einer Docker-Instanz aus
Jetzt können wir ein Docker-Image erstellen und es in die Azure-Registrierung übertragen:
> mvn docker:build -DpushImage
...
[INFO] Building image exampleadr.azurecr.io/azure-0.1
...
Successfully built aaaaaaaaaaaa
Successfully tagged exampleadr.azurecr.io/azure-0.1:latest
[INFO] Built exampleadr.azurecr.io/azure-0.1
[INFO] Pushing exampleadr.azurecr.io/azure-0.1
The push refers to repository [exampleadr.azurecr.io/azure-0.1]
...
latest: digest: sha256:0f0f... size: 1375
Nachdem der Upload abgeschlossen ist, überprüfen wir die Registrierung vonexampleadr. Wir werden das Bild in der Repository-Liste sehen:
Jetzt können wir eine Instanz des Images ausführen:
Nach dem Booten der Instanz können wir über die öffentliche IP-Adresse auf die von unserer Anwendung bereitgestellten Dienste zugreifen:
> curl http://a.x.y.z:8080/hello
hello azure!
5.4. Docker-Container-Bereitstellung
Angenommen, wir haben eine Containerregistrierung, unabhängig davon, ob sie von Azure, Docker Hub oder unserer privaten Registrierung stammt.
Mit Hilfe der folgenden Konfiguration vonazure-webapp-maven-plugin können wir auch unsere Spring Boot-Webanwendung für die Container bereitstellen:
${docker.image.prefix}/${project.artifactId}
https://${docker.image.prefix}
${azure.containerRegistry}
Sobald wirmvn azure-webapp:deploy ausführen, hilft das Plugin dabei, unser Webanwendungsarchiv auf einer Instanz des angegebenen Images bereitzustellen.
Anschließend können wir über die IP-Adresse der Instanz oder die URL des Azure App-Dienstes auf Webdienste zugreifen.
6. Fazit
In diesem Artikel wurde die Bereitstellung einer Spring Boot-Anwendung für Azure als bereitstellbare WAR-Datei oder ausführbare JAR-Datei in einem Container vorgestellt. Obwohl wir die meisten Funktionen vonazure-webapp-maven-plugin behandelt haben, müssen noch einige umfangreiche Funktionen untersucht werden. Bitte überprüfen Siehere für weitere Details.
Wie immer kann die vollständige Implementierung der Codebeispiele überon Github gefunden werden.