Erste Schritte mit Java

Diese Anleitung richtet sich an alle Nutzer, die sich mit dem Erstellen von Anwendungen in der Cloud vertraut machen möchten, z. B. Software- oder Webentwickler, die die grundlegenden Konzepte der Anwendungsentwicklung im Zusammenhang mit Cloud de Confiance by S3NSkennenlernen möchten.

Ziele

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Cloud de Confiance by S3NS:

Die Anleitungen in diesem Dokument wurden so gestaltet, dass Ihre Ressourcennutzung innerhalb der Limits der Stufe Immer kostenlos von Cloud de Confiancebleibt.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweis

  1. In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Cloud de Confiance project.

  3. Mit den folgenden Schritten können Sie eine Firebase-Datenbank im nativen Modus erstellen:
    1. Rufen Sie in der Cloud de Confiance Console die Seite Firestore-Datenbank erstellen auf.

      Zur Seite zum Erstellen einer Firestore-Datenbank

    2. Klicken Sie im Bildschirm Firestore-Modus auswählen auf Nativen Modus auswählen.
    3. Wählen Sie einen Standort für Ihre Firestore-Datenbank aus. Mit dieser Standorteinstellung legen Sie den Cloud de Confiance Standardspeicherort für Ressourcen Cloud de Confiance in Ihrem Projekt fest. Dieser Speicherort wird für Cloud de Confiance Dienste in Ihrem Cloud de Confiance Projekt verwendet, die eine Speicherorteinstellung erfordern, insbesondere für Ihren standardmäßigen Cloud Storage-Bucket und Ihre Cloud Run-App.
    4. Klicken Sie auf Datenbank erstellen.
  4. Aktivieren Sie die Cloud Run Admin API, die Cloud Storage API, die Cloud Logging API und die Error Reporting API.

    Rollen, die zum Aktivieren von APIs erforderlich sind

    Zum Aktivieren von APIs benötigen Sie die IAM-Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin), die die Berechtigung serviceusage.services.enable enthält. Weitere Informationen zum Zuweisen von Rollen

    APIs aktivieren

  5. Klonen Sie das Beispiel-Repository und öffnen Sie die Beispielanwendung in Cloud Shell:
    Cloud Shell aufrufen

    Cloud Shell bietet Ihnen direkt über den Browser Befehlszeilenzugriff auf Ihre Cloud de Confiance Ressourcen.

  6. Klicken Sie auf Fortfahren, um den Beispielcode herunterzuladen und in das Anwendungsverzeichnis zu wechseln.
  7. Konfigurieren Sie in Cloud Shell das gcloud-Tool, um das neue Cloud de Confiance -Projekt zu verwenden:

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID

    Ersetzen Sie PROJECT_ID durch die Cloud de Confiance Projekt-ID, die Sie mit der Cloud de Confiance Console erstellt haben.

    Die Google Cloud CLI ist die primäre Methode zum Interagieren mit Ihren Cloud de Confiance -Ressourcen über die Befehlszeile. In dieser Anleitung verwenden Sie das gcloud-Tool zum Bereitstellen und Überwachen der Anwendung.

App ausführen

  1. Wenn Sie Cloud Shell bereits nutzen und für die Verwendung von Java 11 konfiguriert haben, aktualisieren Sie die Java-Alternativen – die Umgebungsvariablen JAVA_HOME und PATH – der Shell auf Java 8.
  2. Wechseln Sie zum Verzeichnis bookshelf/1-cloud-run und führen Sie die Anwendung aus:
    GOOGLE_CLOUD_PROJECT=PROJECT_ID mvn -Plocal clean jetty:run-exploded
    
    Ersetzen Sie PROJECT_ID durch die ID des von Ihnen erstellten Cloud de Confiance-Projekts.
  3. Klicken Sie in Cloud Shell auf Webvorschau und wählen Sie dann Vorschau auf Port 8080 aus. Ein neues Fenster mit der ausgeführten Anwendung wird geöffnet.

Anwendung in Cloud Run bereitstellen

Cloud de Confiance bietet mehrere Optionen zum Ausführen des Codes. In diesem Beispiel verwenden Sie Cloud Run zum Bereitstellen einer skalierbaren Anwendung in Cloud de Confiance. Bei Cloud Run müssen Sie keine Server verwalten und automatisch skalieren, um Trafficspitzen zu unterstützen.

Folgen Sie der Anleitung unter Anwendung in Cloud Run bereitstellen.

Nach erfolgreicher Bereitstellung wird ein Endpunkt ausgegeben, der in Cloud Run im folgenden Format ausgeführt wird:

https://bookshelf-abcdefghij-uc.a.run.app

Der Code Ihrer Anwendung ist jetzt unter diesem Link aufrufbar, der im Folgenden YOUR_CLOUD_RUN_URL genannt werden soll. Geben Sie die URL in einen Webbrowser ein, um die Anwendung aufzurufen.

Startseite der Bookshelf-Anwendung

Daten mit Firestore dauerhaft speichern

Sie können keine Informationen auf Ihren Cloud Run-Instanzen speichern, da sie beim Neustart der Instanz verloren gehen und beim Erstellen neuer Instanzen nicht vorhanden sind. Stattdessen verwenden Sie eine Datenbank, aus der Ihre Instanzen lesen bzw. in die sie schreiben.

Cloud de Confiance bietet mehrere Optionen zum Speichern von Daten. In diesem Beispiel verwenden Sie Firestore zum Speichern der Daten für jedes Buch. Firestore ist eine vollständig verwaltete, serverlose NoSQL-Dokumentendatenbank, in der Sie Daten speichern und abfragen können. Firestore skaliert automatisch, um die Anwendungsanforderungen zu erfüllen; wenn Sie die Anwendung nicht nutzen, skaliert Firestore auf null. Fügen Sie jetzt das erste Buch hinzu.

  1. Rufen Sie in Ihrem Webbrowser YOUR_CLOUD_RUN_URL auf.
  2. Zum Erstellen eines Buchs für die bereitgestellte Anwendung klicken Sie auf Buch hinzufügen.

    Buch zur Bookshelf-Anwendung hinzufügen
  3. Geben Sie im Feld Titel Moby Dick ein.
  4. Geben Sie im Feld Autor Herman Melville ein.
  5. Klicken Sie auf Speichern. Die Bookshelf-Anwendung enthält jetzt einen Eintrag.

    Eintrag in Bookshelf-Anwendung: Moby Dick
  6. Klicken Sie zum Aktualisieren der Firestore-Seite in der Cloud de Confiance Console auf Aktualisieren . Die Daten sind in Firestore zu sehen. In der Bookshelf-App wird jedes Buch als Firestore-Dokument mit einer eindeutigen ID gespeichert. Alle diese Dokumente werden in einer Firestore-Sammlung gespeichert. In dieser Anleitung wird die Sammlung „books“ genannt. Beispiel für Firestore-Dokument

Firestore speichert die Bücher mithilfe der Firestore-Clientbibliothek. Hier ein Beispiel zum Abrufen eines Firestore-Dokuments:

public class FirestoreDao implements BookDao {
  private CollectionReference booksCollection;

  public FirestoreDao() {
    Firestore firestore = FirestoreOptions.getDefaultInstance().getService();
    booksCollection = firestore.collection("books");
  }

  private Book documentToBook(DocumentSnapshot document) {
    Map<String, Object> data = document.getData();
    if (data == null) {
      System.out.println("No data in document " + document.getId());
      return null;
    }

    return new Book.Builder()
        .author((String) data.get(Book.AUTHOR))
        .description((String) data.get(Book.DESCRIPTION))
        .publishedDate((String) data.get(Book.PUBLISHED_DATE))
        .imageUrl((String) data.get(Book.IMAGE_URL))
        .createdBy((String) data.get(Book.CREATED_BY))
        .createdById((String) data.get(Book.CREATED_BY_ID))
        .title((String) data.get(Book.TITLE))
        .id(document.getId())
        .build();
  }

  @Override
  public String createBook(Book book) {
    String id = UUID.randomUUID().toString();
    DocumentReference document = booksCollection.document(id);
    Map<String, Object> data = Maps.newHashMap();

    data.put(Book.AUTHOR, book.getAuthor());
    data.put(Book.DESCRIPTION, book.getDescription());
    data.put(Book.PUBLISHED_DATE, book.getPublishedDate());
    data.put(Book.TITLE, book.getTitle());
    data.put(Book.IMAGE_URL, book.getImageUrl());
    data.put(Book.CREATED_BY, book.getCreatedBy());
    data.put(Book.CREATED_BY_ID, book.getCreatedById());
    try {
      document.set(data).get();
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }

    return id;
  }

  @Override
  public Book readBook(String bookId) {
    try {
      DocumentSnapshot document = booksCollection.document(bookId).get().get();

      return documentToBook(document);
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
    return null;
  }

  @Override
  public void updateBook(Book book) {
    DocumentReference document = booksCollection.document(book.getId());
    Map<String, Object> data = Maps.newHashMap();

    data.put(Book.AUTHOR, book.getAuthor());
    data.put(Book.DESCRIPTION, book.getDescription());
    data.put(Book.PUBLISHED_DATE, book.getPublishedDate());
    data.put(Book.TITLE, book.getTitle());
    data.put(Book.IMAGE_URL, book.getImageUrl());
    data.put(Book.CREATED_BY, book.getCreatedBy());
    data.put(Book.CREATED_BY_ID, book.getCreatedById());
    try {
      document.set(data).get();
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }

  @Override
  public void deleteBook(String bookId) {
    try {
      booksCollection.document(bookId).delete().get();
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }

  private List<Book> documentsToBooks(List<QueryDocumentSnapshot> documents) {
    List<Book> resultBooks = new ArrayList<>();
    for (QueryDocumentSnapshot snapshot : documents) {
      resultBooks.add(documentToBook(snapshot));
    }
    return resultBooks;
  }

  @Override
  public Result<Book> listBooks(String startTitle) {
    Query booksQuery = booksCollection.orderBy("title").limit(10);
    if (startTitle != null) {
      booksQuery = booksQuery.startAfter(startTitle);
    }
    try {
      QuerySnapshot snapshot = booksQuery.get().get();
      List<Book> results = documentsToBooks(snapshot.getDocuments());
      String newCursor = null;
      if (results.size() > 0) {
        newCursor = results.get(results.size() - 1).getTitle();
      }
      return new Result<>(results, newCursor);
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
    return new Result<>(Lists.newArrayList(), null);
  }

  @Override
  public Result<Book> listBooksByUser(String userId, String startTitle) {
    Query booksQuery =
        booksCollection.orderBy("title").whereEqualTo(Book.CREATED_BY_ID, userId).limit(10);
    if (startTitle != null) {
      booksQuery = booksQuery.startAfter(startTitle);
    }
    try {
      QuerySnapshot snapshot = booksQuery.get().get();
      List<Book> results = documentsToBooks(snapshot.getDocuments());
      String newCursor = null;
      if (results.size() > 0) {
        newCursor = results.get(results.size() - 1).getTitle();
      }
      return new Result<>(results, newCursor);
    } catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
    return new Result<>(Lists.newArrayList(), null);
  }
}

Weitere Informationen zum Verwenden von Firestore finden Sie unter Daten in Firestore hinzufügen.

Datei-Uploads in Cloud Storage speichern

Nachdem Sie ein Buch hinzugefügt haben, soll nun auch noch ein Bild des Buchcovers hinzugefügt werden. Dateien können nicht in Instanzen gespeichert werden. Eine Datenbank ist auch nicht der richtige Ort für Bilddateien. Verwenden Sie stattdessen Cloud Storage.

Cloud Storage ist der primäre Blob-Speicher für Cloud de Confiance. Sie können mit Cloud Storage Anwendungs-Assets hosten, die Sie in Cloud de Confiancefreigeben möchten. Zur Verwendung von Cloud Storage müssen Sie einen Cloud Storage-Bucket – einen Basiscontainer für Daten – erstellen.

  1. Wechseln Sie in der Cloud de Confiance Console zur Seite Cloud Storage-Browser.

    Zum Cloud Storage-Browser

  2. Klicken Sie auf Bucket erstellen.
  3. Geben Sie im Dialogfeld Bucket erstellen einen Namen für den Bucket ein, indem Sie die Cloud de Confiance Projekt-ID vor dem String _bucket einfügen, sodass der Name YOUR_PROJECT_ID_bucket lautet. Der Name unterliegt den Anforderungen für Bucket-Namen. Bei allen übrigen Feldern können die Standardwerte übernommen werden.
  4. Klicken Sie auf Erstellen.
  5. Nach dem Erstellen des Buckets müssen Objekte öffentlich zugänglich gemacht werden, damit Nutzer sie aufrufen können. Informationen dazu, wie Sie Objekte öffentlich zugänglich machen, finden Sie unter Daten öffentlich machen.
  6. Klicken Sie auf Buch bearbeiten und wählen Sie ein Bild als Buchcover zum Hochladen aus. Sie können beispielsweise dieses urheberrechtsfreie Bild verwenden:
    Buchcover: Moby Dick
  7. Klicken Sie auf Speichern. Sie werden zur Startseite weitergeleitet, auf der sich ein Eintrag für Ihre Bookshelf-Anwendung befindet.
    Eintrag in Bookshelf-Anwendung: Moby Dick

Die Bookshelf-Anwendung sendet hochgeladene Dateien über die Cloud Storage-Clientbibliothek an Cloud Storage.

public class CloudStorageHelper {

  private final Logger logger = Logger.getLogger(CloudStorageHelper.class.getName());
  private static Storage storage = null;

  static {
    storage = StorageOptions.getDefaultInstance().getService();
  }


  /**
   * Uploads a file to Google Cloud Storage to the bucket specified in the BUCKET_NAME environment
   * variable, appending a timestamp to end of the uploaded filename.
   */
  public String uploadFile(FileItemStream fileStream, final String bucketName)
      throws IOException, ServletException {
    checkFileExtension(fileStream.getName());

    System.out.println("FileStream name: " + fileStream.getName() + "\nBucket name: " + bucketName);

    DateTimeFormatter dtf = DateTimeFormat.forPattern("-YYYY-MM-dd-HHmmssSSS");
    DateTime dt = DateTime.now(DateTimeZone.UTC);
    String dtString = dt.toString(dtf);
    final String fileName = fileStream.getName() + dtString;

    // the inputstream is closed by default, so we don't need to close it here
    @SuppressWarnings("deprecation")
    BlobInfo blobInfo =
        storage.create(
            BlobInfo.newBuilder(bucketName, fileName)
                // Modify access list to allow all users with link to read file
                .setAcl(new ArrayList<>(Arrays.asList(Acl.of(User.ofAllUsers(), Role.READER))))
                .build(),
            fileStream.openStream());
    logger.log(
        Level.INFO, "Uploaded file {0} as {1}", new Object[] {fileStream.getName(), fileName});
    // return the public download link
    return blobInfo.getMediaLink();
  }


  /** Checks that the file extension is supported. */
  private void checkFileExtension(String fileName) throws ServletException {
    if (fileName != null && !fileName.isEmpty() && fileName.contains(".")) {
      String[] allowedExt = {".jpg", ".jpeg", ".png", ".gif"};
      for (String ext : allowedExt) {
        if (fileName.endsWith(ext)) {
          return;
        }
      }
      throw new ServletException("file must be an image");
    }
  }
}

Weitere Informationen zur Verwendung von Cloud Storage finden Sie in der Einführung in Cloud Storage.

Anwendung mit Google Cloud Observability überwachen

Sie haben Ihre Anwendung bereitgestellt und Bücher erstellt und bearbeitet. Diese Ereignisse können Sie für Ihre Nutzer mit Application Performance Management überwachen.

Logs mit Cloud Logging überwachen

  1. Rufen Sie in der Cloud de Confianceden Log-Explorer auf.

    Zum Log-Explorer

    Hier können Sie die Anwendung in Echtzeit überwachen. Bei Problemen mit Ihrer Anwendung ist dies einer der ersten Anlaufpunkte.

    Stackdriver-Loganzeige
  2. Wählen Sie in der Drop-down-Liste Ressource die Option Überarbeitung in Cloud Run, Bookshelf aus.

Fehler mithilfe von Error Reporting überwachen

  1. Rufen Sie in der Cloud de Confiance Console die Seite Error Reporting auf.
    Zur Seite „Error Reporting“
    In Error Reporting werden Fehler und Ausnahmen in der Anwendung hervorgehoben. Sie können auch diesbezügliche Benachrichtigungen einrichten.
  2. Rufen Sie im Browser die URL /errors in der Anwendung auf.
    YOUR_CLOUD_RUN_URL/errors

    Dadurch wird eine neue Testausnahme generiert und an Google Cloud Observability gesendet.

  3. Kehren Sie in der Cloud de Confiance -Console zur Seite Error Reporting zurück. Nach kurzer Zeit ist der neue Fehler zu sehen. Klicken Sie auf Automatische Aktualisierung, damit Sie die Seite nicht manuell aktualisieren müssen.

    Fehlermeldung von Error Reporting

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

  1. Wechseln Sie in der Cloud de Confiance -Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte