Menerapkan Fungsi Node.js Tanpa Server Menggunakan Google Cloud

Diterbitkan: 2022-03-11

Membuat 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?”

Fungsi Node.js Tanpa Server Menggunakan Google Cloud

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:

  1. Kembangkan kodenya.

  2. Unggah kode ke penyedia layanan.

  3. 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.

  1. Pemicu HTTP Mengarahkan permintaan HTTP ke fungsi cloud

  2. Pemicu pub/sub Google internal Rute publikasi dan permintaan berlangganan ke fungsi cloud

  3. 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.

Diagram Google Cloud Platform - Cloud Functions & AWS Lambda

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,

  1. File tunggal: Ekspor fungsi default yang akan memanggil fungsi lain berdasarkan permintaan.

  2. Banyak file: Memiliki file index.js yang memerlukan semua file lain dan mengekspor fungsi default sebagai titik awal.

  3. 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.

  1. 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.

  2. 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.

  3. 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'); } 

Tangkapan layar dari fungsi yang sedang dibuat

Setelah fungsi dibuat, Buka URL yang disediakan untuk memicu fungsi. Seharusnya merespon seperti berikut.

Tangkapan layar keluaran browser "Server berfungsi"

Sekarang, mari kita periksa objek req di log. Untuk melihat log, GCF menyediakan opsi langsung dari konsol. Klik titik vertikal dan buka opsi log.

Tangkapan layar membuka 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.

Tangkapan layar keluaran browser "Mencantumkan pengguna..."

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