Professional Documents
Culture Documents
Diplomski Rad - David Fejes
Diplomski Rad - David Fejes
Diplomski Rad - David Fejes
David Feješ
IMPLEMENTACIJA MIKROSERVISNE
APLIKACIJE ZA AUTOMATIZACIJU PROCESA
PORUČIVANJA HRANE
DIPLOMSKI RAD
Osnovne akademske studije
2
UNIVERSITY OF NOVI SAD ⚫ FACULTY OF TECHNICAL SCIENCES
21000 NOVI SAD, Tr g Dositeja Obradovića 6
3
Sadržaj
Spisak slika ....................................................................................................................................... 6
Spisak listinga................................................................................................................................... 8
1. Uvod .......................................................................................................................................... 9
4
4. Dizajn rešenja .......................................................................................................................... 25
Literatura ........................................................................................................................................ 60
Biografija ........................................................................................................................................ 62
5
Spisak slika
6
Spisak tabela
7
Spisak listinga
8
1.Uvod
Prva veb stranica je nastala 1989. godine u Evropskom centru za nuklearna istraživanja.
Nastankom World Wide Web-a, Tim Berners-Li je imao za cilj da automatizuje deljenje informacija
između akademske zajednice [1]. Njegova stranica bila je zasnovana na hiperlinkovima Danas, 30.
godina kasnije, veb stranice su evoluirale u veb apikacije koje imaju različite svrhe. Neki od
primera upotrebe veb aplikacija jesu aplikacije za komunikaciju, koje omogućavaju korisnicima
povezivanje, nezavisnono od geografske udaljenosti. Ovaj tip aplikacija donosi dosta benefita
oblastima kao što su trgovina, bankarstvo, obrazovanje, zdravstvo, transport. Pored ovih, postoje
aplikacije za informisanje, zabavu, biznis kao i širok spektar ostalih oblasti. Pružaju mogućnost
korisnicima za lakši pristup informacijama i uslugama. Napredak tehnologije omogućio je globalnu
povezanost, čime se geografske granice brišu. Veb aplikacije su postale neizostavan deo
svakodnevnog života.
Kao rezultat globalizacije, a zatim i pandemijom korona virusa, primećen je značajan porast
korišćenja usluga aplikacija dostave. Prouzrokovano potrebom da se ostane kod kuće, ljudi su se
sve više oslanjali na tehnologiju. Putem računara ili mobilnih uređaja aplikacije su korišćene za
naručivanje hrane, distribuciju medicinske opreme i lekova. Dosta su olakšale poslovanje na polju
logistike i dostave. Nakon pandemije, ostala je kultura dostave hrane, samim tim je dovela do toga
da količina korisnika aplikacija za naručivanje nije pala, naprotiv, taj broj je nastavio da raste. Veb
aplikacije doprinose olakšanju i unapređenju različitih aspekata života i poslovanja.
9
aplikacija za dostavu kao što su Glovo1 i Wolt2. Obuhvataju širok asortiman, preko prehrambenih
proizvoda, elektronike, kozmetike, do medicinskih sredstava i lekova.
Jedan od osnovnih problema u organizacijama koju čine veći broj ljudi, bilo da su to
skupovi, poslovne organizacije, kompanije ili događaji jeste logistika ishrane. Proces naručivanja
hrane u organizacijama može biti nepotrebno dugotrajan, što u krajnjoj liniji dovodi do mogućeg
nezadovoljstva među zaposlenima. Javlja se problem izbora mesta odakle će se hrana poručiti, koji
će proizvodi činiti narudžbinu, samog poručivanja, a kasnije i do evidentiranja svake porudžbine i
naplate. Stvara se potreba ubrzavanja samog procesa naručivanja hrane, uz minimalne napore.
Vodeći se ovom pretpostavkom, cilj ovog rada jeste kreiranje aplikacije za automatizaciju procesa
poručivanja hrane.
Aplikacijom koja će voditi računa o narudžbinama na nivou organizacije, stvara se
mogućnost pravljenja individualne porudžbine za svakog zaposlenog, uz praćenje istorije
prethodnih porudžbina. Pored toga, benefiti ovakvog informacionog sistema mogu dovesti do
evidencije svih porudžbina, što u krajnjoj liniji dovodi do praćenja troškova i potencijalnog
smanjivanja istih.
1
https://glovoapp.com
2
https://wolt.com
10
i ažuriraju postojeće. Cilj ovog rada jeste automatizovati proces poručivanja hrane čime će se
uštedeti vreme korisnicima sistema.
11
2.Teorijski koncepti rešenja
12
razvojnim timovima da u isto vreme razvijaju različite funkcionalnosti, samim tim je pogodna za
kontinualnu isporuku. Mikroservisna arhitektura omogućava korišćenje različitih baza podataka.
Na slici 2 je prikazan primer mikroservisne arhitekture.
13
Domenski vođen dizajn predstavlja način razmišljanja i skup praksi usmerenih prema
ubrzanom razvoju softvera baziranih na složenim domenima. Osnova tog pristupa predstavlja
duboko razumevanje poslovnog domena i problema koji softver treba da reši [5]. Cilj je razviti
softver koji se fokusira na modelu domena, umesto na tehnologiji u kojoj će biti implementiran. U
narednoj tabeli su predstavljeni osnovni koncepti DDD-a.
Koncept Opis
Entitet (Entity) Jedan od osnovnih koncepata modela. Objekat koji je
suštinski definisan svojim kontinuitetom i identitetom, a ne
atributima.
Vrednosni objekti (Value objects) Objekti koji opisuju karakteristiku ili atribut, ali nema svoj
identitet. Koriste se za prenošenje vrednosti.
Servisi (Services) Operacije koje se izbršavaju unutar domena. Glavna svrha
servisa je izdvajanje operacija koje se ne uklapaju u
objekte.
Agregati (Aggregates) Klaster povezanih objekata koje predstavljaju celinu.
Spoljne reference su ograničene na jednog člana agregata,
koji predstavlja korenski entitet.
Fabrike (Factories) Mehanzmi za pravilno instanciranje objekata, koriščeni za
složene domenske objekte.
Repozitoriji (Repositories) Sloj za pristup podacima koji omogućava čitanje, čuvanje
i upravljanje entitetima. Predstavlja abstraktan sloj između
domenskog modela i baze podataka.
14
predstavlja pristupnu tačku. Vrednosni objekti nemaju svoj identiet, već je njihova svrha prenos
vrednosti u određenom vremenskom trenutku.
Agregati treba da obezbede sve operacije i funkcionalnosti neophodne za upravljanje
entitetima unutar istog, kao i za očuvanje konzistentnosti. Servisi unutar agregata se koriste za
izolaciju kompleksnih operacija.
Fabrike se koriste za pravljenje složenih objekata. Pravljenje entiteta može biti složen
proces ukoliko se zahteva validacija i postavljanje nekog inicijalnog stanja. Svrha fabrika jeste
apstrakcija ovog procesa i pružanje mogućnosti jednostavnog pravljenja agregata sa svim
ograničenjima domena.
.NET predstavlja besplatnu platformu otvorenog koda za razvoj različitih vrsta aplikacija [6].
Sastoji se od programskih jezika, alata i biblioteka. U ovom radu je korišćen .NET Core [7] koji
služi za razvoj više platformskih, visoko performantnih aplikacija. Moguće je razviti veb, mobilne,
konzolne, IoT(Internet of Things) aplikacije. Korišćenjem .NET Core 6.0 verzije razvijena su 3
mikroservisa i jedan Gateway. Za implementaciju je korišćen programski jezik C#.
C# je savremeni objektno orijentisani programski jezik koji vrši strogu kontrolu tipova
podataka. Ovim se omogućava razvijanje sigurnih i pouzdanih aplikacija bez mogućnosti da
pogrešni tipovi podataka ostanu neopaženi.
Implementirano rešenje se sastoji iz 4 aplikacije pisane u .NET Core-u. To su 3 mikroservisne
aplikacije i 1 API Gateway. Mikroservisne aplikacije su kreirane na osnovu šablona ASP.NET Core
Web API unutar .NET razvojnog okruženja. Za kreiranje API Gateway-a je korišćen šablon
konzolne aplikacije.
Unutar aplikacija korišćene su biblioteke kao što su Entity Framework Core3,
Swagger4,Ocelot5.
3
https://learn.microsoft.com/en-us/ef/core/
4
https://swagger.io/
5
https://ocelot.readthedocs.io/en/latest/
15
2.2.1. Entity Framework Core
Entity Framework Core je laka, proširiva verzija Entity Framework tehnologije. Predstavlja
objektno-relacioni maper koji omogućava programerima rad sa bazama podataka upotrebom .NET
objekata i smajuje ili potpuno eliminiše potrebu za pisanjem koda za pristup podacima [8].
2.2.2. Swagger
Swagger predstavlja skup pravila, alata i specifikacija za razvoj i opis REST API-ja [9]. Glavna
svrha je olakšati komunikaciju između različitih komponenata sistema, omogućavajući računarima
i ljudima da razumeju mogućnosti REST API-ja bez potrebe pristupa izvornom kodu. Omogućava
automatizaciju generisanja dokumentacije što olakšava razvoj i testiranje. Pored toga pomaže pri
usaglašavanju sa ostalim API-jima kao i pri standardizaciji specifikacija.
2.2.3. Ocelot
Ocelot je .NET API Gateway je alat koji pruža mogućnost za laku implementaciju jedinstvene
pristupne tačke u mikroservisnoj arhitekturi koja će upravljati, rutirati i filtrirati zahteve ka
različitim mikroservisima Laka implementacija podrazumeva da nema potrebe za dodatnim
konfiguracijama unutar mikroservisa.
React je JavaScript biblioteka razvijena od kompanije Meta6 i služi za izradu Single Page
aplikacija. To su aplikacije koje koje dinamički menjaju svoj sadržaj, bez podrebe za ponovnim
učitavanjem cele aplikacije, stvarajući iluziju promene stranica dok se korisnik zapravo sve vreme
nalazi na jednoj stranici. React pruža mogućnost razvoja dinamičkih i interaktivnih veb aplikacija.
Aplikacije su bazirane na komponentama korisničkog interfejsa, koje se mogu iznova koristiti, a
6
https://about.meta.com/
16
njihoviom kombinovanjem stvara se mogućnost izgradnje kompleksnih interfejsa. Komponente
omogućavaju React-u skalabilnost što doprinosi boljem iskustvu programera.
React koristi JSX(JavaScript XML). JSX je sintaksa slična XML-u(Exstensible Markup
Language) koje se koristi kao proširenje JavaScript-u [10]. Omogućava programerima pisanje
komponenti korišćenjem sitakse slične HTML-u (HyperText Markup Language) u JavaScript-u
omogućavajući pisanje logike i vizualnog prikaza na jednom mestu. Njegova osnovna svrha jeste
manipulacija DOM-om(Document Object Model).
React koristi virtuelni DOM (Virtual DOM, VDOM). VDOM predstavlja koncept u kom React
koristi kopiju DOM-a koja se čuva u memoriji i nad kojom se proverava koji delovi stvarnog DOM-
a zahtevaju izmene, pre nego što se one zaista unesu. Proces sinhronizacije virtuelnog i stvarnog
DOM-a se naziva usklađivanje [11]. Ovim pristupom se zaobilazi ručna manipulacija DOM-om,
već omogućava deklarativni pristup u izradi korisničkih interfejsa, pružajući poboljšanje
performansi, povećava se sigurnost aplikacije zato što React ima kontrolu nad ažuriranjem DOM-
a. Pored toga postoje i benefiti skalabilnosti, zato što VDOM omogućava bolju optimizaciju.
Pri izradi ovog rada korišćen je TypeScript7 Typescript je programski jezik razvijen od strane
Microsoft-a, koristi se za razvoj klijentskih i serverskih aplikacija. Predstavlja nadskup JavaScript-
a, dodavajući statičku tipizaciju. Jedan od glavnih benefita TypeScript-a jeste eliminisanje tipskih
grešaka.
CSS (Cascading Style Sheets) predstavlja jezik za stilizovanje veb stranica. Pod ovim se smatra
određivanje boja, fontova, veličina, margina i još mnogih drugih stvari. CSS-om se može odrediti
dizajn i raspored u zavisnosti uređaja na kom se koristi aplikacija. SASS 8 (Syntactically Awesome
Style Sheets) predstavlja skriptni jezik za stilizovanje koji se prevodi u CSS. Omogućava korišćenje
promenjivih, operacija, ugnježdavanja pravila, funkcija i još mnogo toga. SASS pomaže pri
skaliranju i održavanju velikih aplikacija.
Pored React biblioteke pri izradi rada su koričćene i druge JavaScript biblioteke kao što su
Redux Toolkit, Axios, MUI, React Router i Toastify.
2.3.1. Redux
7
https://www.typescriptlang.org/
8
https://sass-lang.com/
17
Redux predstavlja JavaScript biblioteku koja služi za upravljanje stanjem aplikacije.
Funkcioniše tako što objedinjuje sve podatke u jednom predvidivom kontejneru, tako da su oni
centralizovani. Ovo omogućava deljenje podataka među komponentama aplikacije, što doprinosi
boljoj skalabilnosti. Redux ima jasan tok podataka i kako bi razumeli način na koji se podaci kreću,
prvo moramo definisati pojmove.
Koncept Opis
Skladište (store) Centralizovano skladište predstavlja stanje aplikacije. Čuva sve
podatke bitne za aplikaciju. Sastoji se od reduktora.
Stanje (state) Predstavlja globalno stanje aplikacije koje je čuva unutar
skladišta.
Akcije (actions) Događaji koji se definišu u aplikaciji. Predstavljaju objekte koje
imaju svoj tip. Neretko sadrže obeležje koje sadrži dodatne
informacije i naziva se sadržaj (payload).
Reduktor (reducer) Reduktori su čiste funkcije koje prihvataju trenutno stanje i
akciju. Reduktori prave kopiju trenutnog stanja, kopiju ažuriraju
u skladu sa ulaznom akcijom i vraćaju izmenjenu kopiju koje
predstavlja novo stanje.
Emitovanje (dispatch) Jedini način ažuriranja stanja aplikacije. Predstavlja metodu kojoj
se prosleđuje akcija.
Selektori (selectors) Funkcije pomoću kojih se izvlače specifične informacije iz
skladišta.
Redux se bazira na jednosmernom toku podataka koji govori o tome da korisnički interfejs
poziva akciju, akcija se emituje do reduktora koji vrši ažuriranje stanja i dovodi do novog stanja,
koje se zatim prosleđuje korisničkom interfejsu koji se zatim osvežava i prikazuje trenutno stanje
aplikacije. Na narednoj slici prikazan je cikljus Redux apikacije.
18
Slika 3 Dijagram ciklusa ažuriranja stanja u Redux-u. Preuzeto i adaptirano sa [12]
U sklopu ovog projekta korišćen je Redux Toolkit9, predstavlja preporučeni pristup pisanja
Redux aplikacija. Redux Toolkit implementira predložene najbolje prakse, pojednostavljujući način
pisanja Redux aplikacija i eliminiše većinu šablonskog koda(boilerplate).
2.3.2. Axios
Axios10 je JavaScript bibloteka koja se koristi za obavljanje pravljenje HTTP poziva u okviru
veb aplikacija. Veoma je jednostavna za korišćenje i poseduje podršku obećanjima(promises).
Pored toga, Axios vrši automatsko mapiranje JSON podataka u JavaScript objekte tako da nema
potrebe za ručnim transformisanjem.
2.3.3. MUI
9
https://redux.js.org/redux-toolkit/overview
10
https://axios-http.com/
19
MUI11 predstavlja biblioteku koja se sastoji od komponenti korisničkog interfejsa i omogućava
programerima lakši razvoj aplikacija. Jedan od prednosti korišćenja ove biblioteke jeste velika
sloboda prilagođavanja komponenti vizualnom dizajnu aplikacije.
React Router12 predstavlja JavaScript biblioteku koji služi za rutiranje u React aplikacijama.
Omogućava dinamičko upravljanje sadržajem putem URL-ova (Uniform Resource Locator) bez
potrebe za osvežavanjem stranice. Poseduje funkcije i komponente za definisanje ruta i praćenje
URL-a. Korišćenjem React Router-a razvijaju se dinamički korisnički interfejsi bogati sadržajem.
React Toastify13 je JavaScript biblioteka koja omogućava prikaz kratkih poruka na određeno
vreme, u sklopu korisničkog interfejsa. Ova poruka može biti poruka uspešnog izvršavanja neke
akcije, upozorenje, obaveštenje, informacija o grešci i još mnogo toga. Korišćenjem ove aplikacije
stvara se bolje korisničko iskustvo jer pruža informaciju o svim bitnim aktivnostima koje se
dešavaju unutar aplikacije.
11
https://mui.com/
12
https://reactrouter.com/en/main
13
https://fkhadra.github.io/react-toastify/introduction
20
3.Zahtevi rešenja
U narednoj sekciji biće predstavljeni funkcionalni i nefunkcionalni zahtevi koje veb aplikacija
treba da zadovolji. Nakon toga zahtevi će biti podeljeni preba tipu uloge koji korisnik ima.
21
6. Evidencija restorana Sistem treba da omogući evidenciju svih
registrovanih restorana u aplikaciji
7. Navigiranje do sadržaja Sistem treba da obezbedi pristup meniju samog
restorana restorana.
8. Kreiranje restorana Sistem treba da obezbedi mogućnost registracije
novih restorana
9. Ažuriranje restorana Sistem obezbeđuje mogućnost ažuriranja
podataka registrovanih restorana
10. Brisanje restorana Sistem omogućava brisanje registrovanih
restorana.
22
18. Kreiranje glasova Sistem omogućava kreiranje glasova za današnje
glasanje. Može se kreirati samo jedan glas po
korisniku za jedno glasanje.
19. Ažuriranje glasova Sistem obezbeđuje mogućnost promene glasa
korisnika.
20. Brisanje glasova Sistem omogućava brisanje glasova korisnika.
23
29. Evidencija stavki Sistem pruža mogućnost evidencije svih stavki
porudžbina porudžbina.
30. Kreiranje stavki porudžbine Sistem omogućava korisniku kreiranje stavki
porudžbine.
31. Ažuriranje stavki porudžbine Sistem obezbeđuje korisniku mogućnost izmene
stavki porudžbine
32. Brisanje stavki porudžbine Sistem omogućava korisniku brisanje stavki
porudžbine.
24
4.Dizajn rešenja
Nakon definisanja zahteva koje rešenje pora da ispuni, u narednom poglavlju biće detaljno
objašnjeno na koji način je rešenje implementirano. U prvom delu sekcije biće predstavljena
arhitektura aplikacije, prikazujući sve servise. Nakon toga slede UML (Unified Modeling
Language) dijagrami slučajeva upotrebe koji će predstaviti interakciju između korisnika i sistema.
Na kraju poglavlja biće predstavljen dizajn korisničkog interfejsa.
Na narednoj slici je predstavljena arhitektura aplikacije.
25
obezbeđuje React aplikaciji token koji se šalje pri svakom zahtevu upućenom API Gateway-u. API
Gateway token proverava sa Keycloak servisom i na osnovu odgovora dozvoljava ili zabranjuje
pristup ostalim mikroservisima.
API Gateway predstavlja centralni servis u mikroservisnoj arhitekturi i predstavlja ulaznu tačku
za sve zahteve. Njegova glavna svrha jeste centrailzacija i kontrola API-ja. Odlučuje kojem će
mikroservisu biti prosleđen zahtev.
Mikroservisi su razvijani upotrebom .NET Core-a. Svaki mikroservis poseduje bazu podataka
koja predstavlja Microsoft SQL Server.
U ovom delu biće predstavljeni dijagrami koji predstavljaju grafički prikaz svih slučajeva
upotrebe u sistemu. Oni ukazuju na granice sistema i prikazuju njegovu interakciju sa spoljnjim
korisnicima.
26
U ovom slučaju upotrebe opisan je proces glasanja. U ovoj interakciji učestvuju 2 tipa
korisnika: kancelarijski menadžer i korisnik.
Oba tipa korisnika imaju pravo pregleda i dodavanja restorana. Ovo je veoma bitno zato što
daje slobodu svim korisnicima da dodaju željane restorane.
Deo gde kancelarijski menadžer ima posebna ovlašćenja jeste glasanje. Samo kancelarijski
menadžer ima pravo na otvaranja dnevnog glasanja i otvoreno glasanje može samo jednom biti
zatvoreno. Nakon zatvaranja glasanja, ne može se otvoriti novo do sledećeg dana. Kada je glasanje
otvoreno, oba tipa korisnika imaju pravo glasanja za restoran iz koga žele tog dana da naruče hranu.
Ograničavajući faktor jeste što korisnik može kreirati samo jedan glas, ali dokle god je glasanje
otvoreno korisnik može promeniti svoj glas i glasati za neki drugi restoran.
Nakon zatvaranja glasanja, biraju se 2 restorana sa najviše glasanja. Ovim sužavanjem izbora
se smanjuje posao kancelarijskog menadžera koji je kasnije zadužen za naručivanje hrane. Kada je
glasanje zatvoreno, korisnici imaju 1 sat da unesu koje proizbode žele da naruče, kao i iz kog
restorana.
27
Nakon popunjava forme i isteka sat vremena, na kancelarijskom menadžeru ostaje da naruči
proizbode, koristeći listu svih narudžbina za svakog korisnika. Nakon prijema dostave,
kancelarijski menadžer unosi cenu dostave, koja se deli na sve korisnike koji su naručili iz datog
restorana.
Ovim dijagramima opisani su svi slučajevi upotrebe koji se mogu dogoditi. Služe za lakše
razumevanje funkcionalnih zahteva.
28
U okviru serverske strane, definisani su 3 mikroservisa od kojih svaki komunicira sa zasebnom
bazom podataka, kao i API Gateway. Za implementaciju mikroservisa korišćen je .NET Core,
Entity Framework Core koji predstavlja alat ta objektno relaciono mapiranje, dok je izbor baze
podataka pao na relacionu bazu podataka MS SQL. Svaki mikroservis sadrži servise koji
predstavljaju služe za obradu biznis logike i komunikaciju sa bazom podataka. Pored toga,
poseduju modele koji predstavljaju strukturu podataka koja će biti pohranjena u bazi podataka. Na
sledećoj slici će biti prikazan dijagram klasa.
29
I konačno, kontroleri su odgovorni za obradu HTTP zahteva. U nastavku će svaki
mikroservis biti posebno objašnjen.
Restoran mikroservis predstavlja .NET Core Web API koji služi za manipulaciju
restoranima. Jedini model koji ovaj mikroservis poseduje jeste Restoran. Na osnovu kreiranog
modela, uz pomoć Entity Framework Core-a kreirana je prva migracija, a zatim ažurirana baza
podataka. Ovo je dovelo do kreiranja baze podataka. Repozitorijum sadrži osnovne CRUD (create,
read, update, delete) operacije. U slučaju čitanja implementirana je paginacija uz mogućnost
filtriranja podataka na osnovu naziva restorana i adrese.
Mikroservis koji se bavi glasanjem predstavlja kompleksnije rešenje. Modeli koje ovaj
mikroservis poseduje su glasanje(voting) i glas(vote). Svako glasanje se održava za tačno određeni
datum i sadrži listu glasova. Model glasa nosi informaciju o tome koji korisnik je glasao, za koji
restoran je glasao, kao i kom glasanju pripada dati glas. Implementacija servisa obuhvata više
metoda, tako da pored izlistavanja glasava i prikazivanja podataka o smecifičnom glasanju na
osnovu Id-ja, postoje metode za prikaz današnjeg glasanja, ukoliko postoji, kao i list restorana koji
su danas izglasani. Ovo se postiže komunikacijom sa Restoran mikroservisom. Pored toga
uključene su metode brisanja glasanja, ali i kreiranja i zatvaranja glasanja. Ove 2 posebne metode
se ne aktiviraju preko kontrolera, već upotrebom SignalR biblioteke.
Mikroservis poseduje 2 konekcije ka 2 različita mikroservisa. Komunikacija se uspostavlja
upotrebom interfejsa IHttpClientRespository14. Komunikacija sa Restoran mikroservisom se
uspostavlja radi prihvatanja restorana na osnovu Id-ja korišćenjem HTTP GET metode.
Komunikacija sa Porudžbina mikroservisom se sastoji upotrebom 2 metode. To su kreiranje
porudžbine i kreiranje grupe porudžbina.
14
https://learn.microsoft.com/en-us/dotnet/api/system.net.http.ihttpclientfactory?view=dotnet-plat-ext-7.0
30
U sklopu mikroservisa postoji jedan Hub15 . Predstavlja komponentu SignalR biblioteke i
olakšava komunikaciju u realnom vremenu između klijentske aplikacije i mikroservisa.
Implementirane su metode pridruživanja glasanju, davanja glasa, kao i zatvaranja glasanja. Razlog
implementacije zatvaranja glasanja unutar Hub-a jeste što se pri zatvaranju glasanja moraju
izlogovati iz sesije klasanja svi povezani korisnici.
Mikroservis poseduje 2 kontrolera, jedan koji poziva glasanje servis i drugi koji poziva servis
koji upravlja glasom.
Ovaj mikroservis obuhvata podatke i aktivnosti vezane za samu produžbinu. Model podataka
se sastoji od porudžbine. Jedna porudžbina se pravi za svaki dan. Porudžbina poseduje listu grupa
porudžbina. Porudžbine se grupišu po restoranima. Pored toga poseduju podatak od ceni dostave i
listi stavki porudžbine. Stavka proudžbine se sastoji od proizvoda i korisnika koji kreira proizvod.
Za svaki od modela kreiran je po jedan servis. U sklopu servisa porudžbine, pored osnovnih
CRUD operacija, uključen je prikaz današnje proudžbine. Servis grupa porudžbina takođe
uključuje izlistavanje podataka koji su nastali danas. I konačno, servis koji se bavi stavkom
narudžbine poseduje osnovne funkcije izlistavanja podataka, kreiranja, ažuriranja i brisanja.
Dizajn korisničkog interfejsa predstavlja ključni aspekt korisničkog iskustva. U daljem tekstu
biće predstavljen dizajn korisničkog interfejsa rešenja korišćenjem React okvira, korišćenjem
TypeScript-a. Jedan od osnovnih ciljeva pri dizajniranju rešenje je bio pravilno struktuiranje
aplikacije radi održivosti, čistini i lakoći razvoja. Umesto tradicionalnog pristupa razvoju aplikacija
u kom se fajlovi struktuiraju na osnovu tipa, korišćena je struktura koja prati funkcionalnosti same
aplikacije. Ovo omogućava istovremen rad na više nezavisnih delova aplikacije. Funkcije su
podeljene po modulima, tako da aplikacija poseduje 5 modula. Svaki modul se sastoji od unapred
15
https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.signalr.hub?view=aspnetcore-7.0
31
određene strukture. Tu strukturu čine API pozivi, komponente koje služe za prikaz podataka,
kontejneri unutar kojih je implementirana logika, tipovi, rute i reduktor segmenta(slice).
Pored modula, struktura projekta sadrži konfiguraciju skladišta Redux-a. Pri konfigurisanju
skladišta definišu se reduktori. Definisana su 4 reduktora: autorizacija, restoran, glasanje i
porudžbina.
I poslednje, definisani su stilovi. Unutar komponenti, pored JSX fajla nalazi se i definicija
stilova u sklopu SCSS fajlova. Postoje globalni SCSS fajlovi smešteni u folderu Stilovi. Unutar tog
foldera definisane su promenjive, globalni stilovi i funkcije.
Strukturu foldera zaokružuje .ENV fajl koji predstavlja listu promenjivih specifičnu za razvojno
okruženje u obliku parova ključ-vredonst. Unutar ovog fajla smeštene su putanje ka Keycloak i API
Gateway servisu.
32
5. Implementacija i evaluacija rešenja
16
https://minikube.sigs.k8s.io/docs/
17
https://kubernetes.io/
33
korisnika i kontrole pristupa različitim aplikacijama. Predstavlja brzo i pouzdano rešenje za potrebe
funkcionalnih zahteva.
Keycloak servis je uspešno implementiran i konfigurisan upotrebom Docker slike.
Pokretanjem slike pravi se kontejner i aplikacija se pokreće na portu 80:80.
18
https://openid.net/developers/how-connect-works/
34
2.019 i omogućava verifikaciju identiteta korisnika na siguran način. Koristi se u sklopu mobilnih i
veb aplikacija.
19
https://oauth.net/2/
35
i baze podataka, ka kojoj je putanja definisana u appsettings JSON fajlu. Pored toga, postavljena je
opcija automatskog ponovnog pokušaja uspostavljanja veze u slučaju neuspeha.
Strukturu projekta čine i pomoćne metode. Pod pomoćnim metodama se smatra maper, koji
služi za pretvaranje jednog tipa objekata u drugi. Tako postoje metode koje mapiraju objekte
modela u dto-ove. Unutar helper metoda uključen je maper koji mapira listu objekata u listu
objekata sa paginacijom. Taj maper prima generički tip podataka.
Servisi sadrže biznis logiku koja je definisana u poglavlju zahteva. Pri instanciranju servisa,
konstruktor prima jedan parametar i to kontakst koji služi za komunikaciju sa bazom podataka
putem Entity Framework Core-a. Na sledećem listignu je predstavljen interfejs restoran servisa.
bool SaveChanges();
}
U nastavku je prikazana tabela koja prikazuje metode koje Restoran mikroservis poseduje.
36
Putanja: /api/restaurants
20
https://developer.mozilla.org/en-US/docs/Web/API/WebSocket
37
Slika 11 Dijagram klasa Glasanje mikroservisa
38
public class RestaurantApiClient
{
private readonly IConfiguration configuration;
private readonly IHttpClientFactory httpClientFactory;
private readonly string restaurantApiUrl;
if (response.IsSuccessStatusCode)
{
var content = await response.Content.ReadAsStringAsync();
RestaurantDto restaurantDto =
JsonConvert.DeserializeObject<RestaurantDto>(content);
return restaurantDto;
}
else
{
throw new Exception("Cant access to Restaurants");
}
}
}
39
public class OrderApiClient
{
private readonly IConfiguration configuration;
private readonly IHttpClientFactory httpClientFactory;
private readonly string orderApiUrl;
if(response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
OrderDto orderDto = JsonConvert.DeserializeObject<OrderDto>(responseContent);
return orderDto;
}
else
{
throw new Exception("Cant create order");
}
}
if (response.IsSuccessStatusCode)
{
var responseContent = await response.Content.ReadAsStringAsync();
OrderGroupDto orderGroupDto =
JsonConvert.DeserializeObject<OrderGroupDto>(responseContent);
return orderGroupDto;
}
else
{
throw new Exception("Failed to create Order Group");
}
}
}
40
Ova klasa poseduje metode za dodavanje porudžbina i grupe porudžbina. U slučaju
neuspešnog izvršavanja bacaju se specifični izuzeci koji daju opis koji deo koda nije uspešno
izvršen.
Glasanje mikroservis poseduje Hub. Predstavlja klasu koja omogućava dvosmernu
komunikaciju sa klijentskom aplikacijom. U nastavku će biti predstavljene neke od metoda Hub-a.
Prva metoda jeste pridruživanje glasanju. Ova metoda se poziva u slučaju da je glasanje
otvoreno. Omogćava korisnicima pristup glasanju. Nakon toga, metoda poziva servis glasa,
prihvata listu današnjih glasova i šalje ih svim korisnicima.
Nakon što se korisnik pridružio glasanju, on ima pravo slanja glasa. Sledeća metoda služi
za dodavanja glasa korisnika.
41
public async Task CreateVote(string user, string userId, string restaurantId)
{
try
{
string votingId = voting.Id.ToString();
var restaurantDto = await restaurantApiClient.GetRestaurantByIdAsync(restaurantId);
if (restaurantDto != null)
{
VoteCreateDto voteDto = new()
{
RestaurantId = restaurantId,
UserId = userId,
UserName = user,
VotingId = votingId
};
Poslednja metoda koja čini ovaj Hub jeste metoda zatvaranja glasanja.
42
public async Task CloseVoting()
{
foreach (var connectionId in UserHandler.ConnectedIds)
{
await Clients.Client(connectionId).SendAsync("ClosedVotingMessage", "Voting closed.");
await Groups.RemoveFromGroupAsync(connectionId, connectionId);
}
await votingService.CloseTodaysVoting();
UserHandler.ConnectedIds.Clear();
}
Metoda zatvaranja glasanja koristi SignalR kako bi obavestila svakog povezanog korisnika
da je glasanje zatvoreno, a nakon toga ga uklanja iz grupe. Ovim postupkom se obezbeđuje da neće
postojati povezan korisnik na glasanje koje je zatvoreno. Nakon toga, poziva se servis za glasanja
koje zatvara današnje glasanje. Ovim su sve metode Hub-a obuhvaćene, slede servisi.
Prvi servis koji će biti predstavljen jeste servis glasanja. Obuhvata sve metode za uspešno
manipulisanje glasanjem.
VotingDtoWithId GetTodaysVoting();
List<string> GetTodaysRestaurants();
VotingDtoWithId CreateVoting();
Task CloseTodaysVoting();
bool SaveChanges();
}
43
public VotingDtoWithId CreateVoting()
{
DateTime today = DateTime.Today;
Voting existingVoting = context.Votings.FirstOrDefault(voting => voting.Date == today);
if (existingVoting != null)
{
return existingVoting.VotingToVotingDtoWithId();
}
Sledeća metoda jeste metoda zatvaranja današnjeg glasanja. Zatvaranje glasanja predstavlja
komplikovaniji proces od procesa dodavanja glasanja.
await orderApiClient.CreateOrderGroup(orderGroupCreateDto);
}
}
44
Početak servisne metode čini promena obeležja objekta glasanja. Nakon toga poziva se
Porudžbina mikroservis koji vrši dodavanje glasanja. Poziva se lista današnjih restorana, koju čine
2 restorana sa najviše glasova, na čije se podatke čeka odgovor Restoran mikroservisa. Nakon toga,
poslednja stavka ove servisne metode jeste pravljenje grupa porudžbina za svaki restoran. Pored
servisa koji se bavi glasanjem, sledi servis koji se bavi glasovima.
bool SaveChanges();
}
45
public VoteDtoWithId CreateVote(VoteCreateDto voteDto)
{
Voting voting = context.Votings.FirstOrDefault(v => v.Id == Guid.Parse(voteDto.VotingId));
Vote existingVote = context.Votes.FirstOrDefault(v =>
v.UserId == Guid.Parse(voteDto.UserId) && v.VotingId == Guid.Parse(voteDto.VotingId));
if (voting == null)
throw new HttpRequestException("Voting item not found", null,
HttpStatusCode.NotFound);
if (existingVote != null)
{
if (existingVote.RestaurantId != Guid.Parse(voteDto.RestaurantId))
{
DeleteVote(existingVote.Id);
}
else
{
return existingVote.VoteToVoteDtoWithId();
}
}
Da bi se novi glas za određenog korisnika napravio, prvo se mora proveriti da li je taj korisnik već
glasao na današnjem glasanju. U slučaju da je korisnik glasao, i to za restoran koji nije isti kao
restoran koji se nalazi unutar ulaznih parametara ove metode, postojeći glas se briše. U slučaju da
korisnik prvi put glasa na današnjem glasanju, pravi se novi glas, upisuje se u bazu podataka i vraća
se novi glas u obloku dto-a.
46
Slika 12 Dijagram klasa Porudžbina mikroservisa
Za svaki model postoje 3 tipa dto-ova: dto koji predstavlja model sa uključenim Id-jem, dto
koji isključuje Id i dto za kreiranje novog modela. Izuzetak je stavka porudžbine koji poseduje i
dto za ažuriranje modela. Komunikacija sa bazom podataka uspostavljena je uz pomoć Entity
Framework Core-a.
Mikroservis se sastoji od 3 servisa, za svaki model po jedan. Predstavljen je servis koji se odnosi
na samu porudžbinu, a akcenat će biti stavljen na dodavanje nove porudžbine, obzirom da se mora
ispoštovati zahtev da mora postojati samo jedna porudžbina za jedan datum.
47
public interface IOrderService
{
PagedList<OrderDtoWithId> GetOrders(OrderFilter filter);
OrderDtoWithId GetTodaysOrder();
OrderDtoWithId CreateOrder();
bool SaveChanges();
}
if (existingOrder != null)
{
return existingOrder.OrderToOrderDtoWithId();
}
U nastavku će biti predstavljene pristupne tačke koje ovaj mikroservis poseduje, podeljene
po kontrolerima. Prvi kontroler koji je predstavljen je porudžbina kontroler.
Putanja: /api/orders
48
Tabela 10 Lista metoda porudžbina kontrolera
Putanja: /api/orderGroups
Tabela 11 Lista metoda grupa narudžbina kontrolera
49
Putanja: /api/orderItems
Tabela 12 Lista metoda stavki porudžbine kontrolera
Biblioteka Opis
SignalR Biblioteka koja omogućava komunikaciju u realnom vremenu sa
serverskom aplikacijom.
MUI Biblioteka za izradu korisničkih interfejsa. Korišćene su samo
ikonice.
Keycloak Biblioteka koja obezbeđuje komunikaciju sa Keycloak serverom.
50
Axios Biblioteka koja olakšava slanje HTTP zahteva i rukuje veb
servisima.
React Avatar Komponenta za prikazivanje korisničkih avatara. Korišćena za
pravljenje avatara na osnovu korisnikovih inicijala.
Redux Toolkit Biblioteka za upravljanje stanjem aplikacije, omogućava
centralizovanje podataka.
React Router Biblioteka za upravljanje rutama i navigiranjem unutar aplikacije.
React Spinners Biblioteka korišćena za animirani indikator učitavanja.
React Toastify Biblioteka za praćenje obaveštenja. Predstavlja elegantno rešenje
slanja notifikacija korisniku.
U okviru razvoja korisničkog interfejsa, akcenat je stavljen na razvoj skalabilne aplikacije, gde
je glavni fokus bio na organizaciji i strukturi koda zasnovanoj na modulima, umesto tradicionalnog
pristupa organizacije prema tipu podataka. Moduli predstavljaju funkcionalne jedinice, za svaki
mikroservis postoji jedan modul. Ovim se postiže veća fleksibilnost i održivost sistema. U cilju
održanja konzistentnosti razvoja, korišćen je SASS koji obezbeđuje efikasnost i skalabilnost pri
razvoju stilova korisničkog interfejsa. Definisani su globalni stilovi koji se koriste unutar svakog
modula, čime je izbegnuto pisanje istog koda na različitim mestima.
Ulaznu tačku React aplikacije predstavlja index.tsx fajl
KeyCloakService.CallLogin(renderApp);
Listing 15 index.tsx
51
Eksplicitan poziv funkciji CallLogin čini da korisnik može da pristupi aplikaciji samo ukoliko je
ulogovan putem Keycloak servisa. Sledeći listing predstavlja implementaciju Keycloak servisa
unutar korisničkog interfejsa.
Strukturu svakog modula čine: API pozivi, UI komponente, kontejneri koji su zaduženi za
logiku, tipovi podataka koji se odnose na taj modul, rute i isečak reduktora.
52
Kada se korisnik uspešno uloguje u aplikaciju, biva preusmeren na stranicu restorana ukoliko
ne postoji aktivno glasanje.
Stranica porudžbina predstavlja listu porudžbina koja sadrži paginaciju. Pored toga,
porudžbine se mogu filtrirati na osnovu restorana, tako da se korisniku omogućava jednostavan
način evidencije istorije porudžbina. Kancelarijskom menadžeru se mogućnosti proširuju. Naime,
on ima mogućnost evidencije svih korisnika. To mu pruža mogućnost praćenja finansija na nivou
cele kompanije.
53
Slika 14 Slika padajućeg menija pri zadršci na restoranu
Svaki korisnik ima mogućnost dodavanja novog restorana. Sledi prikaz stranice za
dodavanje restorana.
54
glasanja sa strane kancelarijskog menadžera, u slučaju kada glasanje nije otvoreno. Kancelarijski
menadžer jedini može da napravi novo glasanje.
Slika 16 Stranica glasanja kada glasanje nije otvoreno sa strance kancelarijskog menadžera
Kada je glasanje otvoreno, korisnici imaju pravo glasanja za restoran u kome žele da ručaju
tog dana.Pored liste restorana, nalazi se ispis koji prikazuje za koji restoran je svaki korisnik glasao
od momenta kada je pristupljeno datoj sesiji glasanja. Jedino kancelarijski menadžer ima pravo
zatvaranja glasanja.
55
Slika 18 Stranica pravljenja porudžbine
56
6.Ograničenja rešenja
Tokom izrade samog rada primećena su neka od ograničenja koja će u nastavku biti detaljno
objašnjena. Rešenje koje je detaljno objašnjeno u ovom radu, testirano je samo na lokalnoj mašini
pod ograničenim uslovima, što čini ponašanje rešenja pri velikom broju korisnika nepoznato.
Jedno od većih ograničenja ovog rešenja predstavlja i međusobna komunikacija mirkoservisa.
Implementirano rešenje može imati problema sa performantnošću i skalabilnošću. Takođe, javlja
se problem latencije koje može dovesti do lošeg korisničkog iskustva. Slanje HTTP zahteva ne
predstavlja najpouzdanije rešenje.
Jedan od potencijalno većih ograničenja ovog rešenja jeste nedostatak sigurnosti. Naime, jedini
vid zaštite aplikacije jeste pristupanje API Gateway-u. U slučaju napada koji će poslati zahtev
direktno na mikroservis, zaobilazeći API Gateway, napadač ima direktan pirstup podacima.
Implementacija Keycloak servisa je predstavljala imala svoje izazove koji predstavljaju
ograničenja upotrebe takvog servisa. Keycloak servis zahteva veoma složenu konfiguraciju čija
postavka zahteva posebno učenje. Implementacija unutar servisa i korisničkog interfejsa je
potrajala, dok se dovodi u pitanje koliko resursa zahteva tako jedan veliki servis.
Što se tiče domenskih ograničenja aplikacija je ograničena na 3 glavne oblasti: restorane,
glasanje i porudžbine. Korisnik nema mogućnost ponovnih upotrebi stavke narudžbine koje je
izabrao u prethodnim porudžbinama, već svaki put unosi nove stavke. Proces glasanja je striktno
ograničen na vremenski period koji zada kancelarijski menadžer.
Navedena ograničenja predstavljaju osnovu razmišljanja o daljim unapređenjima aplikacije.
Rešenja nekih ograničenja ne bi zahtevala puno vremena i resursa, sa druge strane postoje
ograničenja koja bi zahtevala preispitivanje čitavog dizajna arhitekture rešenja.
57
7.Zaključak i budući rad
58
čime je osigurana agilnost pri daljim unapređenjima kako bi se zadovoljili budući korisnički
zahtevi.
59
Literatura
60
internals.html#:~:text=The%20virtual%20DOM%20(VDOM)%20is,a%20library%20such%
20as%20ReactDOM..
[12 Redux, „Redux Fundamentals, Part 2: Concepts and Data Flow,“ [Na mreži]. Available:
] https://redux.js.org/tutorials/fundamentals/part-2-concepts-data-flow.
[13 Redux, „What is Redux Toolkit?,“ [Na mreži]. Available: https://redux.js.org/redux-
] toolkit/overview#:~:text=Redux%20Toolkit%20makes%20it%20easier,of%20skill%20level
%20or%20experience..
61
Biografija
David Feješ je rođen 30. januara 1999. godine u Vršcu. U rodnom gradu upisuje osnovnu
školu „Jovan Sterija Popović“. Nakon završene osnovne škole, školovanje nastavlja u školskom
centru „Nikola Tesla“ u Vršcu. Visoko obrazovanje započinje 2017. godine na Fakultetu tehničkih
nauka Univerziteta u Novom Sadu, smer „Inženjerstvo informacionih sistema“. 2023. godine
započinje svoju profesionalnu karijeru, te iste godine završava osnovne studije te stiče zvanje
„Diplomirani inženjer informacionih tehnologija“.
62