Node ialah penterjemah JavaScript sebelah pelayan yang akan mengubah konsep cara pelayan harus berfungsi. Matlamatnya adalah untuk membantu pengaturcara membina aplikasi yang sangat berskala dan menulis kod yang boleh mengendalikan berpuluh-puluh ribu sambungan serentak kepada satu (dan hanya satu) mesin fizikal.
Pengenalan
Jika anda pernah mendengar tentang Node, atau membaca beberapa artikel yang mengisytiharkan betapa hebatnya Node, anda mungkin tertanya-tanya, "Apa itu Node walaupun selepas melihat halaman utama Node, anda mungkin masih tidak faham apa itu?" Node adalah? Node sememangnya bukan untuk setiap pengaturcara, tetapi ia mungkin sesuatu yang beberapa pengaturcara telah bergelut dengannya.
Dalam percubaan untuk menerangkan apa itu Node.js, artikel ini secara ringkas akan memberikan beberapa maklumat latar belakang: masalah yang diselesaikan, cara ia berfungsi, cara menjalankan aplikasi mudah dan akhirnya, apabila Node ialah penyelesaian yang baik. Artikel ini tidak merangkumi cara menulis aplikasi Node yang kompleks, dan juga bukan tutorial Node yang komprehensif. Membaca artikel ini akan membantu anda memutuskan sama ada anda perlu terus mempelajari Node supaya anda boleh menggunakannya untuk perniagaan anda.
Apakah masalah yang direka bentuk untuk diselesaikan oleh Node?
Matlamat Node yang dinyatakan adalah untuk "bertujuan untuk menyediakan cara mudah untuk membina program rangkaian berskala." Apakah yang salah dengan program pelayan semasa? Jom buat masalah matematik. Dalam bahasa seperti Java™ dan PHP, setiap sambungan menghasilkan utas baharu, dan setiap utas baharu mungkin memerlukan 2 MB memori yang disertakan. Pada sistem dengan 8 GB RAM, bilangan maksimum teori sambungan serentak ialah 4,000 pengguna. Apabila pangkalan pelanggan anda berkembang, anda mesti menambah lebih banyak pelayan jika anda mahu aplikasi web anda menyokong lebih ramai pengguna. Sudah tentu, ini akan meningkatkan kos seperti kos pelayan, kos trafik, dan kos buruh. Sebagai tambahan kepada kos yang semakin meningkat ini, terdapat juga potensi isu teknikal bahawa pengguna mungkin menggunakan pelayan yang berbeza untuk setiap permintaan, jadi sebarang sumber yang dikongsi mesti dikongsi merentas semua pelayan. Atas semua sebab di atas, kesesakan dalam keseluruhan seni bina aplikasi web (termasuk trafik, kelajuan pemproses dan kelajuan memori) ialah: bilangan maksimum sambungan serentak yang boleh dikendalikan oleh pelayan.
Penyelesaian Node untuk masalah ini ialah mengubah cara ia menyambung ke pelayan. Daripada menghasilkan benang OS baharu untuk setiap sambungan (dan memperuntukkan beberapa memori yang disertakan untuknya), setiap sambungan memancarkan peristiwa yang berjalan dalam proses enjin Node. Node mendakwa bahawa ia tidak boleh menemui jalan buntu kerana ia tidak membenarkan kunci sama sekali dan ia tidak menyekat panggilan I/O secara langsung. Node juga mendakwa bahawa pelayan yang dijalankannya boleh menyokong puluhan ribu sambungan serentak.
Sekarang anda mempunyai program yang boleh mengendalikan berpuluh-puluh ribu sambungan serentak, apakah sebenarnya yang anda boleh bina dengan Node? Ia akan menjadi menakutkan jika anda mempunyai aplikasi web yang perlu mengendalikan begitu banyak sambungan! Itulah masalah "jika anda mempunyai masalah ini, ia tidak menjadi masalah sama sekali". Sebelum menjawab soalan di atas, mari kita lihat cara Node berfungsi dan cara ia direka bentuk untuk beroperasi.
Nod pastinya bukan apa?
Ya, Node ialah program pelayan. Walau bagaimanapun, produk Node asas pastinya tidak seperti Apache atau Tomcat. Pada asasnya, pelayan tersebut adalah produk pelayan "sedia untuk dipasang", membolehkan aplikasi digunakan dengan segera. Dengan produk ini, anda boleh menyediakan pelayan dan berjalan dalam masa kurang dari satu minit. Node sememangnya bukan produk ini. Sama seperti Apache, yang membolehkan pembangun membuat halaman web dinamik dengan menambahkan modul PHP dan modul SSL untuk melaksanakan sambungan selamat, Node juga mempunyai konsep modul yang membolehkan modul ditambahkan pada teras Node. Terdapat beratus-ratus modul untuk dipilih untuk Node, dan komuniti sangat aktif dalam mencipta, menerbitkan dan mengemas kini modul, malah boleh mengendalikan berpuluh-puluh modul sehari. Keseluruhan bahagian modul Node akan dibincangkan kemudian dalam artikel ini.
Bagaimana Node berfungsi?
Node sendiri menjalankan JavaScript V8. Tunggu, JavaScript pada pelayan? Ya, anda membacanya dengan betul. JavaScript sisi pelayan mungkin merupakan konsep baharu kepada pengaturcara yang hanya menggunakan JavaScript pada klien, tetapi konsep itu sendiri tidak begitu jelas, jadi mengapa bahasa pengaturcaraan yang sama yang digunakan pada klien tidak boleh digunakan pada pelayan?
Apakah V8? Enjin JavaScript V8 ialah enjin JavaScript asas yang digunakan oleh Google untuk penyemak imbas Chromenya. Segelintir orang menganggap apa yang JavaScript sebenarnya lakukan pada mesin klien? Malah, enjin JavaScript bertanggungjawab untuk mentafsir dan melaksanakan kod tersebut. Menggunakan V8, Google mencipta penterjemah super pantas yang ditulis dalam C yang mempunyai ciri unik lain anda boleh memuat turun enjin dan membenamkannya ke dalam mana-mana aplikasi. Enjin JavaScript V8 tidak terhad kepada berjalan dalam satu pelayar. Jadi Node sebenarnya mengambil enjin JavaScript V8 yang ditulis oleh Google dan membinanya semula untuk berfungsi pada pelayan. Ia sempurna! Mengapa mencipta bahasa baharu apabila penyelesaian yang baik sudah tersedia?
Pengaturcaraan dipacu acara
Ramai pengaturcara telah dididik untuk mempercayai bahawa pengaturcaraan berorientasikan objek ialah reka bentuk pengaturcaraan yang sempurna, yang menjadikan mereka menolak kaedah pengaturcaraan lain. Node menggunakan model pengaturcaraan dipacu peristiwa yang dipanggil.
Penyenaraian 1. Pengaturcaraan dipacu acara menggunakan jQuery pada klien
// Apabila butang ditekan, Peristiwa berlaku - berurusan dengannya
// terus di sini dalam fungsi tanpa nama, di mana semua
// pembolehubah yang diperlukan ada dan boleh dirujuk terus
$("#myButton").klik(function(){
Jika ($("#myTextField").val() != $(this).val())
alert("Medan mesti sepadan dengan teks butang");
});
Sebenarnya, tiada beza antara sisi pelayan dan sisi klien. Ya, tiada butang mengklik atau menaip ke dalam medan teks, tetapi pada tahap yang lebih tinggi, peristiwa sedang berlaku. Sambungan diwujudkan, ini adalah acara! Data diterima melalui sambungan, yang juga merupakan peristiwa! Data berhenti mengalir melalui sambungan, ini masih merupakan peristiwa!
Mengapakah jenis persediaan ini sesuai untuk Node? JavaScript ialah bahasa pengaturcaraan yang dipacu peristiwa yang hebat kerana ia membenarkan penggunaan fungsi dan penutupan tanpa nama, dan yang lebih penting, sintaksnya biasa kepada sesiapa sahaja yang mempunyai kod bertulis. Fungsi panggil balik yang dipanggil apabila peristiwa berlaku boleh ditulis pada titik di mana peristiwa itu ditangkap. Ini menjadikan kod itu mudah untuk ditulis dan diselenggara, tanpa rangka kerja berorientasikan objek yang kompleks, tiada antara muka dan tiada kemungkinan terlalu banyak kejuruteraan. Hanya dengar acara itu, tulis fungsi panggil balik dan biarkan sistem mengendalikan segala-galanya!
Aplikasi Nod Contoh
Akhir sekali, mari lihat beberapa kod! Mari kita letakkan semua yang telah kita bincangkan bersama untuk mencipta aplikasi Node pertama kita. Kami sedia maklum bahawa Node sesuai untuk mengendalikan aplikasi trafik tinggi, jadi kami akan mencipta aplikasi web yang sangat mudah, yang dibina untuk kelajuan maksimum. Berikut ialah keperluan khusus daripada "bos" untuk aplikasi sampel kami: Cipta API RESTful penjana nombor rawak. Aplikasi ini harus menerima satu input: parameter bernama "nombor". Aplikasi kemudian mengembalikan nombor rawak antara 0 dan parameter ini dan mengembalikan nombor yang terhasil kepada pemanggil. Memandangkan "bos" mahu aplikasi itu menjadi aplikasi yang popular secara meluas, ia sepatutnya dapat mengendalikan 50,000 pengguna serentak. Mari lihat kod berikut:
Penyenaraian 2. Nod penjana nombor rawak
// Baris paling penting dalam mana-mana fail Nod. Fungsi ini
// melakukan proses sebenar mencipta pelayan. Secara teknikalnya,
// Node memberitahu sistem pengendalian asas bahawa apabila a
// sambungan dibuat, fungsi panggil balik khusus ini seharusnya
// dilaksanakan. Memandangkan kami sedang mencipta perkhidmatan web dengan REST API,
// kami mahukan pelayan HTTP, yang memerlukan pembolehubah http
// kami buat dalam baris di atas.
// Akhir sekali, anda boleh melihat bahawa kaedah panggil balik menerima 'permintaan'
// dan objek 'respons' secara automatik. Ini sepatutnya biasa
// kepada mana-mana pengaturcara PHP atau Java.
http.createServer(fungsi(permintaan, respons) {
// Respons perlu mengendalikan semua pengepala dan kod pulangan
// Jenis perkara ini dikendalikan secara automatik dalam program pelayan
// seperti Apache dan Tomcat, tetapi Node memerlukan segala-galanya untuk dilakukan sendiri
response.writeHead(200, {"Content-Type": "text/plain"});
// Berikut ialah beberapa kod yang kelihatan unik. Beginilah cara Node mendapatkan semula
// parameter diluluskan dari permintaan klien. Modul url
// mengendalikan semua fungsi ini. Fungsi parse
// menyahbina URL dan meletakkan nilai kunci pertanyaan dalam
// objek pertanyaan. Kita boleh mencari nilai untuk kunci "nombor"
// dengan merujuknya terus - keindahan JavaScript.
var params = url.parse(request.url, true).query;
input var = params.number;
// Ini ialah kaedah JavaScript generik yang akan mencipta
// nombor rawak kami yang dihantar semula kepada pemanggil
var numInput = Nombor baharu(input);
var numOutput = Nombor baharu(Math.random() * numInput).toFixed(0);
// Tulis nombor rawak untuk respons
response.write(numOutput);
// Node memerlukan kami menamatkan sambungan ini secara eksplisit. Ini kerana
// Nod membolehkan anda mengekalkan sambungan terbuka dan menghantar data ke sana ke mari,
// walaupun topik lanjutan itu tidak dibincangkan dalam artikel ini.
response.end();
// Apabila kami membuat pelayan, kami perlu menyambungkan pelayan HTTP secara eksplisit ke
// sebuah pelabuhan. Port HTTP standard ialah 80, jadi kami akan menyambungkannya ke port itu.
}).dengar(80);
// Keluarkan String ke konsol sebaik sahaja pelayan dimulakan, memberitahu kami segala-galanya
// bermula dengan betul
console.log("Random Number Generator Running...");
启动应用程序
将上面的代码放入一个名为 “random.js” 的文件中。现在,要启动这个应用程序应用程序应用程序年年家服务器并监听端口 80 上的连接),只需在您的命令提示中输入以下命令:% node random.js。下面是服务器已经启动并运行时看起来>的时看起来>的校起子
Akses Apl
Aplikasi sedang aktif dan berjalan. Node sedang mendengar semua sambungan, mari kita ujinya. Memandangkan kami mencipta API RESTful yang mudah, aplikasi itu boleh diakses menggunakan pelayar web. Taip alamat berikut (pastikan anda telah melengkapkan langkah di atas): http://localhost/?number=27.
Tetingkap penyemak imbas anda akan bertukar kepada nombor rawak antara 0 dan 27. Klik butang "muat semula" pada penyemak imbas anda dan anda akan mendapat satu lagi nombor rawak. Itu sahaja, aplikasi Nod pertama anda!
Apakah kebaikan Node?
Pada ketika ini, anda mungkin boleh menjawab soalan "Apa itu Node", tetapi anda mungkin juga mempunyai soalan lain: "Untuk apa Node ini digunakan?" boleh mendapat manfaat pada Node.
Apakah kebaikannya?
Seperti yang anda lihat sebelum ini, Node bagus untuk situasi di mana anda menjangkakan trafik yang berpotensi tinggi, tetapi tidak semestinya banyak logik dan pemprosesan bahagian pelayan diperlukan sebelum bertindak balas kepada pelanggan. Contoh biasa Node cemerlang termasuk:
API REHAT
Perkhidmatan web yang menyediakan API RESTful menerima beberapa parameter, menghuraikannya, memasang respons dan mengembalikan respons (biasanya kurang teks) kepada pengguna. Ini adalah situasi yang ideal untuk Node kerana anda boleh membinanya untuk mengendalikan berpuluh-puluh ribu sambungan. Ia masih tidak memerlukan banyak logik; ia pada asasnya hanya mencari beberapa nilai daripada beberapa pangkalan data dan menyusunnya menjadi respons. Memandangkan respons ialah sejumlah kecil teks dan permintaan masuk ialah sejumlah kecil teks, trafik tidak tinggi dan satu mesin boleh mengendalikan keperluan API walaupun syarikat paling sibuk.
Baris Gilir Twitter
Bayangkan syarikat seperti Twitter yang perlu menerima tweet dan menulisnya ke dalam pangkalan data. Pada hakikatnya, dengan hampir beribu-ribu tweet tiba sesaat, adalah mustahil untuk pangkalan data mengendalikan bilangan penulisan yang diperlukan pada waktu puncak tepat pada masanya. Node menjadi bahagian penting dalam penyelesaian masalah ini. Seperti yang anda lihat, Node boleh mengendalikan puluhan ribu tweet masuk. Ia dengan cepat dan mudah menulisnya ke mekanisme baris gilir dalam memori (seperti memcached), dari mana proses berasingan boleh menulisnya ke pangkalan data. Peranan Node di sini adalah untuk mengumpul tweet dengan cepat dan menyampaikan maklumat ini kepada proses lain yang bertanggungjawab untuk menulis. Bayangkan reka bentuk alternatif (di mana pelayan PHP biasa akan cuba mengendalikan penulisan ke pangkalan data itu sendiri): setiap tweet akan menyebabkan kelewatan singkat untuk ditulis ke pangkalan data kerana panggilan pangkalan data menyekat saluran. Mesin yang direka bentuk dengan cara ini mungkin hanya boleh mengendalikan 2000 tweet masuk sesaat disebabkan kependaman pangkalan data. Memproses 1 juta tweet sesaat memerlukan 500 pelayan. Sebaliknya, Node mengendalikan setiap sambungan tanpa menyekat saluran, membenarkannya menangkap tweet sebanyak mungkin. Mesin Node yang boleh mengendalikan 50,000 tweet memerlukan hanya 20 pelayan.
Statistik Permainan Video
Jika anda telah bermain permainan Call of Duty dalam talian, anda akan segera menyedari sesuatu apabila anda melihat statistik permainan: Untuk menjana tahap statistik itu, anda perlu menjejaki sejumlah besar maklumat. Dengan cara ini, jika terdapat berjuta-juta pemain bermain dalam talian pada masa yang sama, dan mereka berada dalam kedudukan yang berbeza dalam permainan, sejumlah besar maklumat boleh dijana dengan cepat. Node ialah penyelesaian yang bagus untuk senario ini kerana ia menyerap data yang dijana oleh permainan, melakukan penggabungan minimum data, dan kemudian baris gilir data supaya ia boleh ditulis ke pangkalan data. Menggunakan keseluruhan pelayan untuk menjejaki berapa banyak peluru yang ditembakkan oleh pemain dalam permainan kelihatan bodoh, dan jika anda menggunakan pelayan seperti Apache mungkin terdapat beberapa batasan yang berguna tetapi sebaliknya, jika anda menggunakan pelayan khusus untuk menjejaki semua statistik untuk Data permainan , seperti yang anda akan lakukan dengan pelayan yang menjalankan Node, itu kelihatan seperti langkah pintar.
Modul nod
Walaupun bukan topik asal artikel ini, artikel ini telah dikembangkan untuk memasukkan pengenalan kepada Modul Nod dan Pengurus Pakej Nod kerana pembaca yang popular. Sama seperti pembangun yang biasa menggunakan Apache, anda juga boleh melanjutkan fungsi Node dengan memasang modul. Walau bagaimanapun, modul yang tersedia untuk Node sangat meningkatkan produk, dan modul tersebut sangat berguna sehingga pembangun yang akan menggunakan Node biasanya akan memasang beberapa daripadanya. Oleh itu, modul menjadi lebih penting, malah menjadi bahagian penting dalam keseluruhan produk.
Dalam bahagian "Rujukan", saya telah menyediakan pautan ke halaman modul, yang menyenaraikan semua modul yang tersedia. Untuk menunjukkan kemungkinan yang modul boleh tawarkan, saya telah memasukkan modul berikut di antara berdozen yang tersedia: satu untuk menulis halaman yang dibuat secara dinamik (seperti PHP), satu untuk memudahkan penggunaan MySQL dan satu untuk membantu menggunakan WebSockets dan modul untuk membantu dengan penghuraian teks dan parameter. Saya tidak akan menerangkan secara terperinci tentang modul ini kerana artikel gambaran keseluruhan ini bertujuan untuk membantu anda memahami Node dan menentukan sama ada anda perlu mempelajari lebih mendalam (sekali lagi), dan jika anda melakukannya, maka anda pasti akan berpeluang menggunakan modul yang ada.
Selain itu, ciri Node ialah Modul Pakej Nod, yang merupakan ciri terbina dalam untuk memasang dan mengurus modul Node. Ia mengendalikan kebergantungan secara automatik, jadi anda boleh yakin: mana-mana modul yang anda mahu pasang akan dipasang dengan betul dan termasuk kebergantungan yang diperlukan. Ia juga menyokong penerbitan modul anda sendiri kepada komuniti Node, sekiranya anda memilih untuk menyertai komuniti dan menulis modul anda sendiri. Anda boleh menganggap NPM sebagai kaedah yang membolehkan anda memanjangkan fungsi Node dengan mudah tanpa perlu risau tentang memecahkan pemasangan Node anda. Begitu juga, jika anda memilih untuk menyelami Node, NPM akan menjadi bahagian penting dalam penyelesaian Node anda.
Kesimpulan
Selepas membaca artikel ini, soalan yang anda ada pada permulaan artikel ini "Apakah sebenarnya Node.js itu sepatutnya dijawab dan anda sepatutnya dapat menjawab soalan ini dalam beberapa ayat yang jelas dan ringkas. Jika ya, anda sudah mendahului ramai pengaturcara. Saya telah bercakap dengan ramai orang tentang Node, tetapi mereka sentiasa keliru tentang kegunaan Node sebenarnya. Maklumlah, mereka mempunyai cara berfikir Apache, di mana pelayan adalah aplikasi, anda meletakkan fail HTML di dalamnya dan semuanya berfungsi. Memandangkan kebanyakan pengaturcara sudah biasa dengan Apache dan kegunaannya, cara paling mudah untuk menerangkan Node ialah membandingkannya dengan Apache. Node ialah program yang boleh melakukan semua yang Apache boleh lakukan (dengan bantuan beberapa modul), dan banyak lagi sebagai platform JavaScript yang boleh dikembangkan yang boleh anda bina.
Seperti yang anda lihat daripada artikel ini, Node mencapai matlamatnya untuk menyediakan pelayan yang sangat berskala. Ia menggunakan enjin JavaScript yang sangat pantas daripada Google, enjin V8. Ia menggunakan reka bentuk dipacu peristiwa untuk memastikan kod minimum dan mudah dibaca. Semua faktor ini menyumbang kepada matlamat ideal Node untuk menjadikannya lebih mudah untuk menulis penyelesaian yang sangat berskala.
Sama pentingnya memahami apa itu Node, adalah memahami apa yang bukan Node. Node bukan sekadar pengganti Apache, ia direka untuk menjadikan aplikasi web PHP lebih mudah untuk skala. Tidak ada yang lebih jauh dari kebenaran. Walaupun Node masih di peringkat awal, ia berkembang dengan sangat cepat, penyertaan komuniti sangat tinggi, dan ahli komuniti telah mencipta begitu banyak modul yang hebat sehingga dalam masa setahun, produk yang berkembang ini boleh berada dalam perniagaan anda.