Stellen Sie eine Spring Boot-App für Azure bereit

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:

image

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:

image

Jetzt können wir eine Instanz des Images ausführen:

image

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.