1. Übersicht
Diese Reihe von Codelabs (selbstgesteuerte, praktische Anleitungen) soll Google App Engine-Java-Entwicklern (Standard) helfen, ihre Apps zu modernisieren. Dazu werden sie durch eine Reihe von Migrationen geführt. Wenn Sie diese Schritte ausführen, können Sie Ihre App so aktualisieren, dass sie portabler ist. Sie können sie auch für Cloud Run, den Container-Hosting-Dienst von Google Cloud, der App Engine ähnelt, und andere Container-Hosting-Dienste containerisieren.
In dieser Anleitung erfahren Sie, wie Sie eine App Engine-Anwendung für die Bereitstellung im vollständig verwalteten Cloud Run-Dienst mithilfe von Buildpacks containerisieren. Buildpacks sind ein CNCF-Projekt, mit dem Sie Ihre App direkt aus dem Quellcode in hochgradig portable Images umwandeln können, die in jeder Cloud ausgeführt werden können.
Sie erfahren nicht nur, welche Schritte erforderlich sind, um von App Engine zu Cloud Run zu migrieren, sondern auch, wie Sie eine Java 8-App Engine-Anwendung auf Java 17 aktualisieren.
Wenn die Anwendung, die Sie migrieren möchten, intensiv gebündelte App Engine-Legacy-Dienste oder andere App Engine-spezifische Funktionen nutzt, ist die Anleitung Auf gebündelte App Engine-Dienste für Java 11/17 zugreifen möglicherweise besser geeignet als dieses Codelab.
Lerninhalte
- Cloud Shell verwenden
- Cloud Run API, Artifact Registry API und Cloud Build API aktivieren
- Anwendung mit Buildpacks in Cloud Build containerisieren
- Container-Images in Cloud Run bereitstellen
Voraussetzungen
- Ein Google Cloud-Projekt mit einem aktiven GCP-Rechnungskonto und aktivierter App Engine
- Grundkenntnisse zu gängigen Linux-Befehlen
- Grundlegende Kenntnisse zur Entwicklung und Bereitstellung 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 App Engine oder nur der Quellcode sein)
Umfrage
Wie werden Sie diese Anleitung verwenden?
Wie würden Sie Ihre Erfahrung mit Java bewerten?
Wie würden Sie Ihre Erfahrungen mit Google Cloud-Diensten bewerten?
2. Hintergrund
PaaS-Systeme wie App Engine und Cloud Functions bieten viele Vorteile für Ihr Team und Ihre Anwendung, z. B. können sich Systemadministratoren und DevOps auf die Entwicklung von Lösungen konzentrieren. Mit serverlosen Plattformen kann Ihre App bei Bedarf automatisch skaliert werden. Sie kann auch auf null skaliert werden, wobei die Abrechnung nach Nutzung erfolgt, um die Kosten im Blick zu behalten. Außerdem können Sie eine Vielzahl gängiger Entwicklungssprachen verwenden.
Die Flexibilität von Containern ist jedoch auch überzeugend. Da Sie jede Sprache, Bibliothek und jedes Binärprogramm auswählen können, bieten Container das Beste aus beiden Welten: den Komfort von Serverless und die Flexibilität von Containern. Genau darum geht es bei Google Cloud Run.
Die Verwendung von Cloud Run ist nicht Gegenstand dieses Codelabs. Informationen dazu finden Sie in der Cloud Run-Dokumentation. Ziel ist es, dass Sie sich damit vertraut machen, wie Sie Ihre App Engine-Anwendung für Cloud Run (oder andere containerbasierte Dienste) in einen Container packen. Bevor Sie fortfahren, sollten Sie einige Dinge wissen, vor allem, dass sich die Benutzeroberfläche leicht ändert.
In diesem Codelab erfahren Sie, wie Sie Container erstellen und bereitstellen. Sie erfahren, wie Sie Ihre Anwendung mit Buildpacks containerisieren, die App Engine-Konfiguration migrieren und Build-Schritte für Cloud Build definieren. Dazu müssen Sie bestimmte App Engine-spezifische Funktionen aufgeben. Wenn Sie diesen Weg nicht gehen möchten, können Sie stattdessen auch auf eine Java 11/17-Laufzeit aktualisieren und Ihre Apps in App Engine behalten.
3. Einrichtung/Vorbereitung
1. Projekt einrichten
Für diese Anleitung verwenden Sie eine Beispielanwendung aus dem Repository appengine-java-migration-samples in einem brandneuen Projekt. Prüfen Sie, ob das Projekt ein aktives Rechnungskonto hat.
Wenn Sie eine vorhandene App Engine-Anwendung zu Cloud Run migrieren möchten, können Sie diese Anwendung stattdessen 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. Beispiel-App für die Baseline herunterladen
Klonen Sie die Beispiel-App entweder auf Ihrem eigenen Computer oder in der Cloud Shell und rufen Sie dann den Ordner baseline auf.
Das Beispiel ist eine Servlet-basierte Datastore-Anwendung in Java 8, 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
Das Folgende ist nur erforderlich, wenn Sie bestätigen möchten, dass die App in App Engine funktioniert, bevor wir zu Cloud Run migrieren.
Folgen Sie der Anleitung in der Datei README.md:
gcloud-Befehlszeile installieren/sich damit vertraut machen- Initialisieren Sie die gcloud CLI für Ihr Projekt mit
gcloud init. - Erstelle das App Engine-Projekt mit
gcloud app create - Beispielanwendung in App Engine bereitstellen
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
- Prüfen, ob die App problemlos auf App Engine ausgeführt wird
4. Artifact Registry-Repository erstellen
Nachdem Sie Ihre App in einen Container gepackt haben, benötigen Sie einen Ort, an dem Sie Ihre Images per Push übertragen und speichern können. Die empfohlene Methode hierfür in Google Cloud ist die Artifact Registry.
Erstellen Sie das Repository mit dem Namen migration mit gcloud:
gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"
In diesem Repository wird der Formattyp docker verwendet. Es sind jedoch mehrere Repository-Typen verfügbar.
An diesem Punkt haben Sie Ihre App Engine-Basisanwendung und Ihr Google Cloud-Projekt ist für die Migration zu Cloud Run vorbereitet.
4. Anwendungsdateien ändern
Wenn Ihre App die gebündelten Legacy-Dienste, die Konfiguration oder andere App Engine-Funktionen stark nutzt, empfehlen wir, weiter auf diese Dienste zuzugreifen, während Sie auf die neue Laufzeit aktualisieren. In diesem Codelab wird ein Migrationspfad für Anwendungen beschrieben, die bereits eigenständige Dienste verwenden oder die sich ohne Weiteres so umgestalten lassen.
1. Upgrade auf Java 17
Wenn Ihre App Java 8 verwendet, sollten Sie ein Upgrade auf einen späteren LTS-Kandidaten wie 11 oder 17 in Betracht ziehen, um Sicherheitsupdates zu erhalten und auf neue Sprachfunktionen zugreifen zu können.
Aktualisieren Sie zuerst die Attribute in Ihrem pom.xml und fügen Sie Folgendes hinzu:
<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, das Compiler-Plug-in wird darüber informiert, dass Sie auf die Sprachfunktionen von Java 17 zugreifen möchten, und die kompilierten Klassen sollen mit der Java 17-JVM kompatibel sein.
2. Webserver einbinden
Es gibt eine Reihe von Unterschieden zwischen App Engine und Cloud Run, die bei der Migration zwischen den beiden Plattformen berücksichtigt werden sollten. Ein Unterschied besteht darin, dass die Java 8-Laufzeit von App Engine einen Jetty-Server für die gehosteten Apps bereitgestellt und verwaltet hat, Cloud Run jedoch nicht. 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 ohne Änderungen wiederverwenden, es ist jedoch eine Konfiguration erforderlich, damit sie erkannt werden.
Erstellen Sie die folgende MigratedServletApplication.java-Klasse im Paket com.example.appengine:
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);
}
}
Beachten Sie, dass dies die @ServletComponentScan-Annotation umfasst, die standardmäßig im aktuellen Paket nach @WebServlets sucht und diese wie erwartet zur Verfügung stellt.
4. Build-Konfiguration
Entfernen Sie als Nächstes die Konfiguration, um unsere Anwendung als WAR zu verpacken. Das erfordert nicht viel Konfiguration, insbesondere bei Projekten, die Maven als Build-Tool verwenden, da die JAR-Paketierung das Standardverhalten ist.
Entfernen Sie das packaging-Tag in 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 für unterschiedliche Nutzer konzipiert. Bestimmte Funktionen, die App Engine standardmäßig bietet, z. B. die Dienste Cron und Task Queue, müssen manuell neu erstellt werden. Sie werden in späteren Modulen genauer behandelt.
In der Beispiel-App werden keine gebündelten Legacy-Dienste verwendet. Nutzer, deren Apps dies tun, können sich die folgenden Anleitungen ansehen:
- Von gebündelten Diensten migrieren, um geeignete eigenständige Dienste zu finden.
- XML-Konfigurationsdateien zu YAML migrieren für Nutzer, die zu den Java 11/17-Laufzeiten migrieren, aber weiterhin App Engine verwenden.
Da Sie die Bereitstellung ab sofort in Cloud Run vornehmen, kann 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 und bereitstellen
Jetzt können Sie Ihre App direkt aus dem Quellcode in Cloud Run bereitstellen. Dies ist eine hervorragende Option, bei der Cloud Build im Hintergrund verwendet wird, um eine automatische Bereitstellung zu ermöglichen. Hinweis: Damit Sie diese Funktion nutzen können, benötigen Sie entweder ein Konto mit mindestens einer der folgenden Berechtigungen und müssen die Schritte zur Einrichtung der Umgebung ausgeführt haben oder Sie verwenden die Cloud Shell:
- Inhaberrolle
- Bearbeiterrolle
- Die folgenden Rollen:
- Rolle „Cloud Build-Bearbeiter“
- Rolle „Artifact Registry-Administrator“
- Rolle "Storage-Administrator"
- Rolle „Cloud Run-Administrator“
- Rolle "Dienstkontonutzer"
Wenn diese Voraussetzungen erfüllt sind, führen Sie einfach den folgenden Befehl in Ihrem Quellverzeichnis aus:
gcloud run deploy SERVICE --source .
Während der Ausführung des Befehls „run deploy“ werden Sie zu einigen Dingen aufgefordert, z. B.:
- Speicherort des Quellcodes angeben
- Dienstname angeben
- Cloud Run API aktivieren
- Region auswählen
Nachdem Sie auf diese Aufforderungen geantwortet haben, beginnt der Build- und Bereitstellungsprozess. Cloud Build führt dabei die folgenden Schritte aus:
- Die Quelle wird gezippt und in einem Cloud Storage-Bucket gespeichert.
- verwendet im Hintergrund die Cloud Native Computing Foundation-Buildpacks, um Ihr Image zu erstellen.
- Erstellt eine Registry zum Speichern des resultierenden Container-Images (falls noch nicht vorhanden)
- Außerdem wird ein Cloud Run-Dienst zum Hosten Ihrer App erstellt, sofern noch nicht vorhanden.
Nachdem der Build und die Bereitstellung abgeschlossen sind, sollten Sie eine Meldung erhalten, dass eine neue Überarbeitung aktiv ist und 100% des Traffics verarbeitet.
6. Zusammenfassung/Bereinigung
Herzlichen Glückwunsch! Sie haben Ihre App aktualisiert, in einen Container gepackt und migriert. Damit ist dieses Tutorial abgeschlossen.
Als Nächstes sollten Sie sich mit den CI/CD- und Softwarelieferketten-Sicherheitsfunktionen vertraut machen, die Ihnen jetzt zur Verfügung stehen, da Sie 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: Dienst bereinigen und/oder deaktivieren
Wenn Sie die Beispiel-App im Rahmen dieser Anleitung in 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 es wieder aktivieren. Wenn App Engine-Apps deaktiviert sind, fallen keine Gebühren für Zugriffe an. Die Datastore-Nutzung kann jedoch in Rechnung gestellt werden, wenn sie das kostenlose Kontingent überschreitet. Löschen Sie daher genügend Daten, um dieses Limit einzuhalten.
Wenn Sie die Migrationen nicht fortsetzen und alles vollständig löschen möchten, können Sie entweder Ihren Dienst löschen oder Ihr Projekt vollständig beenden.
7. Zusätzliche Ressourcen
Probleme/Feedback zu Codelabs für das App Engine-Migrationsmodul
Wenn Sie Probleme mit diesem Codelab feststellen, suchen Sie bitte zuerst nach Ihrem Problem, bevor Sie es melden. Links zum Suchen und Erstellen neuer Probleme:
Migrationsressourcen
- Migrationsoptionen zum Entbündeln von App Engine-Diensten
- Build-Trigger für Cloud Build einrichten
- Weitere Informationen zur Migration zu Java 11/17
Onlineressourcen
Unten finden Sie Online-Ressourcen, die für diese Anleitung relevant sein könnten:
App Engine
- App Engine-Dokumentation
- Informationen zu Preisen und Kontingenten für App Engine
- Plattformen der ersten und zweiten Generation vergleichen
- Langfristiger Support für ältere Laufzeiten
Andere Cloud-Informationen
Videos
- Serverless Migration Station
- Serverless Expeditions
- Google Cloud Tech abonnieren
- Google Developers abonnieren
Lizenz
Dieser Text ist mit einer Creative Commons Attribution 2.0 Generic License lizenziert.