1. Übersicht
Diese Reihe von Codelabs (eigenständige, praktische Anleitungen) soll Java-Entwicklern in der Google App Engine (Standard) dabei helfen, ihre Apps zu modernisieren, indem sie durch eine Reihe von Migrationen geführt werden. So können Sie Ihre App aktualisieren, damit sie plattformunabhängiger ist, und sie für Cloud Run, den Container-Hosting-Schwesterdienst der App Engine von Google Cloud, und andere Container-Hosting-Dienste containerisieren.
In dieser Anleitung erfahren Sie, wie Sie eine App Engine-Anwendung in Container verlagern, um sie mit einem Dockerfile im vollständig verwalteten Cloud Run-Dienst bereitzustellen. Dockerfiles sind die praktischste Bereitstellungsmethode für diese Migration, bieten aber auch die meisten Optionen zur Anpassung des Buildprozesses.
Sie erfahren nicht nur, wie Sie von der App Engine zu Cloud Run migrieren, sondern auch, wie Sie eine Java 8-App Engine-Anwendung auf Java 17 umstellen.
Wenn in der Anwendung, die Sie migrieren möchten, häufig gebündelte App Engine-Legacy-Dienste oder andere App Engine-spezifische Funktionen verwendet werden, ist der Leitfaden Auf gebündelte App Engine-Dienste für Java 11/17 zugreifen möglicherweise ein besserer Ausgangspunkt als dieses Codelab.
Sie werden lernen,
- Cloud Shell verwenden
- Cloud Run API, Artifact Registry API und Cloud Build API aktivieren
- Anwendung mit Docker, Docker und Cloud Build containerisieren
- Container-Images in Cloud Run bereitstellen
Voraussetzungen
- Ein Google Cloud Platform-Projekt mit einem aktiven GCP-Rechnungskonto und einer aktivierten App Engine
- Erfahrung mit gängigen Linux-Befehlen
- Grundkenntnisse zum Entwickeln und Bereitstellen von App Engine-Anwendungen
- Eine Java 8-Servlet-Anwendung, die Sie zu Java 17 migrieren und in Cloud Run bereitstellen möchten (dies kann eine App in der App Engine oder nur die Quelle sein)
Umfrage
Wie möchten Sie diese Anleitung verwenden?
Wie würden Sie Ihre Erfahrung mit Java bewerten?
Wie würden Sie Ihre Erfahrungen mit der Nutzung von Google Cloud-Diensten bewerten?
2. Hintergrund
PaaS-Systeme wie App Engine und Cloud Functions bieten viele Vorteile für Ihr Team und Ihre Anwendung. So können sich Systemadministratoren und Entwickler auf die Entwicklung von Lösungen konzentrieren. Bei serverlosen Plattformen kann Ihre App bei Bedarf automatisch hochskaliert und mit der Abrechnung nach Nutzung auf null herunterskaliert werden, um die Kosten zu kontrollieren. Außerdem können Sie eine Vielzahl gängiger Entwicklungssprachen verwenden.
Die Flexibilität von Containern ist jedoch ebenfalls überzeugend. Da Sie mit Containern jede Sprache, jede Bibliothek und jedes Binärprogramm auswählen können, bieten sie das Beste aus beiden Welten: die Vorteile des serverlosen Computings und die Flexibilität von Containern. Genau das ist Google Cloud Run.
In diesem Codelab erfahren Sie nicht, wie Sie Cloud Run verwenden. Sie wird in der Cloud Run-Dokumentation behandelt. Sie lernen hier, wie Sie Ihre App Engine-Anwendung für Cloud Run (oder andere containergehostete Dienste) containerisieren. Bevor Sie fortfahren, sollten Sie einige Dinge wissen. Vor allem, dass sich die Nutzerfreundlichkeit etwas unterscheidet.
In diesem Codelab erfahren Sie, wie Sie Container erstellen und bereitstellen. Sie erfahren, wie Sie Ihre App mit einem Dockerfile containerisieren, von der App Engine-Konfiguration migrieren und (optional) Buildschritte für Cloud Build definieren. Dies beinhaltet die Abschaffung bestimmter App Engine-spezifischer Funktionen. Wenn Sie diesem Weg nicht folgen möchten, können Sie trotzdem ein Upgrade auf eine Java 11/17-Laufzeit durchführen und Ihre Anwendungen stattdessen in App Engine beibehalten.
3. Einrichtung/Vorbereitung
1. Projekt einrichten
In dieser Anleitung verwenden Sie eine Beispielanwendung aus dem Repository appengine-java-migration-samples in einem brandneuen Projekt. Das Projekt muss ein aktives Rechnungskonto haben.
Wenn Sie eine vorhandene App Engine-Anwendung zu Cloud Run migrieren möchten, können Sie stattdessen diese App verwenden.
Führen Sie den folgenden Befehl aus, um die erforderlichen APIs für Ihr Projekt zu aktivieren:
gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com
2. Baseline-Beispiel-App abrufen
Klonen Sie die Beispielanwendung entweder auf Ihrem eigenen Computer oder in Cloud Shell und rufen Sie dann den Ordner Baseline auf.
Bei dem Beispiel handelt es sich um eine Java 8-Servlet-basierte Datenspeicher-App, die für die Bereitstellung in App Engine vorgesehen ist. Folgen Sie der Anleitung in der README-Datei, um diese App für die App Engine-Bereitstellung vorzubereiten.
3. (Optional) Referenz-App bereitstellen
Die folgenden Schritte sind nur erforderlich, wenn Sie prüfen möchten, ob die App in der App Engine funktioniert, bevor wir sie zu Cloud Run migrieren.
Befolgen Sie die Schritte in der Datei README.md:
gcloud
-Befehlszeile installieren/neu kennenlernen- Initialisieren Sie die gcloud CLI für Ihr Projekt mit
gcloud init
. - App Engine-Projekt mit
gcloud app create
erstellen - Beispielanwendung in App Engine bereitstellen
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
- Prüfen, ob die Anwendung in App Engine problemlos ausgeführt wird
4. Artifact Registry-Repository erstellen
Nachdem Sie Ihre App containerisiert haben, müssen Sie Ihre Images irgendwo hochladen und speichern. In Google Cloud wird dazu die Artifact Registry empfohlen.
Erstellen Sie das Repository mit dem Namen migration
mit gcloud so:
gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"
Dieses Repository verwendet das Format docker
. Es gibt jedoch verschiedene Repository-Typen.
Sie haben jetzt Ihre App Engine-Baseline-Anwendung und Ihr Google Cloud-Projekt ist für die Migration zu Cloud Run bereit.
4. Anwendungsdateien ändern
Wenn Ihre App die Legacy-gebündelten Dienste, die Konfiguration oder andere nur für die App Engine verfügbare Funktionen der App Engine intensiv nutzt, empfehlen wir Ihnen, während der Umstellung auf die neue Laufzeit weiterhin auf diese Dienste zuzugreifen. In diesem Codelab wird ein Migrationspfad für Anwendungen veranschaulicht, die bereits eigenständige Dienste verwenden oder so umgestaltet werden können, dass sie dies tun.
1. Upgrade auf Java 17
Wenn Ihre App Java 8 verwendet, sollten Sie auf einen späteren LTS-Kandidaten wie Java 11 oder Java 17 umstellen, um Sicherheitsupdates zu erhalten und Zugriff auf neue Sprachfunktionen zu erhalten.
Aktualisieren Sie zuerst die Properties in Ihrer pom.xml
, um Folgendes aufzunehmen:
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
Dadurch wird die Projektversion auf 17 festgelegt und das Compiler-Plug-in darüber informiert, dass Sie Zugriff auf die Sprachfunktionen von Java 17 benötigen und dass die kompilierten Klassen mit der Java 17-JVM kompatibel sein sollen.
2. Webserver einbinden
Es gibt eine Reihe von Unterschieden zwischen der App Engine und Cloud Run, die Sie bei der Migration berücksichtigen sollten. Ein Unterschied besteht darin, dass die Java 8-Laufzeit der App Engine einen Jetty-Server für die gehosteten Apps bereitstellte und verwaltete, Cloud Run dies jedoch nicht tut. Wir verwenden Spring Boot, um einen Webserver und einen Servlet-Container bereitzustellen.
Fügen Sie die folgenden Abhängigkeiten hinzu:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.6</version>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Use Jetty instead -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
<version>2.6.6</version>
</dependency>
<!-- ... -->
</dependencies>
Spring Boot bettet standardmäßig einen Tomcat-Server ein. In diesem Beispiel wird dieses Artefakt jedoch ausgeschlossen und Jetty verwendet, um Unterschiede im Standardverhalten nach der Migration zu minimieren.
3. Spring Boot-Einrichtung
Spring Boot kann Ihre Servlets zwar ohne Änderungen wiederverwenden, es ist jedoch eine gewisse Konfiguration erforderlich, um sicherzustellen, dass sie auffindbar sind.
Erstellen Sie die folgende MigratedServletApplication.java
-Klasse im com.example.appengine
-Paket:
package com.example.appengine;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
@EnableAutoConfiguration
public class MigratedServletApplication {
public static void main(String[] args) {
SpringApplication.run(MigratedServletApplication.class, args);
}
}
Dazu gehört auch die @ServletComponentScan
-Anmerkung, die standardmäßig im aktuellen Paket nach allen @WebServlets
sucht und sie wie erwartet verfügbar macht.
4. App als JAR-Datei verpacken
Es ist zwar möglich, Ihre App ausgehend von einem Krieg in Container zu verlagern, es wird jedoch einfacher, wenn Sie Ihre App als ausführbare JAR-Datei verpacken. Dies erfordert nicht viel Konfiguration, insbesondere bei Projekten, bei denen Maven als Build-Tool verwendet wird, da das JAR-Paket das Standardverhalten ist.
Entfernen Sie das packaging
-Tag aus der Datei pom.xml
:
<packaging>war</packaging>
Fügen Sie als Nächstes spring-boot-maven-plugin
hinzu:
<plugins>
<!-- ... -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.6</version>
</plugin>
<!-- ... -->
</plugins>
5. Von App Engine-Konfiguration, -Diensten und -Abhängigkeiten migrieren
Wie zu Beginn des Codelabs erwähnt, sind Cloud Run und App Engine auf unterschiedliche Nutzerumgebungen ausgelegt. Bestimmte Funktionen, die in der App Engine standardmäßig verfügbar sind, wie die Cron- und Task Queue-Dienste, müssen manuell neu erstellt werden. Sie werden in späteren Modulen ausführlicher behandelt.
In der Beispielanwendung werden keine gebündelten Legacy-Dienste verwendet. Nutzer, deren Apps diese Dienste verwenden, können die folgenden Anleitungen verwenden:
- Von gebündelten Diensten migrieren, um geeignete eigenständige Dienste zu finden.
- XML-Konfigurationsdateien in YAML-Dateien migrieren, für Nutzer, die zur Java 11/17-Laufzeit migrieren und dabei in der App Engine bleiben.
Da Sie die Bereitstellung ab sofort in Cloud Run vornehmen, kann die appengine-maven-plugin
entfernt werden:
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- can be set w/ -DprojectId=myProjectId on command line -->
<projectId>${app.projectId}</projectId>
<!-- set the GAE version or use "GCLOUD_CONFIG" for an autogenerated GAE version -->
<version>GCLOUD_CONFIG</version>
</configuration>
</plugin>
5. Anwendung containerisieren
Jetzt können Sie Cloud Build mitteilen, wie der Container Ihrer Anwendung erstellt werden soll. Bei dieser Containerisierungsmethode ist keine separate Build-Konfigurationsdatei (cloudbuild.yaml) erforderlich. Wir können einfach ein minimales Dockerfile als Ausgangspunkt definieren:
FROM eclipse-temurin
ARG JAR_FILE=JAR_FILE_MUST_BE_SPECIFIED_AS_BUILD_ARG
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar","/app.jar"]
Dieses Dockerfile bündelt die Uber-JAR-Version Ihres Spring Boot-Dienstes in einer einzigen Schicht. Dies ist der einfachste Ansatz für die Dockerfile-Containerisierung, hat aber einige Nachteile, insbesondere bei wiederholten Ausführungen, bei denen die Abhängigkeiten relativ stabil sind. Bedenken wie diese sind der Grund, warum diese Containerisierungsmethode als fortschrittlicher gilt. Auf der positiven Seite bietet das Schreiben eines eigenen Dockerfile jedoch die vollständige Kontrolle über Ihr Basis-Image und Sie können von den Leistungsvorteilen des Schreibens eines sorgfältig übereinandergelegten Images profitieren.
2**. Build-Prozess ausführen**
Nachdem Sie Cloud Build nun über die gewünschten Build-Schritte informiert haben, können Sie mit nur einem Klick bereitstellen.
Führen Sie dazu diesen Befehl aus:
gcloud builds submit --tag LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE_NAME
Ersetzen Sie die Platzhalterwerte im obigen Befehl durch Folgendes:
- LOCATION: Der regionale oder multiregionale Speicherort für Ihr Repository.
- PROJECT_ID: Ihre Cloud-Projekt-ID.
- REPOSITORY: der Name Ihres Artifact Registry-Repositorys.
- IMAGE_NAME: Der Name Ihres Container-Images.
Nach Abschluss des Vorgangs wurde Ihr Container-Image erstellt, in Artifact Registry gespeichert und in Cloud Run bereitgestellt.
Am Ende dieses Codelabs sollte Ihre App genauso aussehen wie die im Ordner mod4-migrate-to-cloud-run.
Sie haben das Lab erfolgreich abgeschlossen. Sie haben eine Java 8-App Engine-Anwendung erfolgreich zu Java 17 und Cloud Run migriert und haben jetzt ein besseres Verständnis dafür, was beim Wechsel und bei der Auswahl zwischen Hostingoptionen anfällt.
6. Zusammenfassung/Bereinigung
Herzlichen Glückwunsch, Sie haben Ihre App aktualisiert, containerisiert, migriert und damit dieses Tutorial abgeschlossen.
Im nächsten Schritt erfahren Sie mehr über die CI/CD- und Sicherheitsfunktionen für die Softwarelieferkette, die Sie jetzt mit Cloud Build bereitstellen können:
- Benutzerdefinierte Build-Schritte mit Cloud Build erstellen
- Build-Trigger erstellen und verwalten
- On-Demand-Scan in Ihrer Cloud Build-Pipeline verwenden
Optional: Speicherplatz bereinigen und/oder Dienst deaktivieren
Wenn Sie die Beispiel-App in dieser Anleitung in der App Engine bereitgestellt haben, denken Sie daran, die App zu deaktivieren, um Gebühren zu vermeiden. Wenn Sie mit dem nächsten Codelab fortfahren möchten, können Sie die Funktion wieder aktivieren. Während App Engine-Anwendungen deaktiviert sind, wird für sie kein Traffic erzeugt, der Kosten verursacht. Die Datenspeichernutzung kann jedoch kostenpflichtig werden, wenn das kostenlose Kontingent überschritten wird. Löschen Sie daher so viel, dass Sie unter dieses Limit fallen.
Wenn Sie jedoch nicht mit der Migration fortfahren und alles vollständig löschen möchten, können Sie entweder den Dienst löschen oder das Projekt vollständig herunterfahren.
7. Zusätzliche Ressourcen
Codelabs-Probleme/Feedback mit App Engine-Migrationsmodul
Wenn Sie Probleme mit diesem Codelab feststellen, suchen Sie bitte zuerst nach Ihrem Problem, bevor Sie es einreichen. Links zum Suchen und Erstellen neuer Ausgaben:
Ressourcen für die Migration
- Migrationsoptionen für die Aufhebung der Bündelung von App Engine-Diensten
- Build-Trigger für Cloud Build einrichten
- Weitere Informationen zur Migration zu Java 11/17
Onlineressourcen
Nachfolgend finden Sie Onlineressourcen, die für diese Anleitung relevant sein könnten:
App Engine
- App Engine-Dokumentation
- Informationen zu App Engine-Preisen und Kontingenten
- Plattformen der ersten und zweiten Generation vergleichen
- Langzeitsupport für Legacy-Laufzeiten
Informationen zu anderen Clouds
- „Immer kostenlos“-Stufe von Google Cloud
- Google Cloud CLI (
gcloud
CLI) - Gesamte Google Cloud-Dokumentation
Videos
- Serverless Migration Station
- Serverlose Expeditionen
- Google Cloud Tech-Blog abonnieren
- Google Developers abonnieren
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.