Ini adalah kelanjutan dari artikel " Kami menulis microservice pertama di Node.js dengan komunikasi melalui RabbitMQ ", yang diterima dengan baik oleh pengguna Habr.
Pada artikel ini saya akan berbicara tentang bagaimana berkomunikasi dengan benar antara layanan microser sehingga layanan microser tetap terisolasi.
Bagaimana tidak melakukannya
Mengapa Anda perlu berkomunikasi di antara layanan microser? Gunakan satu database, baca dari sana apa yang Anda inginkan - bisnis sesuatu!
Tidak, Anda tidak bisa melakukannya. Konsep layanan mikro adalah bahwa mereka terisolasi satu sama lain, tidak ada yang tahu apa-apa tentang siapa pun (secara praktis). Kemungkinan besar, di masa depan, ketika sistem mulai tumbuh, Anda akan ingin memperluas fungsionalitas dan Anda perlu berkomunikasi antara layanan microser: misalnya, pengguna membeli produk, jadi Anda perlu mengirim pemberitahuan tentang penjualan kepada penjual.
Manfaat isolasi
Keandalan
Misalkan ada aplikasi monolitik di mana ada beberapa pengontrol:
- Produk
- Diskon
- Blog
- Pengguna
Suatu hari, database kami menurun: sekarang kami tidak bisa mendapatkan produk, tidak ada diskon, tidak ada posting blog, tidak ada pengguna. Situs ini sama sekali tidak tersedia, pelanggan tidak bisa masuk, bisnis kehilangan keuntungan.
Apa yang akan terjadi dalam arsitektur layanan mikro?
Di alam semesta lain, pada hari yang sama basis data layanan pengguna mikro jatuh, menjadi tidak dapat diakses: pengguna tidak dapat keluar, mendaftar dan masuk. Tampaknya semuanya buruk dan bisnisnya juga merugi, tetapi tidak: pembeli potensial dapat melihat barang yang tersedia, membaca blog perusahaan, dan menemukan diskon.
Karena setiap microservice memiliki database sendiri, efek samping menjadi jauh lebih sedikit.
Ini disebut degradasi bertahap .
Abstraksi
Dalam aplikasi besar, sangat sulit untuk berkonsentrasi pada satu tugas, karena mengubah beberapa middleware kecil dapat merusak beberapa jenis pengontrol. Ingin menggunakan klien baru untuk redis - tidak, Anda tidak bisa, pengontrol yang kami tulis tiga tahun lalu menggunakan versi 0.1.0. Ingin akhirnya memanfaatkan fitur baru Node.js 10? Atau mungkin 12? Maaf, tetapi monolith menggunakan versi 6.
Bagaimana cara berkomunikasi
Karena kami mulai berbicara tentang contoh "pengguna membeli produk, kami mengirimkan pemberitahuan penjualan kepada penjual", maka kami akan menerapkannya.
Skemanya adalah sebagai berikut:
- Pengguna mengirimkan permintaan ke pasar layanan-mikro untuk membeli barang-barang di tautan / pasar / beli /: id
- Bendera ditulis dalam database bahwa produk itu dijual
- Dari pasar microservice, permintaan dikirim ke pemberitahuan microservice, di mana klien terhubung melalui WebSocket
- Notifikasi Microservice mengirimkan pesan kepada penjual tentang penjualan barang
Instal MicroMQ
$ npm i micromq@1 -S
Menulis gateway
const Gateway = require('micromq/gateway');
Gateway kami hanya terdiri dari satu titik akhir, tetapi ini sudah cukup untuk contoh dan pelatihan.
Menulis pemberitahuan layanan mikro
const MicroMQ = require('micromq'); const WebSocket = require('ws');
Di sini kita meningkatkan server soket web dan layanan microser pada saat yang sama untuk menerima permintaan untuk soket web dan RabbitMQ.
Skemanya adalah sebagai berikut:
- Seorang pengguna terhubung ke server soket web kami
- Pengguna diotorisasi dengan mengirimkan acara
authorize
dengan userId di dalamnya - Kami menjaga koneksi pengguna sehingga Anda dapat mengirim pemberitahuan kepadanya di masa mendatang
- Suatu acara tiba di RabbitMQ bahwa Anda harus mengirim pemberitahuan kepada pengguna
- Memeriksa validitas data yang masuk
- Dapatkan koneksi pengguna
- Kirim pemberitahuan
Menulis pasar layanan-mikro
const MicroMQ = require('micromq'); const { Items } = require('./api/mongodb');
Skemanya adalah sebagai berikut:
- Kami menerima permintaan pengguna untuk pembelian suatu barang
- Kami sedang mencari item dengan id yang tepat dan memastikan bahwa itu belum dijual
- Tandai item sebagai terjual
- Kami mengirim pemberitahuan kepada penjual tentang penjualan di latar belakang
- Kami menanggapi klien
Periksa
- Kami memulai 3 proses
- Kami akan mengirim POST / pasar / beli / 1
- Kami mendapat respons
{ ok: true }
- Penjual menerima pemberitahuan
$ PORT=9000 node ./src/gateway.js $ PORT=9001 node ./src/notifications.js $ MONGODB_URL=mongodb://localhost:27017/my-super-microservice node ./src/market.js
