1.1 Arsitektur aplikasi

Kursus ini dirancang untuk pemula, karena Anda tidak akan merancang arsitektur aplikasi yang serius untuk waktu yang lama. Tapi jangan khawatir, arsitektur yang baik adalah pengecualian daripada aturannya. Sangat sulit untuk memilih arsitektur aplikasi yang tepat sebelum membangun aplikasi.

Contoh arsitektur populer untuk aplikasi server besar:

  • Arsitektur berlapis (Layered Architecture).
  • Arsitektur Berjenjang.
  • Arsitektur Berorientasi Layanan (SOA).
  • Arsitektur layanan mikro (Arsitektur Layanan Mikro).

Masing-masing dari mereka memiliki pro dan kontra. Tetapi mempelajarinya tidak akan memberi Anda apa pun. Arsitektur adalah jawaban atas pertanyaan "bagaimana mengatur interaksi ribuan objek dalam sistem" . Dan sampai Anda mengalami kerumitan penuh dari masalah tersebut, Anda tidak akan dapat memahami keserbagunaan penuh dari solusi tersebut.

Semua aplikasi menggunakan beberapa jenis arsitektur, atau setidaknya berpura-pura. Oleh karena itu, pengetahuan tentang pendekatan populer untuk desain aplikasi akan memungkinkan Anda untuk memahami cara kerja aplikasi dengan lebih cepat dan lebih baik. Dan itu berarti membuat perubahan tepat di tempat yang Anda butuhkan.

Apa yang dimaksud dengan "buat perubahan jika perlu"? Apakah ada tempat di mana Anda tidak perlu melakukan perubahan? Tepat.

Untuk lebih spesifik, katakanlah Anda sedang mengerjakan proyek backend menengah . Itu telah ditulis selama 5 tahun oleh tim yang terdiri dari 20 orang. Proyek ini memakan waktu 100 tahun kerja dan berisi sekitar 100 ribu baris kode. Totalnya terdiri dari dua ribu kelas yang terbagi menjadi 10 modul dengan ukuran berbeda.

Dan tambahkan kenyataan pahit. Logika beberapa tugas tersebar di beberapa modul. Selain itu, logika bisnis dapat berada di frontend (ditulis dalam JavaScript) dan/atau ditulis sebagai prosedur tersimpan langsung di database. Apakah Anda masih yakin bahwa Anda dapat segera menentukan tempat yang tepat untuk melakukan perubahan ?

Ini bukan mimpi buruk yang kubuat untuk menakutimu. Ini adalah proyek tipikal. Itu terjadi bahkan lebih buruk. Mengapa ini terjadi? Ada banyak alasan, tetapi hampir selalu ada seperti itu:

  • Banyak orang mengerjakan proyek - masing-masing dari mereka melihatnya sedikit berbeda.
  • Selama 5 tahun, 10 orang telah berubah dalam proyek tersebut, pendatang baru tidak terlalu memahaminya.
  • Membuat perangkat lunak adalah membuat perubahan terus-menerus yang terus-menerus mengubah segalanya.
  • Lima tahun lalu, ketika kami memutuskan arsitekturnya, ide proyeknya agak berbeda.

Tetapi hal utama adalah bahwa terlepas dari arsitektur proyeknya, semua pemrogram yang mengerjakannya memiliki pemahaman yang sama tentang cara kerja proyek ini. Mari kita mulai dengan konsep paling sederhana - arsitektur client-server.

1.2 Konsep interaksi client-server

Sekarang kita akan memahami konsep yang mendasari arsitektur klien-server dan akan memungkinkan Anda untuk lebih memahami bagaimana interaksi jutaan program di Internet diatur.

Sesuai namanya, konsep ini melibatkan dua pihak: client dan server . Semuanya seperti dalam kehidupan di sini: klien adalah pelanggan dari layanan ini atau itu, dan server adalah penyedia layanan. Klien dan server secara fisik adalah program , misalnya klien tipikal adalah browser .

Contoh berikut dapat diberikan sebagai server:

  • Server web seperti Tomcat.
  • Database server seperti MySQL.
  • Gateway pembayaran seperti Stripe.

Klien dan server biasanya berkomunikasi melalui Internet (walaupun mereka dapat bekerja di jaringan area lokal yang sama dan secara umum di semua jenis jaringan lainnya). Komunikasi terjadi melalui protokol standar seperti HTTP, FTP, atau protokol tingkat rendah seperti TCP atau UDP.

Protokol biasanya dipilih sesuai dengan jenis layanan yang disediakan server. Misalnya, jika itu adalah panggilan video, maka UDP biasanya digunakan.

Ingat cara kerja Tomcat dan servletnya? Server menerima pesan HTTP, membukanya, mengekstrak semua informasi yang diperlukan dari sana dan meneruskannya ke servlet untuk diproses. Kemudian hasil pemrosesan dikemas kembali menjadi respons HTTP dan dikirim ke klien.

Ini adalah interaksi klien-server yang khas. Browser adalah klien web dan Tomcat adalah server web. Tomcat bahkan disebut server web.

Namun jika dipikir-pikir, yang penting bukanlah nama, tetapi esensinya - pembagian peran antar program. Skrip JS Anda yang berjalan di halaman HTML bisa disebut sebagai klien , dan servlet Anda sebagai server . Bagaimanapun, mereka bekerja berpasangan dalam kerangka konsep client-server .

1.3 Nuansa penting

Perlu juga dicatat bahwa interaksi klien-server didasarkan pada prinsip bahwa interaksi tersebut dimulai oleh klien : server hanya menjawab klien dan melaporkan apakah dapat memberikan layanan kepada klien dan, jika demikian, pada kondisi apa .

Tidak masalah di mana klien berada secara fisik dan di mana server berada. Perangkat lunak klien dan perangkat lunak server biasanya diinstal pada mesin yang berbeda, tetapi juga dapat berjalan di komputer yang sama.

Konsep ini dikembangkan sebagai langkah awal menuju penyederhanaan sistem yang kompleks. Dia memiliki kekuatan ini:

  • Penyederhanaan logika : server tidak tahu apa-apa tentang klien dan bagaimana ia akan menggunakan datanya di masa mendatang.
  • Mungkin ada klien yang lemah : semua tugas intensif sumber daya dapat ditransfer ke server.
  • Pengembangan independen kode klien dan kode server.
  • Banyak klien yang berbeda, misalnya Tomcat dan browser yang berbeda.

Versi paling dasar dari interaksi antara klien dan server ditunjukkan pada gambar:

server klien

Penting untuk mencatat dua detail di sini. Pertama, gambar menunjukkan bahwa banyak klien dapat mengakses satu server. Kedua, mereka dapat mengaksesnya secara bersamaan. Ini juga merupakan bagian penting dari server.

Satu klien biasanya berinteraksi dengan satu pengguna, sehingga seringkali bahkan otorisasi tidak diperlukan di sana. Namun, server memproses permintaan dari ribuan klien, dan saat mengembangkan kode untuknya, Anda harus dapat membedakan antara otorisasi dan otentikasi.

Penting juga bahwa server memproses ribuan permintaan secara paralel. Dan ini berarti bahwa saat mengembangkan kode backend, Anda harus selalu memikirkan tugas akses bersamaan ke sumber daya. Selain itu, kode server memiliki kemungkinan kondisi balapan (thread race) yang sangat tinggi, kebuntuan (saling memblokir utas).

Siklus hidup objek penting harus dipantau:

Anda tidak bisa memulai utas baru di server melalui new Thread().start(). Sebagai gantinya, Anda harus memiliki ThreadPool yang akan dibagikan di antara semua utas layanan.

Selain itu, Anda tidak dapat memulai tugas asinkron begitu saja, karena tugas tersebut juga dijalankan di utas terpisah. Saat membuat tugas seperti itu, Anda harus selalu mengetahui kumpulan utas mana yang menjalankannya dan apa yang akan terjadi jika kumpulan tersebut meluap.

Semua pekerjaan dengan file dan direktori harus dilakukan melalui try-with-resources. Jika dalam aplikasi biasa Anda lupa menutup aliran atau file, apakah itu masalah? Itu akan menutup sendiri ketika Anda keluar dari program. Tetapi jika Anda lupa menutup file di server di suatu tempat dalam kode, dan server Anda telah berjalan selama berbulan-bulan ... Segera, ribuan file yang tidak ditutup akan terakumulasi dan OS akan berhenti membuka file baru untuk dibaca (bekerja dengan file dikendalikan oleh OS). Teamlead tidak akan menepuk kepalamu...

1.4 Arsitektur klien-server

poin penting lainnya. Arsitektur client-server hanya mendefinisikan prinsip umum interaksi antar komputer , detail interaksi ditentukan oleh berbagai protokol.

Konsep ini (klien-server) memberi tahu kita bahwa kita perlu membagi mesin di jaringan menjadi mesin klien, yang selalu membutuhkan sesuatu, dan mesin server, yang memberikan apa yang mereka butuhkan. Dalam hal ini, klien selalu memulai interaksi, dan aturan terjadinya interaksi dijelaskan oleh protokol.

Ada dua jenis arsitektur interaksi klien-server: yang pertama disebut arsitektur klien-server dua tingkat, yang kedua adalah arsitektur klien-server multi-tingkat (kadang-kadang disebut arsitektur tiga tingkat atau arsitektur tiga tingkat, tapi ini adalah kasus khusus).

Prinsip pengoperasian arsitektur dua tingkat interaksi klien-server adalah bahwa pemrosesan permintaan terjadi pada satu server tanpa merujuk ke server lain dalam proses pemrosesan ini.

Model interaksi two-tier client-server dapat digambarkan sebagai diagram sederhana.

arsitektur dua tingkat dari interaksi klien-server

Di sini Anda dapat melihat bahwa level pertama adalah semua yang berhubungan dengan klien, dan level kedua adalah semua yang berhubungan dengan server.