Cara Mengelola Paket Pihak Ketiga OpenResty Melalui LuaRocks dan OPM?

API7.ai

September 17, 2022

OpenResty (NGINX + Lua)

Dalam postingan sebelumnya, kita mendapatkan gambaran umum tentang beberapa proyek resmi OpenResty. Namun, jika kita menggunakan OpenResty untuk lingkungan produksi, pustaka-pustaka yang disertakan dalam paket OpenResty ini tidak cukup. Misalnya, tidak ada pustaka lua-resty untuk mengirim permintaan HTTP, dan tidak ada cara untuk berinteraksi dengan Kafka.

Jadi, apa yang harus kita lakukan?

Karena OpenResty bukanlah fork dari NGINX, juga bukan pengemasan ulang NGINX dengan beberapa pustaka standar, melainkan hanya menggunakan NGINX sebagai pustaka jaringan dasar.

Saat menggunakan NGINX, Anda tidak memikirkan cara menginisiasi permintaan HTTP kustom atau cara berinteraksi dengan Kafka. Dan di dunia OpenResty, berkat cosocket, pengembang dapat dengan cepat menulis lua-resty-http dan lua-resty-kafka untuk menangani kebutuhan ini, seperti yang dapat Anda lakukan dengan bahasa pengembangan seperti Python, PHP, dll.

Saran lain untuk Anda: Anda sebaiknya tidak menggunakan pustaka dari dunia Lua untuk menyelesaikan masalah di atas, melainkan menggunakan pustaka lua-resty-* dari cosocket. Pustaka dari dunia Lua kemungkinan besar akan menyebabkan blocking, yang dapat menurunkan kinerja layanan yang seharusnya berkinerja tinggi secara drastis. Ini adalah kesalahan umum bagi pemula OpenResty dan tidak mudah untuk disadari.

Jadi, bagaimana kita menemukan pustaka lua-resty-* yang non-blocking ini? Selanjutnya, izinkan saya memperkenalkan beberapa cara berikut.

OPM

OPM (OpenResty Package Manager) adalah manajer paket yang disertakan dengan OpenResty dan dapat digunakan setelah Anda menginstal OpenResty. Kita dapat mencoba mencari pustaka yang mengirim permintaan http dengan menggunakan perintah opm search http.

Pencarian mungkin lambat pertama kali, biasanya memakan waktu beberapa detik. opm.openresty.org akan melakukan pencarian dari database PostgreSQL dan menyimpan hasilnya dalam cache untuk sementara waktu.

openresty/lua-resty-upload Streaming reader and parser for HTTP file uploading based on ngx_lua cosocket

Ketika Anda melihat hasil ini, Anda mungkin bertanya-tanya: apa hubungannya paket lua-resty-upload ini dengan mengirim http?

Ternyata, saat OPM melakukan pencarian, ia mencari baik nama paket maupun profil paket menggunakan kata kunci yang diberikan. Inilah mengapa pencarian di atas memakan waktu beberapa detik. Ia melakukan pencarian teks lengkap dari string di dalam PostgreSQL.

Namun, bagaimanapun, hasil ini tidak ramah. Mari kita ubah kata kunci dan mencari lagi.

$ opm search lua-resty-http ledgetech/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua pintsized/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua agentzh/lua-resty-http Lua HTTP client cosocket driver for OpenResty/ngx_lua

Di dunia OpenResty, jika Anda mengimplementasikan paket menggunakan cosocket, Anda harus menggunakan awalan lua-resty, yang merupakan aturan tidak tertulis.

Melihat kembali hasil pencarian, OPM menggunakan alamat repositori GitHub kontributor sebagai nama paket, yaitu GitHub ID / nama repo. Ia mengembalikan tiga pustaka pihak ketiga lua-resty-http. Mana yang harus kita pilih?

Sebelum memilih paket, mari kita lihat jumlah bintang dan waktu pembaruan terakhir: hanya belasan bintang; pembaruan terakhir adalah pada tahun 2016. Ini adalah lubang yang ditinggalkan. Melihat lebih dalam, pintsized/lua-resty-http dan ledgetech/lua-resty-http mengarah ke repositori yang sama. Jadi, tidak masalah mana yang Anda pilih, itu sama saja.

Juga, situs web OPM relatif sederhana dan tidak menyediakan jumlah unduhan paket atau dependensi untuk paket ini. Anda perlu menghabiskan lebih banyak waktu untuk mencari tahu pustaka lua-resty mana yang tepat untuk digunakan, padahal seharusnya itu adalah tugas pemelihara.

LuaRocks

LuaRocks adalah manajer paket lain untuk dunia OpenResty, lahir sebelum OPM. Tidak seperti OPM yang hanya berisi paket terkait OpenResty, LuaRocks juga memiliki pustaka dari dunia Lua. Misalnya, LuaSQL-MySQL di LuaRocks adalah paket yang menghubungkan ke MySQL di dunia Lua dan tidak dapat digunakan di OpenResty.

Masih menggunakan pustaka HTTP sebagai contoh, mari kita coba menggunakan LuaRocks untuk mencari.

$ luarocks search http

Seperti yang Anda lihat, ia juga mengembalikan banyak paket.

Mari kita ubah kata kunci lagi.

$ luarocks search lua-resty-http

Kali ini hanya satu paket yang dikembalikan. Kita dapat pergi ke situs web LuaRocks dan melihat detail paket ini. Berikut adalah tangkapan layar dari halaman situs web.

Detail Paket LuaRocks

Tangkapan layar di atas berisi penulis, Lisensi, URL GitHub, jumlah unduhan, ringkasan fitur, riwayat versi, dependensi, dll. Tidak seperti OPM, LuaRocks tidak menggunakan informasi pengguna GitHub secara langsung tetapi meminta pengembang untuk mendaftar ke LuaRocks secara terpisah.

Proyek API gateway sumber terbuka, Apache APISIX, menggunakan LuaRocks untuk manajemen paket. Mari kita lihat secara singkat bagaimana konfigurasi manajemen paket APISIX ditulis.

Versi terbaru APISIX adalah 2.15, dan Anda dapat menemukan file apisix-2.15.0-0.rockspec di bawah proyek Apache APISIX.

package = "apisix" version = "2.15.0-0" supported_platforms = {"linux", "macosx"} source = { url = "git://github.com/apache/apisix", branch = "2.15.0", } description = { summary = "Apache APISIX is a cloud-native microservices API gateway, delivering the ultimate performance, security, open source and scalable platform for all your APIs and microservices.", homepage = "https://github.com/apache/apisix", license = "Apache License 2.0", } dependencies = { "lua-resty-ctxdump = 0.1-0", "lua-resty-dns-client = 6.0.2", "lua-resty-template = 2.0", "lua-resty-etcd = 1.8.2", "api7-lua-resty-http = 0.2.0", "lua-resty-balancer = 0.04", "lua-resty-ngxvar = 0.5.2", "lua-resty-jit-uuid = 0.0.7", "lua-resty-healthcheck-api7 = 2.2.0", "api7-lua-resty-jwt = 0.2.4", "lua-resty-hmac-ffi = 0.05", "lua-resty-cookie = 0.1.0", "lua-resty-session = 3.10", "opentracing-openresty = 0.1", "lua-resty-radixtree = 2.8.2", "lua-protobuf = 0.3.4", "lua-resty-openidc = 1.7.5", "luafilesystem = 1.7.0-2", "api7-lua-tinyyaml = 0.4.2", "nginx-lua-prometheus = 0.20220527", "jsonschema = 0.9.8", "lua-resty-ipmatcher = 0.6.1", "lua-resty-kafka = 0.20-0", "lua-resty-logger-socket = 2.0.1-0", "skywalking-nginx-lua = 0.6.0", "base64 = 1.5-2", "binaryheap = 0.4", "api7-dkjson = 0.1.1", "resty-redis-cluster = 1.02-4", "lua-resty-expr = 1.3.1", "graphql = 0.0.2", "argparse = 0.7.1-1", "luasocket = 3.0rc1-2", "luasec = 0.9-1", "lua-resty-consul = 0.3-2", "penlight = 1.9.2-1", "ext-plugin-proto = 0.5.0", "casbin = 1.41.1", "api7-snowflake = 2.0-1", "inspect == 3.1.1", "lualdap = 1.2.6-1", "lua-resty-rocketmq = 0.3.0-0", "opentelemetry-lua = 0.1-3", "net-url = 0.9-1", "xml2lua = 1.5-2", "nanoid = 0.1-1", "lua-resty-mediador = 0.1.2-1" } build = { type = "make", build_variables = { CFLAGS="$(CFLAGS)", LIBFLAG="$(LIBFLAG)", LUA_LIBDIR="$(LUA_LIBDIR)", LUA_BINDIR="$(LUA_BINDIR)", LUA_INCDIR="$(LUA_INCDIR)", LUA="$(LUA)", OPENSSL_INCDIR="$(OPENSSL_INCDIR)", OPENSSL_LIBDIR="$(OPENSSL_LIBDIR)", }, install_variables = { ENV_INST_PREFIX="$(PREFIX)", ENV_INST_BINDIR="$(BINDIR)", ENV_INST_LIBDIR="$(LIBDIR)", ENV_INST_LUADIR="$(LUADIR)", ENV_INST_CONFDIR="$(CONFDIR)", }, }

Seperti yang Anda lihat dari file tersebut, dependensi dicampur dengan pustaka lua-resty-* dan pustaka dari dunia Lua murni, yang hanya dapat diinstal sebagian menggunakan OPM. Setelah menulis konfigurasi, gunakan perintah upload dari LuaRocks untuk mengunggah konfigurasi ini, dan pengguna dapat menggunakan LuaRocks untuk mengunduh dan menginstal APISIX.

LuaRocks mendukung ini. Anda dapat menentukan jalur dan nama kode sumber C dalam file .rockspec, dan LuaRocks akan mengompilasinya secara lokal untuk Anda. OPM belum mendukung fitur ini.

awesome-resty

Proyek awesome-resty memelihara hampir semua paket yang tersedia untuk OpenResty, yang dikategorikan. Ini adalah tempat terbaik untuk pergi ketika Anda tidak yakin apakah ada paket pihak ketiga yang cocok.

Mari kita ambil pustaka HTTP sebagai contoh. Di awesome-resty, ia secara alami termasuk dalam kategori networking.

lua-resty-http by @pintsized — Lua HTTP client cosocket driver for OpenResty / ngx_lua lua-resty-http by @liseen — Lua http client driver for the ngx_lua based on the cosocket API lua-resty-http by @DorianGray — Lua HTTP client driver for ngx_lua based on the cosocket API lua-resty-http-simple — Simple Lua HTTP client driver for ngx_lua lua-resty-httpipe — Lua HTTP client cosocket driver for OpenResty / ngx_lua lua-resty-httpclient — Nonblocking Lua HTTP Client library for aLiLua & ngx_lua lua-httpcli-resty — Lua HTTP client module for OpenResty lua-resty-requests — Yet Another HTTP Library for OpenResty

Kita melihat bahwa ada delapan pustaka pihak ketiga untuk lua-resty-http. Membandingkan hasil sebelumnya, kita hanya menemukan 2 menggunakan OPM dan hanya 1 di LuaRocks. Namun, jika sulit untuk memilih, gunakan yang pertama, yang sama dengan yang ada di LuaRocks.

Untuk insinyur yang suka bereksperimen, saya merekomendasikan pustaka terakhir: lua-resty-requests, pustaka akses HTTP yang lebih ramah pengguna dengan gaya antarmuka yang sama dengan Requests Python yang terkenal. Jika Anda pecinta Python seperti saya, Anda akan menyukai lua-resty-requests, yang dibuat oleh tokers yang aktif di komunitas OpenResty sehingga Anda dapat menggunakannya dengan percaya diri.

Ringkasan

Untuk proyek sumber terbuka yang berkembang, tidak hanya diperlukan teknologi yang kuat, dokumentasi yang baik, dan pengujian yang lengkap, tetapi juga ekosistem yang menyatukan lebih banyak pengembang dan perusahaan. Seperti yang dikatakan Apache Way: komunitas lebih penting daripada kode.

Tidak ada materi pembelajaran sistematis untuk OpenResty, tidak ada panduan kode resmi, dan banyak titik optimasi telah ditulis dalam proyek sumber terbuka. Namun, sebagian besar pengembang tahu apa yang mereka bicarakan tetapi tidak tahu mengapa. Itulah tujuan dari Ebook ini. Setelah mempelajarinya, saya harap Anda dapat menulis kode OpenResty yang lebih efisien dan berpartisipasi lebih efisien dalam proyek sumber terbuka terkait OpenResty, misalnya, Apache APISIX.

Apa pendapat Anda tentang ekosistem OpenResty? Jangan ragu untuk meninggalkan komentar, dan mari kita bicarakan. Juga, silakan bagikan artikel ini.