project omega
Pola arsitektur web perusahaan terakhir yang Anda perlukan. Sampai yang berikutnya.
TL;DR
Tujuannya adalah untuk mengoptimalkan pengalaman pengembang dengan mampu:
- Berkembang secara lokal seolah-olah itu adalah sebuah monolit
- Terapkan sebagai layanan mikro terpisah
- Simulasikan lingkungan produksi secara lokal menggunakan buruh pelabuhan
Demo
project omega Bukti Konsep - Microservices Monolith Hybrid
demo project omega - Microserves Kubernetes dan Penerapan Kontainer Mandiri
Mengapa
Saya ingin membuktikan bahwa kita tidak perlu mengorbankan efisiensi pengembang untuk mendapatkan skalabilitas. Diskusi lebih lanjut tentang pro dan kontra layanan mikro dan monolit di sini: Layanan Mikro dan Monolit.
Kesan saya adalah banyak pakar industri ingin kita percaya bahwa ini adalah 3 pilihan utama kita:
- Monolit
- Layanan mikro
- "Hybrid" (sebenarnya bukan hybrid, baik monolit maupun beberapa layanan mikro)
Saya ingin menunjukkan bahwa kita tidak harus memilih salah satu dari pilihan ini. Dengan sedikit kreativitas kita dapat memiliki "hibrida" sejati yang merupakan monolit dan serangkaian layanan mikro. Dengan strategi saya saat ini, saya rasa kita tidak bisa menghilangkan semua kelemahan monolit dan layanan mikro, namun kita bisa menghilangkan banyak kelemahan dari keduanya.
Apa yang Bukan
- Saya tidak mencoba membuat kerangka kerja (setidaknya belum...). Saya hanya menyusun semua Lego yang saya miliki ke dalam konfigurasi berbeda sebagai percobaan.
- Ini tidak dimaksudkan sebagai proyek komunitas. Saya bermaksud untuk sering melakukan perubahan drastis tanpa pemberitahuan. Jika konsep ini menarik bagi Anda dan Anda ingin berkontribusi, hubungi saya terlebih dahulu.
Tujuan Proyek
- Buat pola yang akan berfungsi untuk proyek-proyek sebagai proyek hobi pengembang tunggal kecil dan juga berskala hingga puluhan atau bahkan ratusan pengembang yang mengerjakan aplikasi web perusahaan besar dan kompleks.
- Mampu berkembang secara lokal seolah-olah itu adalah sebuah monolit:
- Satu repositori. Untuk semua alasan yang sama, perusahaan memilih pendekatan monorepo.
- Maksimum 3 proses untuk dijalankan (ui klien, server, ketergantungan buruh pelabuhan dengan database, antrian pesan, dll). Kami tidak ingin halaman dokumen pengaturan aktif dan berjalan.
- Dapat diterapkan sebagai layanan mikro.
- Mampu mensimulasikan lingkungan produksi dengan layanan mikro yang berjalan di kontainer buruh pelabuhan.
- Waktu pengaturan yang sangat cepat. Semua dependensi selain Node dan .NET harus disertakan sebagai dependensi buruh pelabuhan (database, antrian pesan, dll). Pengguna baru harus dapat menginstal .NET, Node, mengkloning repo, lalu menjalankan perintah instal dan jalankan.
- Reload panas yang sangat cepat untuk klien dan server di lingkungan pengembangan.
- Mampu mengembangkan dan menjalankan aplikasi pada Windows, Linux dan Mac.
- Dapat dengan cepat menjalankan layanan baru.
Tumpukan Teknologi
Tumpukan teknologi sebagian besar tidak relevan untuk konsep tingkat tinggi yang saya coba buktikan, tetapi untuk proyek ini saya akan menggunakan:
- .NET 5 untuk layanan
- React front-end (aplikasi buat-reaksi dasar dengan skrip ketikan)
- Buruh pelabuhan
Konsep Tingkat Tinggi
Perusahaan dengan aplikasi besar semakin didorong ke arah layanan mikro sehingga mereka dapat berkembang secara horizontal (di antara alasan lainnya). Jadi, untuk mencapai hal itu kita melihat sesuatu seperti berikut:
Berikut adalah versi lain yang menunjukkan salah satu cara penerapan penskalaan horizontal:
Begitu kita menempuh jalur ini, kita akan menghadapi masalah nyata dalam pembangunan lokal. Hal ini sangat bergantung pada seperti apa produknya, berapa banyak pengembang yang ada, dan siapa yang mengerjakan apa, seberapa sering. Meskipun demikian, sebagian besar perusahaan yang memilih layanan mikro akan berakhir dalam situasi di mana pengembang harus membuat beberapa pilihan sulit tentang bagaimana melakukan pengembangan sehari-hari. Dengan project omega , tujuannya adalah untuk menunjukkan bahwa kita dapat menghilangkan overhead dalam menjalankan layanan secara lokal dengan menggabungkan semuanya ke dalam satu aplikasi saat dijalankan secara lokal:
Berikut struktur foldernya:
Dan inilah tampilan yang diterapkan sebagai layanan mikro:
Setiap instance memiliki salinan semua kode tetapi hanya menjalankan inisialisasi, rute titik akhir layanan, dan proses pekerja untuk layanan mikro tertentu.
Inilah sebabnya mengapa sangat mudah untuk menjalankan aplikasi secara lokal sebagai monolit karena kita cukup mencari variabel lingkungan bernama SERVICE_KEY
atau jika tidak ada, inisialisasi semua layanan.
Contoh inisialisasi khusus layanan lainnya:
- Pengaturan injeksi ketergantungan
- String koneksi basis data
- Migrasi basis data
- Inisialisasi antrian pesan
- Siapkan konektivitas cache terdistribusi
- Penyiapan konektivitas sumber daya cloud lainnya
- Inisialisasi API pihak ketiga
Saat Startup dipanggil, Startup akan memindai rakitan untuk tipe yang mewarisi ProjectOmegaService
, membuat instance, dan menjalankan logika inisialisasi layanan tersebut. Saat dijalankan secara lokal, itu akan menjalankan semuanya.
Petunjuk Pengaturan
Instal prasyarat:
- .NET 5
- simpul
- Benang
- Buruh pelabuhan
Perhatikan bahwa menjalankan buruh pelabuhan versi terbaru di windows mungkin memerlukan beberapa langkah tambahan jika Anda sudah lama tidak melakukannya, seperti menginstal WSL 2 dan menyegarkan distro WSL Anda. Ikuti instruksi apa pun di situs web Docker.
Tangga:
- Kloning repo ini
- Di terminal dari repo root, jalankan
yarn run installAll
- Jika Anda ingin menjalankan SQL server pada port selain 1434:
- Jalankan
yarn run syncEnvFiles
- Ubah
OMEGA_DEFAULT_DB_PORT
dan OMEGA_MSSQL_HOST_PORT
di .env.server
- Mulai dependensi menggunakan perintah
yarn run dockerDepsUpDetached
- Jalankan migrasi DB saat pertama kali Anda menjalankannya, atau saat Anda mendapatkan perubahan orang lain dengan pembaruan basis data:
yarn run dbMigrate
- Jalankan aplikasi dalam mode pengembangan lokal menggunakan salah satu opsi berikut:
- Opsi 1: di terminal dari repo root run
yarn run both
(ini digunakan secara bersamaan untuk menjalankan perintah dari opsi 2) - Opsi 2: gunakan 2 terminal terpisah. Di satu terminal jalankan
yarn run client
dan di terminal lainnya yarn run server
- Akses https://localhost:3000 (klik melewati peringatan https)
Sebelum menjalankan pengujian unit dengan dotnet test
untuk pertama kalinya atau setelah menambahkan pengujian unit pada skema DB baru:
- Mulai dependensi jika belum berjalan dengan
yarn run dockerDepsUpDetached
- Jalankan
yarn run testDbMigrate
- Kemudian jalankan
dotnet test
Untuk mensimulasikan produksi dan layanan mikro di buruh pelabuhan:
- Pastikan dependensi buruh pelabuhan berjalan dengan
yarn run dockerDepsUpDetached
- Di terminal dari root repo, jalankan
yarn run dockerRecreateFull
- Akses https://localhost:3000 (klik melewati peringatan https)
Langkah Selanjutnya
- Perubahan pencatatan
- Bereksperimenlah dengan pemformat Serilog json
- Tambahkan ID korelasi dan info kontekstual lainnya ke entri log
- Tambahkan dokumentasi tambahan
- Diagram cara kerja simulasi buruh pelabuhan
- Ketergantungan buruh pelabuhan
- Deskripsi teks tentang apa itu, cara kerjanya
- Diagram bagaimana deps buruh pelabuhan cocok dengan proses pengembangan
- Dokumentasi perutean/proksi
- Migrasi DB
- Tes RPC antar layanan alih-alih panggilan http rest (mungkin dengan sesuatu seperti ini: https://github.com/aspnet/AspLabs/tree/main/src/GrpcHttpApi)
- Tambahkan ke kelas dasar klien antar layanan untuk penanganan kesalahan abstrak dan pencatatan log
- Implementasi autentikasi
- Pendaftaran situs front-end
- Layanan ke layanan autentikasi (OAuth?)
- Pembuatan dokumentasi otomatis (keluaran dokumentasi angkuh dan html xml)
- Pengaturan antrian dan layanan proses pekerja
- Definisi antrian abstrak (untuk memungkinkan penggunaan layanan cloud sebagai opsi)
- Layanan jenis proses pekerja dasar dengan loop peristiwa mencari pesan
- RabbitMQ di docker-compose.deps.yml
- Implementasi dasar RabbitMQ dihubungkan ke layanan proses pekerja
- Pekerjaan demo kubernetes lokal tambahan
- Basis data mungkin memerlukan pembelajaran cara menggunakan volume persisten kubernetes, kecuali saya dapat menemukan cara menyesuaikan jaringan untuk mengekspos DB host
- Tambahkan Seq atau jadikan fungsionalitas Seq opsional dan jangan gunakan itu saat berjalan di kubernetes
- Proyek meta/skrip untuk menganalisis solusi
- Analisis layanan yang terpengaruh berdasarkan file yang diubah (untuk rincian penerapan)
- Perancah proyek:
- Kemampuan untuk membuat salinan baru proyek menggunakan beberapa "kunci" proyek lain selain Omega untuk semua nama proyek/direktori
- Kemampuan untuk membuat proyek baru menjalankan kontainer buruh pelabuhan dan melakukan pengujian integrasi secara efektif untuk memastikan keberhasilan pembuatan proyek baru
Lain-lain
Jika Anda mengembangkan di linux, Anda mungkin mengalami kesalahan ini saat memulai server:
System.AggregateException: Satu atau lebih kesalahan terjadi. (Batas pengguna yang dikonfigurasi (128) pada jumlah instance inotify telah tercapai, atau batas per proses pada jumlah deskriptor file terbuka telah tercapai.)
Hal ini kemungkinan disebabkan oleh terlalu banyak file watch yang digunakan oleh vscode. Anda dapat meningkatkan batas inotify
instance Anda (bukan hanya batas jam tangan, yang mungkin sudah ditetapkan sangat tinggi di file /etc/sysctl.conf
Anda) dengan menjalankan perintah ini:
echo fs.inotify.max_user_instances=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
Dokumentasi Lainnya
Analisis manfaat biaya pola desain: DesignPatternCostBenefit.md
Variasi pola desain: DesignPatternVariations.md
Keputusan: Keputusan.md
Filosofi dan Kata-kata kasar Pengembangan Perangkat Lunak: https://Gist.github.com/mikey-t/3d5d6f0f5316abf9e74fb553be9fdef3