Mulai menggunakan Java

Tutorial ini ditujukan bagi pengguna baru yang ingin membuat aplikasi di cloud, seperti engineer dan developer web, yang ingin mempelajari konsep utama pengembangan aplikasi yang berlaku untuk Google Cloud.

Tujuan

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen yang dapat ditagih berikut Google Cloud:

Petunjuk dalam dokumen ini dirancang untuk menjaga agar penggunaan resource Anda tetap dalam batasan paket Always Free Google Cloud's Always Free tier. Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis. Google Cloud

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, baca bagian Pembersihan.

Sebelum memulai

  1. Login keakun Anda. Google Cloud Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud 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

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud 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

  5. Verify that billing is enabled for your Google Cloud project.

  6. Untuk membuat database Firestore dalam mode Native, selesaikan langkah-langkah berikut:
    1. Di Google Cloud konsol, buka halaman Firestore create database.

      Buka Firestore create database

    2. Dari layar Select a Cloud Firestore mode, klik Select Native Mode.
    3. Pilih lokasi untuk database Firestore Anda. Setelan lokasi ini adalah lokasi Google Cloud resource default untuk Google Cloud project Anda . Lokasi ini digunakan untuk Google Cloud layanan di dalam Google Cloud project Anda yang memerlukan setelan lokasi, khususnya, bucket default Cloud Storage dan aplikasi Cloud Run Anda.
    4. Klik Create Database.
  7. Aktifkan Cloud Run Admin, Cloud Storage, Cloud Logging, dan Error Reporting API.

    Peran yang diperlukan untuk mengaktifkan API

    Untuk mengaktifkan API, Anda memerlukan peran IAM Service Usage Admin (roles/serviceusage.serviceUsageAdmin), yang berisi izin serviceusage.services.enable. Pelajari cara memberikan peran.

    Aktifkan API

  8. Clone repo contoh dan buka aplikasi contoh di Cloud Shell:
    Buka Cloud Shell

    Cloud Shell menyediakan akses command line ke Google Cloud resource Anda langsung dari browser.

  9. Pada perintah untuk meng-clone repo, klik Confirm.
  10. Di Cloud Shell, konfigurasikan alat gcloud untuk menggunakan project baru Anda Google Cloud :

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID

    Ganti PROJECT_ID dengan Google Cloud project ID yang Anda buat menggunakan Google Cloud konsol.

    Google Cloud CLI adalah cara utama Anda berinteraksi dengan Google Cloud resource Anda dari command line. Dalam tutorial ini, Anda akan menggunakan alat gcloud untuk men-deploy dan memantau aplikasi Anda.

Menjalankan aplikasi Anda

  1. Jika Anda sudah menggunakan Cloud Shell dan telah mengonfigurasinya untuk menggunakan Java 11, perbarui alternatif Java shell, variabel lingkungan JAVA_HOME, dan PATH untuk menentukan Java 8.
  2. Ubah ke direktori bookshelf/1-cloud-run dan jalankan aplikasi:
    GOOGLE_CLOUD_PROJECT=PROJECT_ID mvn -Plocal clean jetty:run-exploded
    
    Ganti PROJECT_ID dengan ID Google Cloud project yang Anda buat.
  3. Di Cloud Shell, klik Web preview , lalu pilih Preview on port 8080. Tindakan ini akan membuka jendela baru dengan aplikasi Anda yang sedang berjalan.

Men-deploy aplikasi Anda ke Cloud Run

Google Cloud menawarkan beberapa opsi untuk menjalankan kode Anda. Untuk contoh ini, Anda akan menggunakan Cloud Run untuk men-deploy aplikasi yang skalabel ke Google Cloud. Cloud Run tidak mengharuskan Anda mengelola server dan otomatis melakukan penskalaan untuk mendukung lonjakan traffic.

Ikuti petunjuk di Men-deploy aplikasi Anda ke Cloud Run.

Jika deployment berhasil, deployment akan menampilkan endpoint ke aplikasi yang berjalan di Cloud Run, dalam format berikut:

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

Aplikasi Anda kini dapat dilihat di link ini, yang selanjutnya disebut YOUR_CLOUD_RUN_URL. Di browser web Anda, masukkan URL untuk melihat aplikasi.

Halaman beranda aplikasi Bookshelf

Mempertahankan data Anda dengan Firestore

Anda tidak dapat menyimpan informasi di instance Cloud Run, karena informasi tersebut akan hilang jika instance dimulai ulang, dan tidak ada saat instance baru dibuat. Sebagai gantinya, Anda menggunakan database yang dibaca dan ditulis oleh semua instance Anda.

Google Cloud menawarkan beberapa opsi untuk menyimpan data Anda. Dalam contoh ini, Anda akan menggunakan Firestore untuk menyimpan data setiap buku. Firestore adalah database dokumen NoSQL serverless yang terkelola sepenuhnya yang memungkinkan Anda menyimpan dan membuat kueri data. Firestore otomatis melakukan penskalaan untuk memenuhi kebutuhan aplikasi Anda, dan melakukan penskalaan hingga nol saat Anda tidak menggunakannya. Tambahkan buku pertama Anda sekarang.

  1. Di browser web Anda, buka YOUR_CLOUD_RUN_URL.
  2. Untuk membuat buku untuk aplikasi yang di-deploy, klik Add book.

    Menambahkan buku ke aplikasi Bookshelf
  3. Di kolom Title, masukkan Moby Dick.
  4. Di kolom Author, masukkan Herman Melville.
  5. Klik Save. Sekarang ada entri ke aplikasi Bookshelf Anda.

    Entri aplikasi Bookshelf Moby Dick
  6. Di Google Cloud konsol, untuk memuat ulang halaman Firestore, klik Refresh . Data akan muncul di Firestore. Aplikasi Bookshelf menyimpan setiap buku sebagai dokumen Firestore dengan ID unik, dan semua dokumen ini disimpan dalam koleksi Firestore. Untuk tujuan tutorial ini, koleksi tersebut disebut buku. Contoh dokumen Firestore.

Firestore menyimpan buku menggunakan library klien Firestore. Berikut adalah contoh pengambilan dokumen Firestore:

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);
  }
}

Untuk mengetahui informasi selengkapnya tentang penggunaan Firestore, lihat Menambahkan data ke Firestore.

Menyimpan upload file di Cloud Storage

Setelah menambahkan buku, kini saatnya menambahkan gambar sampul buku. Anda tidak dapat menyimpan file di instance Anda. Database bukan pilihan yang tepat untuk file gambar. Sebagai gantinya, Anda menggunakan Cloud Storage.

Cloud Storage adalah penyimpanan blob utama untuk Google Cloud. Anda dapat menggunakan Cloud Storage untuk menghosting aset aplikasi yang ingin Anda bagikan di seluruh Google Cloud. Untuk menggunakan Cloud Storage, Anda harus membuat bucket Cloud Storage, yaitu container dasar untuk menyimpan data Anda.

  1. Di Google Cloud konsol, buka halaman Cloud Storage Browser.

    Buka halaman Browser Cloud Storage

  2. Klik Create bucket.
  3. Dalam dialog Create bucket, masukkan nama untuk bucket Anda dengan menambahkan Google Cloud project ID Anda ke string _bucket sehingga nama tersebut terlihat seperti YOUR_PROJECT_ID_bucket. Nama ini tunduk pada persyaratan nama bucket. Semua kolom lainnya dapat tetap menggunakan nilai defaultnya.
  4. Klik Create.
  5. Setelah bucket Anda dibuat, objek harus dapat diakses secara publik agar dapat dilihat oleh pengguna. Untuk membuat objek Anda dapat diakses secara publik, lihat Membuat Data Publik.
  6. Klik Edit book, lalu pilih gambar untuk diupload sebagai sampul buku Anda. Misalnya, Anda dapat menggunakan gambar domain publik ini:
    Sampul buku Moby Dick
  7. Klik Save. Anda akan dialihkan ke halaman beranda, tempat terdapat entri ke aplikasi Bookshelf Anda.
    Entri aplikasi Bookshelf Moby Dick

Aplikasi Bookshelf mengirimkan file yang diupload ke Cloud Storage menggunakan library klien 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");
    }
  }
}

Untuk mengetahui informasi selengkapnya tentang penggunaan Cloud Storage, lihat pengantar Cloud Storage.

Memantau aplikasi Anda menggunakan Google Cloud Observability

Anda telah men-deploy aplikasi dan membuat serta mengubah buku. Untuk memantau peristiwa ini bagi pengguna Anda, gunakan pengelolaan performa aplikasi.

Memantau log dengan Cloud Logging

  1. Di konsol Google Cloud, buka Logs Explorer

    Buka Logs Explorer

    Anda dapat memantau aplikasi Anda secara real time. Jika Anda mengalami masalah dengan aplikasi Anda, ini adalah salah satu tempat pertama yang harus dilihat.

    Stackdriver Log Viewer
  2. Di menu drop-down Resource, pilih Cloud Run Revision, bookshelf.

Memantau error dengan Error Reporting

  1. Di Google Cloud konsol, buka halaman Error Reporting.
    Buka halaman Error Reporting
    Error Reporting menandai error dan pengecualian dalam aplikasi Anda dan memungkinkan Anda menyiapkan pemberitahuan di sekitarnya.
  2. Di browser Anda, buka URL /errors di aplikasi Anda.
    YOUR_CLOUD_RUN_URL/errors

    Tindakan ini akan menghasilkan pengecualian pengujian baru dan mengirimkannya ke Google Cloud Observability.

  3. Di Google Cloud konsol, kembali ke halaman Error Reporting, dan dalam beberapa saat error baru akan terlihat. Klik Auto Reload agar Anda tidak perlu memuat ulang halaman secara manual.

    Pesan error dari Error Reporting.

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

  1. Di Google Cloud konsol, buka halaman Manage resources.

    Buka Kelola resource

  2. Pada daftar project, pilih project yang Anda ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah berikutnya