Menerapkan Fungsi Node.js Tanpa Server Menggunakan Google Cloud
Diterbitkan: 2022-03-11Membuat perangkat lunak tidak berakhir dengan menulis kode yang baik. Itu akan selesai ketika perangkat lunak dikerahkan dan mampu menangani permintaan dengan benar dan ketika kami dapat menskalakan tanpa menghalangi kinerja dan biaya menjalankannya.
Anda mungkin berpikir tentang bagaimana Anda memiliki komputasi awan untuk menangani semua hal ini. “Jadi, apa hal baru tanpa server ini, Vignes?”
Komputasi tanpa server adalah gaya arsitektur di mana kode dieksekusi di platform cloud di mana kita tidak perlu khawatir tentang pengaturan perangkat keras dan perangkat lunak, keamanan, kinerja, dan biaya waktu idle CPU. Ini adalah kemajuan komputasi awan yang melampaui infrastruktur yang juga mengabstraksi lingkungan perangkat lunak. Ini berarti tidak diperlukan konfigurasi untuk menjalankan kode.
Dengan tanpa server, berikut ini akan menjadi gaya kerja Anda:
Kembangkan kodenya.
Unggah kode ke penyedia layanan.
Konfigurasikan pemicu (permintaan HTTP, dalam kasus kami).
Pekerjaan kita selesai! Sekarang penyedia platform akan menangani permintaan dan penskalaan yang masuk.
Pengantar Layanan Mikro Tanpa Server
Arsitektur tanpa server sering digabungkan dengan desain gaya layanan mikro. Layanan mikro adalah bagian mandiri dari perangkat lunak besar yang menangani permintaan untuk satu modul tertentu. Dengan membuat layanan mikro yang dapat berjalan di lingkungan tanpa server, pemeliharaan kode dan mempercepat penerapan menjadi mudah.
Pengantar AWS Lambda & GCF, sebuah Perbandingan
Fitur tanpa server sering disebut sebagai “back-end sebagai layanan” atau “fungsi sebagai layanan”. Jumlah penyedia komputasi tanpa server mulai meningkat. Namun, beberapa pemain besar tradisional juga menyediakan opsi tanpa server, seperti AWS Lambda Functions dari Amazon Web Services dan Google Cloud Functions (GCF), yang terakhir, sementara saat ini dalam versi beta, adalah yang saya gunakan. Meskipun mereka bekerja sama, ada beberapa perbedaan penting di antara mereka.
AWS Lambda | Fungsi Google Cloud | |
---|---|---|
Dukungan bahasa | Node.js, Python, C#, Java | Node.js |
Pemicu | DynamoDB, Kinesis, S3, SNS, API gateway (HTTP), CloudFront, + lainnya | HTTP, Cloud PubSub, keranjang penyimpanan Cloud |
Waktu eksekusi maksimum | 300 detik | 540 detik |
Pada artikel ini, kita akan membahas proses penerapan penerapan kode tanpa server menggunakan GCF. Google Cloud Functions adalah solusi komputasi asinkron yang ringan, berbasis peristiwa, yang memungkinkan Anda membuat fungsi kecil dengan satu tujuan yang merespons peristiwa awan tanpa perlu mengelola server atau lingkungan waktu proses.
GCF memiliki tiga kemungkinan implementasi yang dipisahkan berdasarkan pemicu.
Pemicu HTTP Mengarahkan permintaan HTTP ke fungsi cloud
Pemicu pub/sub Google internal Rute publikasi dan permintaan berlangganan ke fungsi cloud
Pemicu bucket penyimpanan cloud Merutekan setiap perubahan yang dibuat pada bucket penyimpanan ke fungsi cloud
Mari buat penyiapan berbasis pemicu HTTP menggunakan Google Cloud Functions
Google Cloud Functions tidak memerlukan penyiapan atau penginstalan khusus tambahan. GCF memastikan bahwa lingkungan node default telah disiapkan dan siap untuk dieksekusi. Saat fungsi cloud dibuat dengan HTTP sebagai pemicu, ini menyediakan URL untuk memicu fungsi. Dibandingkan dengan AWS Lambda, yang menggunakan gateway API sebagai media untuk berkomunikasi dengannya, Google Cloud Functions segera menyediakan URL berdasarkan projectID
dan wilayah.
Membuat Aplikasi Node.js Tanpa Server
Untuk membuat kode kita dapat dieksekusi di GCF, kita harus membungkus kode di dalam satu fungsi tunggal. GCF akan memanggil fungsi tertentu itu setiap kali pemicu terjadi. Cara yang mungkin untuk melakukan ini adalah mengunggah,
File tunggal: Ekspor fungsi default yang akan memanggil fungsi lain berdasarkan permintaan.
Banyak file: Memiliki file
index.js
yang memerlukan semua file lain dan mengekspor fungsi default sebagai titik awal.Beberapa file: Memiliki satu file utama yang dikonfigurasi di
package.json
menggunakan"main": "main.js"
sebagai titik awal.
Salah satu metode di atas akan berhasil.
GCF memiliki versi runtime Node tertentu yang didukung. Pastikan kode ditulis untuk mendukung versi tertentu. Pada saat membuat postingan ini, GCF mendukung Node versi v6.11.1.
Untuk membuat fungsi, Ada beberapa opsi yang perlu dipertimbangkan.
Memori Ini memberitahu berapa banyak memori yang dibutuhkan untuk memproses permintaan untuk satu waktu berjalan. Didefinisikan dalam MB. Untuk aplikasi kecil, 128MB seharusnya cukup memadai, namun bisa ditingkatkan hingga 2GB.
Timeout Timeout, seperti namanya, menentukan batas waktu eksekusi kode yang diharapkan. Setelah ini, kode akan dimatikan dan dihentikan. Eksekusi apa pun setelah titik ini akan berhenti tiba-tiba. Batas waktu maksimum adalah 540 detik.
Fungsi untuk dieksekusi Meskipun lebih dari satu fungsi dapat diekspor dari file pengendali utama, kita perlu mengonfigurasi satu fungsi yang harus dipicu untuk memproses permintaan. Ini memungkinkan pengembang untuk memiliki beberapa titik masuk berdasarkan metode/URL HTTP.
Untuk mengunggah kode, cukup lakukan salin tempel kode untuk membuat portal fungsi. Untuk lebih dari satu file, zip konten dan unggah file. Pastikan, dalam kasus file ZIP, harus ada file index.js
atau file package.json
dengan file utama yang disebutkan.
Ketergantungan modul NPM apa pun harus disebutkan dalam package.json
. GCF mencoba menginstal modul yang disebutkan dalam file package.json
selama penyiapan pertama kali.
Mari kita buat handler sederhana untuk mengembalikan status 200 dan beberapa pesan. Buat fungsi dan tambahkan kode berikut ke sumbernya.
exports.httpServer = function httpServer(req, res) { console.log(req); res.status(200).send('Server is working'); }
Setelah fungsi dibuat, Buka URL yang disediakan untuk memicu fungsi. Seharusnya merespon seperti berikut.
Sekarang, mari kita periksa objek req
di log. Untuk melihat log, GCF menyediakan opsi langsung dari konsol. Klik titik vertikal dan buka opsi log.
Sekarang, mari perbarui kode untuk menangani rute sederhana untuk /users
.
Kode berikut digunakan untuk menangani permintaan GET
& POST
sederhana untuk rute /users
:
exports.httpServer = function httpServer(req, res) { const path = req.path; switch(path) { case '/users': handleUsers(req, res); break; default: res.status(200).send('Server is working'); } }; const handleUsers = (req, res) => { if (req.method === 'GET') { res.status(200).send('Listing users...'); } else if (req.method === 'POST') { res.status(201).send('Creating User...') } else { res.status(404); } }
Setelah memperbarui, mari kita uji di browser sekarang, tetapi kali ini dengan /users
di akhir.
Itu keren. Kami membuat server HTTP dasar dengan perutean.
Operasi & Debug
Jika kode adalah tempat akhir cerita, Anda tidak akan meneliti opsi infrastruktur seperti aplikasi Node.js tanpa server. Berikut adalah ringkasan singkat tentang cara menangani tugas-tugas umum seperti penerapan dan debugging. Hal-hal yang sudah dilakukan pengembang Node.js untuk aplikasi lain.
Penyebaran:
Kode untuk fungsi dapat digunakan dalam empat cara.
Salin tempel kode di konsol
Mengunggah file ZIP
Menyebarkan dari ember penyimpanan cloud sebagai file ZIP
Menyebarkan dari repositori sumber cloud
Opsi yang paling nyaman adalah, tentu saja, menggunakan dari repositori sumber.
Doa:
Saat membuat fungsi, Konsol menyediakan URL HTTP untuk memicu fungsi yang dalam format: https://<region>-<project-id>.cloudfunctions.net/<function-name>
Fungsi AWS Lambda memiliki masalah mulai dingin yang membuat eksekusi fungsi membutuhkan waktu tambahan untuk memulai. Setelah dimulai, eksekusi berikut akan merespons secara normal. Waktu mulai tambahan awal ini disebut sebagai start dingin. Meskipun kami tidak memiliki dokumentasi resmi untuk GCF yang terkait dengan topik ini, masalah cold start tidak muncul selama pengujian kami.
Debug:
GCF terintegrasi dengan layanan Stackdriver Logging di Google Cloud. Semua log dan kesalahan konsol akan dicatat di sini, dan ini membantu men-debug kode yang sudah diterapkan.
Pengujian:
Konsol menyediakan opsi untuk menguji fungsi dengan melewatkan JSON sebagai input. Fungsi akan dipanggil dengan JSON sebagai input dan output akan ditampilkan di konsol. Permintaan (input) dan respons mirip dengan kerangka kerja Express.js dan dapat diuji unit selama proses pengembangan itu sendiri. Jika Anda memerlukan penyegaran pada pengujian Node.js, lihat Panduan Node.js untuk Sebenarnya Melakukan Tes Integrasi
Batasan dan Langkah Selanjutnya
Menggunakan fungsi tanpa server memiliki kelebihannya sendiri, juga memiliki keterbatasan
Vendor lock-in: Ini membatasi kode yang kami tulis ke satu penyedia layanan tertentu. Memindahkan kode ke penyedia lain memerlukan penulisan ulang kode dengan upaya signifikan menuju migrasi. Karena ini bisa menjadi masalah besar, kita harus sangat berhati-hati saat memilih penyedia layanan.
Batasan jumlah permintaan dan sumber daya perangkat keras: Penyedia sering kali membatasi jumlah permintaan paralel yang akan ditangani suatu fungsi pada suatu waktu. Ada batasan memori juga. Jenis pembatasan ini dapat ditingkatkan lebih tinggi dengan berbicara dengan penyedia, tetapi mereka akan tetap ada.
Google Cloud Functions semakin matang dan meningkat pesat. Itu masih ditingkatkan dan sering diperbarui, terutama dalam bahasa yang dapat didukungnya. Jika Anda berencana untuk menggunakan fungsi Google Cloud, perhatikan log perubahan untuk menghindari perubahan yang mengganggu dalam implementasi.
Bacaan Lebih Lanjut di Blog Teknik Toptal:
- Bekerja Dengan TypeScript dan Dukungan Jest: Tutorial AWS SAM