Arhitekture web aplikacija: monolitna i uslužno orijentirana
doc. dr. sc. Vedran Miletić, vmiletic@inf.uniri.hr, vedran.miletic.net
Fakultet informatike i digitalnih tehnologija Sveučilišta u Rijeci, akademska 2021./2022. godina
Monolitna arhitektura (1/4)
🙋 Pitanje: Je li ovo monolitna web aplikacija?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>title</title>
<link rel="stylesheet" href="style.css">
<script src="script.js"></script>
</head>
<body>
<p>Hello, world!</p>
</body>
</html>
Monolitna arhitektura (2/4)
🙋 Pitanje: Je li ovo monolitna web aplikacija?
<?php
echo '<p>Hello, world!</p>\n';
Monolitna arhitektura (3/4)
Prema Wikipediji:
- aplikacija kojoj su korisničko sučelje i kod za pristup podacima su dio istog programa na istoj platformi (platforma je ovdje OS, programski jezik i biblioteke)
- aplikacija izvodi svaki korak potreban da bi se određena radnja izvela
- npr. restoran ima ponudu dnevnih specijaliteta dostupnih za van, online narudžbu, dostavu i knjigu žalbe te je sva ta funkcionalnost implementirana unutar jedne aplikacije
- izvorno je termin označavao aplikacije namijenjene za izvođenje na mainframeu pisane bez mogućnosti ponovnog iskorištavanja koda
- može biti višeslojna (engl. multitier, multilayer) kada odvaja pojedine funkcije u zasebne dijelove aplikacije
Monolitna arhitektura (4/4)
🙋 Pitanje: Je li ovo monolitna web aplikacija?
<html>
<head>
<title>Templating in Flask</title>
</head>
<body>
<h1>Hello {{ user }}!</h1>
<p>Welcome to the world of Flask!</p>
</body>
</html>
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/hello/<user>')
def hello_world(user=None):
return render_template('index.html', user=user)
Višeslojna arhitektura
Prema Wikipediji:
- odvojeni su prezentacijski sloj (korisničko sučelje), poslovna logika (obrada podataka) i sučelje prema pohrani podataka (najčešće relacijskoj bazi)
- programeri mogu dodavati ili mijenati funkcionalnost unutar određenog sloja umjesto rada odjednom na čitavoj aplikaciji, npr. Djangov model-pogled-predložak
Conwayev zakon
Izvor: Conway's Law (Comic Agilé #85)
Prema Wikipediji, američki računalni znanstvenik Melvin Conway je rekao:
Svaka organizacija koja dizajnira sustav (široko definiran) proizvest će dizajn čija je struktura kopija komunikacijske strukture organizacije.
Monolitna i mikrouslužna arhitektura
Mikrouslužna arhitektura (1/3)
Prema Wikipediji:
- usluge (engl. services) su procesi koji komuniciraju putem mreže korištenjem protokola neovisnog o tehnologiji (programski jezici, biblioteke i okviri)
- najčešće se koristi HTTP (REST, GraphQL), osobito u komunikaciji prednjeg dijela web aplikacije s mikrouslugama na stražnjem dijelu
- mogu se koristiti i drugi protokoli, npr. AMQP (RabbitMQ), Enduro/X, MQTT i ZMTP (ZeroMQ) i osobito su prikladni u situacijama kada je potrebno implementirati složenije komunikacijske uzorke
Mikrouslužna arhitektura (2/3)
Prema Wikipediji (nastavak):
- usluge su organizirane ovisno o poslovnim potrebama (npr. servis za upis studenata u višu godinu, servis za rad s ispitnim rokovima i servis za ispis svjedodžbi mogu biti različite aplikacije koje rade nad istom relacijskom bazom)
- usluge mogu biti organizirane u više slojeva (npr. glina i kamenje)
- usluge mogu po potrebi biti implementirane u različitim programskim jezicima, koristiti iste ili različite baze podataka, izvoditi se na različitom hardveru na odvojenim fizičkim lokacijama
- usluge su malene, komuniciraju porukama, neovisno razvijane i postavljene, kontinuirano isporučene, decentralizirane i jednostavne za skaliranje
Mikrouslužna arhitektura (3/3)
Mikrousluge u suštini slijede Unixovu filozofiju:
Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new "features".
Martin Fowler kaže za arhitekturu temeljenu na mikrouslugama:
Lends itself to a continuous delivery software development process. A change to a small part of the application only requires rebuilding and redeploying only one or a small number of services. Adheres to principles such as fine-grained interfaces (to independently deployable services), business-driven development (e.g. domain-driven design).
Monolitna ili mikrouslužna arhitektura
🙋 Pitanje: Imaju li navedene aplikacije monolitnu ili mikroservisnu arhitekturu?
- www.inf.uniri.hr (iskoristite View Source u pregledniku ili proučite BuiltWith technology profile za inf.uniri.hr)
- www.facebook.com (pogledajte Building Real Time Infrastructure at Facebook - Facebook - SRECon2017)
- www.instagram.com (Scaling Instagram Infrastructure)
- hr.wikipedia.org (Wikimedia servers)
- moodle.srce.hr (Moodle architecture)
- www.openstreetmap.org (Component overview)
- razmjena.github.io (pronađite korištenu tehnologiju u footeru stranice)
Primjene mikrouslužne arhitekture
- oblaku urođene aplikacije (engl. cloud-native applications), odnosno softver kao usluga (engl. software as a service)
- neke (web) aplikacije razvijene za tzv. bezposlužiteljsko računarstvo (engl. serverless computing) (koriste poslužitelje, ali ih vi ne konfigurirate)
- npr. Šahovski klub Rječina (diplomski rad Antonija Bana) koji se izvodi na AWS Lambda (slične usluge: Google Cloud Functions i Azure Functions)
- neke (web) aplikacije koje se isporučuju u kontejnerima
- velik broj (web) aplikacija koje se danas razvijaju po narudžbi
- npr. vaš projekt s UPW/DWA1 ili Veleri-OI IoT School
Evolucija računarstva do besposlužiteljskog
Izvor: Introduction to Serverless Computing (Instana, 18th April 2018)
Usporedba monolitne i mikrouslužne arhitekture
Izvor: Introduction to Serverless Computing (Instana, 18th April 2018)
Bezposlužiteljsko računarstvo
- komercijalno se sreće pod nazivom funkcija kao usluga (engl. function as a service): AWS Lambda, Azure Functions, Google Cloud Functions itd.
- bezposlužiteljska baza podataka (engl. serverless database): Nutanix Era, Amazon Aurora, Azure Data Lake, Google Firebase itd.
- elastično, a ne samo skalabilno: pružatelj usluga u oblaku skalira broj poslužitelja dodijeljenih aplikaciji i njenoj bazi podataka po potrebi
- gotova rješenja za popularne okvire za razvoj aplikacija, npr.
- Laravel Vapor za pokretanje Laravela na AWS Lambda
- Ruby on Jets za pokretanje Ruby on Railsa na AWS Lambda
Ukratko
Monolitna i mikrouslužna arhitektura se koriste u praksi prema potrebi:
- Za jednostavne projekte monolitna arhitektura je logičan izbor. Pritom se prikaz stranica može izvoditi na poslužitelju (engl. server-side rendering) ili na klijentu (engl. client-side rendering) (detaljni pregled načina prikaza stranica).
- Mikrouslužna arhitektura omogućuje da veliki broj programera neovisno radi promjene na pojedinim uslugama dokle god se zadržava dogovoreno aplikacijsko programsko sučelje.
Author: Vedran Miletić