Tutorial ini menunjukkan cara mem-build layanan penayangan Knative kustom
yang mengubah parameter input deskripsi grafik menjadi diagram dalam format gambar
PNG
. Library ini menggunakan Graphviz yang
diinstal sebagai paket sistem di lingkungan container layanan.
Graphviz digunakan melalui utilitas command line untuk menayangkan permintaan.
Tujuan
- Menulis dan mem-build container kustom dengan Dockerfile
- Menulis, mem-build, dan men-deploy layanan penayangan Knative
- Menggunakan utilitas Graphviz dot untuk membuat diagram
- Menguji layanan dengan memposting diagram sintaksis DOT dari koleksi atau kreasi Anda sendiri
Biaya
Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
- Tutorial ini mengasumsikan bahwa Anda telah menginstal dan mengonfigurasi layanan Knative di cluster.
- Pastikan lingkungan command line Anda sudah disiapkan dan alat tersebut sudah yang terbaru:
Mengambil contoh kode
Untuk mengambil contoh kode agar dapat digunakan:
Clone repositori aplikasi contoh ke komputer lokal Anda:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
Atau, Anda dapat mendownload contoh dalam file ZIP dan mengekstraknya.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
Atau, Anda dapat mendownload contoh dalam file ZIP dan mengekstraknya.
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
Atau, Anda dapat mendownload contoh dalam file ZIP dan mengekstraknya.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
Atau, Anda dapat mendownload contoh dalam file ZIP dan mengekstraknya.
Ubah ke direktori yang berisi kode contoh layanan Knative:
Node.js
cd nodejs-docs-samples/run/system-package/
Python
cd python-docs-samples/run/system-package/
Go
cd golang-samples/run/system_package/
Java
cd java-docs-samples/run/system-package/
Memvisualisasikan arsitektur
Arsitektur dasarnya seperti ini:
Pengguna membuat permintaan HTTP ke layanan penayangan Knative yang menjalankan utilitas Graphviz untuk mengubah permintaan menjadi gambar. Gambar tersebut dikirimkan ke pengguna sebagai respons HTTP.
Memahami kode
Menentukan konfigurasi lingkungan Anda dengan Dockerfile
Dockerfile
Anda dibuat khusus untuk bahasa dan lingkungan operasi dasar,
seperti Ubuntu, yang akan digunakan oleh layanan Anda.
Layanan ini memerlukan satu atau beberapa paket sistem tambahan yang tidak tersedia secara default.
Buka
Dockerfile
di editor.Cari pernyataan
Dockerfile
RUN
. Pernyataan ini memungkinkan perintah shell arbitrer dijalankan untuk memodifikasi lingkungan. JikaDockerfile
memiliki beberapa tahapan, yang diidentifikasi dengan menemukan beberapa pernyataanFROM
, maka tahapan tersebut akan ditemukan di tahap terakhir.Paket spesifik yang diperlukan dan mekanisme untuk menginstalnya bervariasi menurut sistem operasi yang dideklarasikan di dalam container.
Untuk petunjuk sistem operasi atau image dasar Anda, klik tab yang sesuai.
Debian/Ubuntu Alpine Alpine memerlukan paket kedua untuk dukungan font.Untuk menentukan sistem operasi image container, periksa nama dalam pernyataan
FROM
atau README yang terkait dengan image dasar Anda. Misalnya, jika Anda memperluas darinode
, Anda dapat menemukan dokumentasi dan indukDockerfile
di Docker Hub.Uji penyesuaian Anda dengan mem-build image, menggunakan
docker build
secara lokal atau Cloud Build.
Menangani permintaan masuk
Layanan contoh menggunakan parameter dari permintaan HTTP yang masuk untuk memanggil
panggilan sistem yang menjalankan perintah utilitas dot
yang sesuai.
Di pengendali HTTP berikut, parameter input deskripsi grafik diekstrak dari
variabel string kueri dot
.
Deskripsi grafik dapat menyertakan karakter yang harus dienkode URL untuk digunakan dalam string kueri.
Node.js
Python
Go
Java
Anda harus membedakan antara error server internal dan input pengguna yang
tidak valid. Layanan contoh ini menampilkan Error Server Internal untuk semua
error command line dot kecuali jika pesan error tersebut berisi string syntax
, yang
menunjukkan masalah input pengguna.
Membuat diagram
Logika inti pembuatan diagram menggunakan alat command line dot untuk memproses parameter input deskripsi grafik menjadi diagram dalam format gambar PNG.
Node.js
Python
Go
Java
Merancang layanan yang aman
Kerentanan apa pun dalam alat dot
adalah potensi kerentanan
untuk layanan web. Anda dapat mengurangi hal ini dengan menggunakan versi terbaru
paket graphviz
dengan mem-build ulang image container secara rutin.
Jika memperluas sampel saat ini untuk menerima input pengguna sebagai parameter command line, Anda harus melindungi dari serangan injection perintah. Beberapa cara untuk mencegah serangan injection meliputi:
- Memetakan input ke kamus parameter yang didukung
- Memvalidasi input cocok dengan rentang nilai yang diketahui aman, mungkin menggunakan ekspresi reguler
- Meng-escape input untuk memastikan sintaksis shell tidak dievaluasi
Mengirimkan kode
Untuk mengirim kode, build kode dengan Cloud Build, lalu upload ke Container Registry, dan deploy ke penayangan Knative:
Jalankan perintah berikut untuk mem-build container dan memublikasikannya di Container Registry.
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
graphviz
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
graphviz
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
graphviz
merupakan nama yang ingin Anda berikan ke layanan.Setelah berhasil, Anda akan melihat pesan SUCCESS yang berisi ID, waktu pembuatan, dan nama image. Image tersebut disimpan di Container Registry dan dapat digunakan kembali bila diinginkan.
Java
Contoh ini menggunakan Jib untuk mem-build image Docker menggunakan alat Java umum. Jib mengoptimalkan build container tanpa memerlukan Dockerfile atau menginstal Docker. Pelajari lebih lanjut cara mem-build container Java dengan Jib.Dengan Dockerfile, konfigurasikan dan build image dasar menggunakan paket sistem yang diinstal untuk menggantikan image dasar default Jib:
gcloud builds submit --tag gcr.io/PROJECT_ID/graphviz-base
Dengan PROJECT_ID sebagai project ID Google Cloud Anda.
Build container akhir Anda dengan Jib dan publikasikan di Container Registry:
mvn compile jib:build \ -Dimage=gcr.io/PROJECT_ID/graphviz \ -Djib.from.image=gcr.io/PROJECT_ID/graphviz-base
Dengan PROJECT_ID sebagai project ID Google Cloud Anda.
Deploy menggunakan perintah berikut:
gcloud run deploy graphviz-web --create-if-missing --image gcr.io/PROJECT_ID/graphviz
Dengan PROJECT_ID sebagai project ID Google Cloud Anda, dan
graphviz
adalah nama penampung dari contoh di atas, dangraphviz-web
adalah nama layanan.Tunggu hingga deployment selesai: proses ini memerlukan waktu sekitar setengah menit.
Jika Anda ingin men-deploy pembaruan kode ke layanan, ulangi langkah-langkah sebelumnya. Setiap deployment ke layanan akan membuat revisi baru dan otomatis melayani lalu lintas jika sudah siap.
Cobalah
Coba layanan Anda dengan mengirimkan permintaan POST
HTTP dengan deskripsi sintaksis DOT
dalam payload permintaan.
Kirim permintaan HTTP ke layanan Anda.
Anda dapat menyematkan diagram di halaman web:
-
Untuk mendapatkan IP eksternal untuk Load Balancer, jalankan perintah berikut:
kubectl get svc istio-ingressgateway -n ASM-INGRESS-NAMESPACE
Ganti ASM-INGRESS-NAMESPACE dengan namespace tempat ingress Cloud Service Mesh Anda berada. Tentukan
istio-system
jika Anda menginstal Cloud Service Mesh menggunakan konfigurasi defaultnya.Output yang dihasilkan akan terlihat mirip dengan berikut ini:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) istio-ingressgateway LoadBalancer XX.XX.XXX.XX pending 80:32380/TCP,443:32390/TCP,32400:32400/TCP
dengan nilai EXTERNAL-IP adalah alamat IP eksternal Load Balancer Anda.
Jalankan perintah curl menggunakan alamat
EXTERNAL-IP
ini di URL. Jangan sertakan protokol (misalnya:http://
) diSERVICE_DOMAIN
.curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
-
Buka file
diagram.png
yang dihasilkan di aplikasi apa pun yang mendukung filePNG
, seperti Chrome.Kodenya akan terlihat seperti berikut:
Anda dapat menjelajahi koleksi deskripsi diagram siap pakai.
- Salin konten file
.dot
yang dipilih Tempelkan ke dalam perintah
curl
:curl -G -H "Host: SERVICE_DOMAIN" http://EXTERNAL-IP/diagram.png \ --data-urlencode "dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }" \ > diagram.png
Pembersihan
Anda dapat menghapus resource yang dibuat untuk tutorial ini agar tidak menimbulkan biaya.
Menghapus resource tutorial
Hapus layanan penayangan Knative yang Anda deploy dalam tutorial ini:
gcloud run services delete SERVICE-NAME
Dengan SERVICE-NAME adalah nama layanan pilihan Anda.
Anda juga dapat menghapus layanan penayangan Knative dari konsol Google Cloud:
Hapus konfigurasi default gcloud yang Anda tambahkan selama penyiapan tutorial:
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
Hapus konfigurasi project:
gcloud config unset project
Hapus resource Google Cloud lain yang dibuat dalam tutorial ini:
- Hapus image container bernama
gcr.io/<var>PROJECT_ID</var>/graphviz
dari Container Registry. - Jika Anda membuat cluster untuk tutorial ini, hapus cluster.
- Hapus image container bernama
Langkah selanjutnya
- Bereksperimen dengan aplikasi graphviz:
- Menambahkan dukungan untuk utilitas graphviz lainnya yang menerapkan berbagai algoritma untuk pembuatan diagram.
- Simpan diagram ke Cloud Storage. Anda ingin menyimpan gambar atau sintaks DOT?
- Menerapkan perlindungan terhadap penyalahgunaan konten dengan Cloud Natural Language API.
- Pelajari arsitektur referensi, diagram, dan praktik terbaik tentang Google Cloud. Lihat Cloud Architecture Center kami.