Dokumen ini menjelaskan cara menerapkan arsitektur referensi yang dijelaskan dalam Mengintegrasikan microservice dengan Pub/Sub dan GKE. Arsitektur ini dirancang untuk menangani proses yang berjalan lama dengan menggunakan container dan pengiriman pesan asinkron.
Dokumen ini menggunakan contoh aplikasi berbagi foto yang membuat thumbnail foto. Anda men-deploy aplikasi menggunakan Google Kubernete Engine (GKE) dan menggunakan Pub/Sub untuk memanggil proses yang berjalan lama secara asinkron. Anda juga dapat menggunakan notifikasi Pub/Sub untuk Cloud Storage guna menambahkan tugas samping tanpa mengubah kode aplikasi.
Aplikasi dimasukkan ke dalam container oleh Cloud Build dan disimpan di Artifact Registry. Teknologi ini menggunakan Cloud Vision untuk mendeteksi gambar yang tidak pantas.
Arsitektur
Diagram berikut mengilustrasikan desain contoh aplikasi album foto yang mengimplementasikan arsitektur referensi.
Gambar 1. Arsitektur untuk pemrosesan gambar yang didasarkan pada penggunaan kontainer dan pengiriman pesan asinkron.
Diagram sebelumnya menggambarkan cara thumbnail dibuat:
- Klien mengupload gambar ke aplikasi.
- Aplikasi menyimpan gambar di Cloud Storage.
- Permintaan untuk thumbnail akan dibuat.
- Pembuat thumbnail menghasilkan thumbnail.
- Respons yang berhasil akan dikirim ke aplikasi album foto.
- Respons yang berhasil akan dikirim ke klien dan Anda dapat menemukan thumbnail di Cloud Storage.
Diagram berikut menunjukkan cara aplikasi mengimplementasikan pembuatan thumbnail sebagai layanan terpisah secara asinkron.
Gambar 2. Arsitektur proses ekstraksi thumbnail.
Anda dapat menggunakan Pub/Sub untuk mengirim permintaan layanan ke layanan pembuatan thumbnail. Arsitektur baru ini membuat panggilan layanan menjadi asinkron sehingga thumbnail dibuat di latar belakang setelah aplikasi mengirim respons kembali ke klien. Desain ini juga memungkinkan layanan pembuatan thumbnail untuk diskalakan sehingga beberapa tugas dapat berjalan secara paralel.
Tujuan
- Deploy contoh aplikasi album foto di GKE.
- Lakukan panggilan layanan asinkron dari aplikasi.
- Gunakan notifikasi Pub/Sub untuk Cloud Storage guna memicu aplikasi saat file baru diupload ke bucket Cloud Storage.
- Gunakan Pub/Sub untuk melakukan lebih banyak tugas tanpa mengubah aplikasi.
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
- Cloud Storage
- Cloud SQL
- Pub/Sub
- Instance Compute Engine yang digunakan oleh GKE
- Biaya pengelolaan cluster untuk GKE
- Cloud Load Balancing
- Cloud Build
- Artifact Registry
- Vision
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Setelah selesai mem-build aplikasi contoh, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.
Sebelum memulai
- Login ke akun Google Cloud Anda. 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.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Enable the GKE, Cloud SQL, Cloud Build, Artifact Registry, and Cloud Vision APIs.
-
Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.
-
Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.
-
Enable the GKE, Cloud SQL, Cloud Build, Artifact Registry, and Cloud Vision APIs.
-
Di konsol Google Cloud, aktifkan Cloud Shell.
Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.
Menyiapkan lingkungan
Di bagian ini, Anda akan menetapkan setelan default untuk nilai yang digunakan di seluruh dokumen. Jika Anda menutup sesi Cloud Shell, Anda akan kehilangan setelan lingkungan ini.
Di Cloud Shell, tetapkan project Google Cloud default Anda:
gcloud config set project PROJECT_ID
Ganti
PROJECT_ID
dengan ID project Google Cloud Anda.Tetapkan region Compute Engine default Anda:
gcloud config set compute/region REGION export REGION=REGION
Ganti
REGION
dengan region yang dekat dengan Anda. Untuk informasi selengkapnya, lihat Region dan zona.Tetapkan zona Compute Engine default Anda:
gcloud config set compute/zone ZONE export ZONE=ZONE
Ganti
ZONE
dengan zona yang dekat dengan Anda.Download file aplikasi contoh dan tetapkan direktori Anda saat ini:
git clone https://github.com/GoogleCloudPlatform/gke-photoalbum-example cd gke-photoalbum-example
Membuat bucket Cloud Storage dan upload gambar thumbnail default
Di Cloud Shell, buat bucket Cloud Storage untuk menyimpan gambar dan thumbnail asli:
export PROJECT_ID=$(gcloud config get-value project) gsutil mb -c regional -l ${REGION} gs://${PROJECT_ID}-photostore
Upload file thumbnail default:
gsutil cp ./application/photoalbum/images/default.png \ gs://${PROJECT_ID}-photostore/thumbnails/default.png
- Gambar yang diupload disimpan dalam format berikut:
gs://PROJECT_ID-photostore/FILENAME
, denganFILENAME
mewakili nama file gambar yang diupload. - Thumbnail yang dihasilkan disimpan dalam format berikut:
gs://PROJECT_ID-photostore/thumbnails/FILENAME
. - Gambar asli dan thumbnail yang sesuai memiliki
nilai
FILENAME
yang sama, tetapi thumbnail disimpan di bucketthumbnails
. Saat thumbnail dibuat, gambar thumbnail placeholder berikut
default.png
ditampilkan dalam aplikasi album foto.
- Gambar yang diupload disimpan dalam format berikut:
Ubah file thumbnail menjadi publik:
gsutil acl ch -u AllUsers:R \ gs://${PROJECT_ID}-photostore/thumbnails/default.png
Membuat instance Cloud SQL dan database MySQL
Di Cloud Shell, buat instance Cloud SQL:
gcloud sql instances create photoalbum-db --region=${REGION} \ --database-version=MYSQL_8_0
Ambil nama koneksi:
gcloud sql instances describe photoalbum-db \ --format="value(connectionName)"
Catat nama tersebut karena Anda akan menggunakannya nanti.
Setel sandi untuk pengguna MySQL
root@%
:gcloud sql users set-password root --host=% --instance=photoalbum-db \ --password=PASSWORD
Ganti
PASSWORD
dengan sandi yang aman untuk penggunaroot@%
.Hubungkan ke instance Cloud SQL:
gcloud sql connect photoalbum-db --user=root --quiet
Saat diminta, masukkan sandi yang telah Anda siapkan pada langkah sebelumnya.
Buat database bernama
photo_db
, dengan pengguna adalahappuser
dan sandinya adalahpas4appuser
:create database photo_db; create user 'appuser'@'%' identified by 'pas4appuser'; grant all on photo_db.* to 'appuser'@'%' with grant option; flush privileges;
Konfirmasi hasilnya dan keluar dari MySQL:
show databases; select user from mysql.user; exit
Di output, konfirmasi bahwa database
photo_db
dan penggunaappuser
sudah dibuat:mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | photo_db | | sys | +--------------------+ 5 rows in set (0.16 sec) mysql> \t Outfile disabled. mysql> select user from mysql.user; +-------------------+ | user | +-------------------+ | appuser | | cloudsqlreplica | | cloudsqlsuperuser | | root | | cloudsqlexport | | cloudsqlimport | | cloudsqloneshot | | root | | cloudsqlexport | | cloudsqlimport | | cloudsqloneshot | | root | | cloudsqlapplier | | cloudsqlimport | | mysql.infoschema | | mysql.session | | mysql.sys | | root | +-------------------+ 18 rows in set (0.16 sec) mysql> exit Bye
Membuat topik Pub/Sub dan langganan
Di Cloud Shell, buat topik Pub/Sub bernama
thumbnail-service
:gcloud pubsub topics create thumbnail-service
Aplikasi album foto mengirimkan permintaan ke layanan pembuatan thumbnail dengan memublikasikan pesan tentang topik
thumbnail-service
.Buat langganan Pub/Sub bernama
thumbnail-workers
:gcloud pubsub subscriptions create --topic thumbnail-service thumbnail-workers
Layanan pembuatan thumbnail menerima permintaan dari langganan
thumbnail-workers
.
Membuat cluster GKE
Di Cloud Shell, buat cluster GKE yang memiliki izin untuk memanggil API:
gcloud container clusters create "photoalbum-cluster" \ --scopes "https://www.googleapis.com/auth/cloud-platform" \ --num-nodes "5"
Konfigurasi kredensial akses agar Anda dapat mengelola cluster menggunakan
kubectl
perintah pada langkah-langkah berikutnya:gcloud container clusters get-credentials photoalbum-cluster
Tampilkan daftar node:
kubectl get nodes
Di output, konfirmasi bahwa ada lima node yang
STATUS
nilainya adalahReady
:NAME STATUS ROLES AGE VERSION gke-photoalbum-cluster-default-pool-d637570a-2pfh Ready <none> 2m55s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-3rm4 Ready <none> 2m55s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-f7l4 Ready <none> 2m55s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-qb2z Ready <none> 2m53s v1.24.10-gke.2300 gke-photoalbum-cluster-default-pool-d637570a-rvnp Ready <none> 2m54s v1.24.10-gke.2300
Membuat repositori Artifact Registry
Di Cloud Shell, buat repositori untuk menyimpan image container:
gcloud artifacts repositories create photoalbum-repo \ --repository-format=docker \ --location=us-central1 \ --description="Docker repository"
Mem-build gambar untuk aplikasi
Di editor teks, buka
application/photoalbum/src/auth_decorator.py
file lalu perbarui nama pengguna dan sandi:USERNAME = 'username' PASSWORD = 'passw0rd'
Di Cloud Shell, mem-build gambar untuk aplikasi album foto menggunakan layanan Cloud Build.
gcloud builds submit ./application/photoalbum -t \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/photoalbum-app
Mem-build gambar untuk
thumbnail-worker
layanan pembuatan thumbnail menggunakan layanan Cloud Build:gcloud builds submit ./application/thumbnail -t \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/thumbnail-worker
Men-deploy aplikasi album foto
Di Cloud Shell, perbaru manifes Deployment Kubernetes untuk album foto dan pembuat thumbnail dengan nilai dari lingkungan Anda:
connection_name=$(gcloud sql instances describe photoalbum-db \ --format "value(connectionName)") digest_photoalbum=$(gcloud container images describe \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/photoalbum-app:latest --format \ "value(image_summary.digest)") sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \ -e "s/\[CONNECTION_NAME\]/${connection_name}/" \ -e "s/\[DIGEST\]/${digest_photoalbum}/" \ config/photoalbum-deployment.yaml digest_thumbnail=$(gcloud container images describe \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/thumbnail-worker:latest --format \ "value(image_summary.digest)") sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \ -e "s/\[CONNECTION_NAME\]/${connection_name}/" \ -e "s/\[DIGEST\]/${digest_thumbnail}/" \ config/thumbnail-deployment.yaml
Buat resource deployment untuk meluncurkan aplikasi album foto dan layanan pembuatan thumbnail:
kubectl create -f config/photoalbum-deployment.yaml kubectl create -f config/thumbnail-deployment.yaml
Buat resource layanan untuk menetapkan alamat IP eksternal pada aplikasi:
kubectl create -f config/photoalbum-service.yaml
Periksa hasil pod:
kubectl get pods
Di output, konfirmasi bahwa terdapat tiga pod untuk setiap pod
photoalbum-app
danthumbail-worker
pod danSTATUS
serta nilai mereka adalahRunning
:NAME READY STATUS RESTARTS AGE photoalbum-app-555f7cbdb7-cp8nw 2/2 Running 0 2m photoalbum-app-555f7cbdb7-ftlc6 2/2 Running 0 2m photoalbum-app-555f7cbdb7-xsr4b 2/2 Running 0 2m thumbnail-worker-86bd95cd68-728k5 2/2 Running 0 2m thumbnail-worker-86bd95cd68-hqxqr 2/2 Running 0 2m thumbnail-worker-86bd95cd68-xnxhc 2/2 Running 0 2m
Pod
thumbnail-worker
berlangganan permintaan pembuatan thumbnail dari langgananthumbnail-workers
. Untuk mengetahui informasi selengkapnya, lihat cara fungsicallback
digunakan dalam kode sumber.Periksa hasil layanan:
kubectl get services
Di output, konfirmasi bahwa ada alamat IP eksternal di kolom
EXTERNAL-IP
untuk layananphotoalbum-service
. Mungkin perlu waktu beberapa menit sampai semua layanan berjalan.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.23.240.1 <none> 443/TCP 20m photoalbum-service LoadBalancer 10.23.253.241 146.148.111.115 80:32657/TCP 2m
Catat alamat IP eksternal karena akan digunakan nanti. Dalam contoh ini, atribut berisi
146.148.111.115
.
Menguji aplikasi album foto
Untuk mengakses aplikasi yang di-deploy di browser web, buka URL berikut dan masukkan nama pengguna serta sandi yang Anda siapkan sebelumnya:
http://EXTERNAL_IP
Ganti
EXTERNAL_IP
dengan alamat IP yang Anda salin pada langkah sebelumnya.Untuk mengupload file gambar, klik Upload.
Placeholder thumbnail akan muncul di layar.
Di latar belakang, layanan pembuatan thumbnail akan membuat thumbnail gambar yang diupload. Untuk melihat thumbnail yang dihasilkan, klik Refresh. Cloud Vision API menambahkan label gambar yang terdeteksi.
Untuk melihat gambar asli, klik thumbnail.
Menambahkan fitur deteksi gambar yang tidak pantas
Gambar berikut mengilustrasikan cara menggunakan notifikasi Pub/Sub untuk Cloud Storage guna memicu layanan yang mendeteksi konten tidak pantas. Fitur ini memburamkan gambar saat file baru dengan konten tidak pantas disimpan di bucket Cloud Storage.
Pada gambar sebelumnya, layanan menggunakan fitur Deteksi Safe Search dari Vision API untuk mendeteksi konten tidak pantas dalam gambar.
Aplikasi foto memicu pembuat thumbnail dan pemeriksa gambar secara asinkron. Oleh karena itu, tidak ada jaminan bahwa perintah tersebut akan dijalankan dalam urutan tertentu. Jika pembuatan thumbnail terjadi sebelum gambar buram, Anda mungkin akan melihat thumbnail yang tidak pantas untuk sementara waktu. Namun, pemeriksa gambar pada akhirnya memburamkan gambar yang tidak pantas dan thumbnail yang tidak pantas.
Membuat topik Pub/Sub, langganan, dan notifikasi
Di Cloud Shell, buat topik Pub/Sub bernama
safeimage-service
:gcloud pubsub topics create safeimage-service
Buat langganan Pub/Sub bernama
safeimage-workers
:gcloud pubsub subscriptions create --topic safeimage-service \ safeimage-workers
Konfigurasikan notifikasi Pub/Sub sehingga pesan dikirim ke topik
safeimage-service
saat file baru diupload ke bucket Cloud Storage:gsutil notification create -t safeimage-service -f json \ gs://${PROJECT_ID}-photostore
Mem-build dan men-deploy gambar pekerja
Di Cloud Shell, mem-build image container untuk langganan
safeimage-workers
menggunakan Cloud Build:gcloud builds submit ./application/safeimage \ -t us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/safeimage-worker
Perbarui manifes Deployment Kubernetes untuk layanan safe-image dengan ID project Google Cloud, nama koneksi Cloud SQL, dan ringkasan image container Anda:
digest_safeimage=$(gcloud container images describe \ us-central1-docker.pkg.dev/${PROJECT_ID}/photoalbum-repo/safeimage-worker:latest --format \ "value(image_summary.digest)") sed -i.bak -e "s/\[PROJECT_ID\]/${PROJECT_ID}/" \ -e "s/\[CONNECTION_NAME\]/${connection_name}/" \ -e "s/\[DIGEST\]/${digest_safeimage}/" \ config/safeimage-deployment.yaml
Membuat resource deployment
Buat resource deployment yang disebut
safeimage-deployment
untuk men-deploy topiksafeimage-service
:kubectl create -f config/safeimage-deployment.yaml
Periksa hasilnya:
kubectl get pods
Di output, konfirmasi bahwa ada tiga
safeimage-worker
pod yangSTATUS
nilainya adalahRunning
.NAME READY STATUS RESTARTS AGE photoalbum-app-555f7cbdb7-cp8nw 2/2 Running 0 30m photoalbum-app-555f7cbdb7-ftlc6 2/2 Running 0 30m photoalbum-app-555f7cbdb7-xsr4b 2/2 Running 8 30m safeimage-worker-7dc8c84f54-6sqzs 1/1 Running 0 2m safeimage-worker-7dc8c84f54-9bskw 1/1 Running 0 2m safeimage-worker-7dc8c84f54-b7gtp 1/1 Running 0 2m thumbnail-worker-86bd95cd68-9wrpv 2/2 Running 0 30m thumbnail-worker-86bd95cd68-kbhsn 2/2 Running 2 30m thumbnail-worker-86bd95cd68-n4rj7 2/2 Running 0 30m
Pod
safeimage-worker
berlangganan permintaan deteksi gambar yang tidak pantas dari langganansafeimage-workers
. Untuk mengetahui informasi selengkapnya, lihat cara fungsicallback
digunakan dalam kode sumber.
Menguji fitur deteksi gambar yang tidak pantas
Di bagian ini, Anda akan mengupload gambar pengujian untuk memverifikasi bahwa fitur Deteksi Safe Search memburamkan gambar yang tidak pantas. Gambar uji coba adalah gambar seorang gadis yang berpakaian seperti zombie (lisensi berdasarkan lisensi CC0 dari Pixaby).
- Download gambar uji coba.
- Untuk mengupload gambar, buka
http://EXTERNAL_IP
, lalu klik Upload. Klik Refresh. Aplikasi menampilkan thumbnail yang diburamkan.
Untuk melihat apakah gambar yang diupload juga diburamkan, klik thumbnail.
Pembersihan
Jika tidak ingin menyimpan resource Google Cloud yang dibuat untuk aplikasi contoh, Anda dapat menghapusnya sehingga Anda tidak akan dikenai biaya untuk resource tersebut di masa mendatang. Anda dapat menghapus project sepenuhnya atau menghapus resource cluster lalu menghapus cluster.
Menghapus project
- Di konsol Google Cloud, buka halaman Manage resource.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Menghapus resource individual
Daripada menghapus project, Anda dapat menghapus resource individual yang telah dibuat.
Hapus resource dari GKE:
kubectl delete -f config/safeimage-deployment.yaml kubectl delete -f config/photoalbum-service.yaml kubectl delete -f config/thumbnail-deployment.yaml kubectl delete -f config/photoalbum-deployment.yaml
Hapus cluster dari GKE:
gcloud container clusters delete photoalbum-cluster --quiet
Hapus repositori dari Artifact Registry:
gcloud artifacts repositories delete photoalbum-repo --location us-central1 --quiet
Hapus langganan dan topik dari Pub/Sub:
gcloud pubsub subscriptions delete safeimage-workers gcloud pubsub topics delete safeimage-service gcloud pubsub subscriptions delete thumbnail-workers gcloud pubsub topics delete thumbnail-service
Hapus instance Cloud SQL:
gcloud sql instances delete photoalbum-db --quiet
Hapus bucket Cloud Storage:
gsutil rm -r gs://${PROJECT_ID}-photostore gsutil rm -r gs://${PROJECT_ID}_cloudbuild
Hapus file:
cd .. rm -rf gke-photoalbum-example
Langkah selanjutnya
- Baca DevOps, dan pelajari lebih lanjut kemampuan Arsitektur yang terkait dengan arsitektur referensi ini.
- Lakukan pemeriksaan cepat DevOps untuk memahami posisi Anda dibandingkan dengan industri lainnya.
- Untuk arsitektur referensi, diagram, dan praktik terbaik lainnya, jelajahi Pusat Arsitektur Cloud.