Mikroservisi u .NET Core

Share

Nedavno se u TNation-u pojavio projekat za razvoj softvera za veliki svetski lanac prodavnica nameštaja. Imali smo mogućnost da sami izaberemo tehnologije i arhitekturu koji će biti korišćeni na back end-u. Nakon detaljnog čitanja dokumentacije, iskustava drugih programera i tutorijala na internetu, na kraju smo se odlučili da softver razvijemo u mikroservisnoj arhitekturi na .NET Core 2.0 platformi. Aplikacija je hostovana na Amazonovim web servisima uz korišćenje Docker kontejnera. Tim koji je radio na back end-u je bio oduševljen izborom arhitekturalnog rešenja i savremenih tehnologija, pa smo odlučili da u ovom blogu opišemo i objasnimo prednosti koje savremene tehnologije donose u odnosu na tradicionalna rešenja.

Mikroservisna arhitektura

Činjenica da je digitalizacija u poslednjoj deceniji uzela veliki mah i da zahtevi biznisa postaju sve veći, kao posledicu ima razvoj kompleksnih softverskih rešenja koja iziskuju jako puno vremena za razvoj i isporuku. Kod tradicionalne monolitne arhitekture, svaki put kada QA tim prijavi neki problem u aplikaciji, potrebno je debagovati, ispraviti problematični segment i zatim ponovo ceo kod objaviti na server. Ukoliko sistem ima više klijenata koji koriste aplikaciju (web klijent, mobilni klijent,…), rad na svim klijentima će biti obustavljen dok se problem ne otkloni, a performanse sistema opadaju. Drugi problem kod takve arhitekture je i to što je projekat teško podeliti na celine tako da više članova tima mogu da razvijaju manje ili više nezavisno jedni od drugih. Zbog smanjenja složenosti velikih sistema, sve više organizacija se okreće ka mikroservisnoj arhitekturi. Među prvima koji su usvojili ovu arhitekturu našli su se giganti poput Amazona i Netflixa, kao i kompanije sa ogromnom bazom korisnika kao što je SoundCloud.

Mikroservisna arhitektura predstavlja evoluciju servisno orijentisane arhitekture(SOA) i sačinjena je od skupa nezavisnih servisa od kojih svaki  implementira jedan poslovni zahtev. Osnovne karakteristike mikroservisne arhitekture su:

  • svi servisi su jednostavni, mali i nezavisni jedni od drugih;
  • svaki servis predstavlja zaseban projekat koji može da bude implementiran i održavan od strane malog razvojnog tima;
  • svaki servis može da se objavi na server nezavisno od ostalih, što dovodi do toga da tim može da izmeni postojeći servis a da to nema uticaja na ostatak sistema;
  • svaki servis ima svoj model baze podataka;
  • servisi komuniciraju međusobno koristeći predefinisane API-e i interna implementacija svakog servisa je skrivena od ostalih servisa;
  • servisi ne moraju da budu razvijeni u istim tehnologijama.

Neki od benefita korišćenja miroservisne arhitekture u odnosu na tradicionalnu monolitnu arhitekturu su: nezavisno objavljivanje servisa na produkcione servere bez posledica po ostatak sistema, veća skalabilnost, nezavisan razvoj u malim timovima fokusiranim na jedan zahtev biznisa, itd. Zbog svega navedenog, za implementaciju kompleksinih i obimnih softverskih rešenja se preporučuje upotreba mikroservisne arhitekture.

Slika 1: Poređenje monolitnog (sa leve strane) i mikroservisnog arhitekturalnog pristupa (sa desne strane)

.NET Core

Kao što je ranije rečeno, WebAPI-e na back end-u smo razvijali na .NET Core 2.0 platformi. S obzirom na to da je u pitanju jako mlada tehnologija (verzija 2.0 je objavljena u avgustu 2017. a verzija 1.0 u maju 2016. godine), veliki je izazov bio da ne naletimo na različite prepreke tokom razvoja, sa kojima ne bismo lako (ili uopšte) izašli na kraj.  Međutim, programerska internet komuna je u startu uočila ogromnu prednost cross-platform tehnologije, tako da smo za svaki problem na koji smo naišli, neki opis ili predlog rešenja našli na internetu.

.NET Core predstavlja open source implementaciju .NET API-a koji su formalno specificirani u .NET Standard-u i koji mogu da se izvršavaju na različitim platformama (cross-platform). Sadrži dosta istih API-a kao i sam .NET Framework, s tim što je skup API-a u .NET Core – u manji. Glavne karakteristike .NET Core-a su:

  • Cross-platform – jedna od najbitnijh karakteristika koja omogućava implementaciju i izvršavanje koda na različitim operativnim sistemima. Trenutno podržava tri glavna operativna sistema: Windows, Linux i macOS;
  • Open source – implementacija .NET Core-a je dostupna na GitHub pa se na taj način promoviše transparentan razvojni proces;
  • Fleksibilno objavljivanje aplikacije na server – objavljivanje koje zavisi od okruženja i samostalno objavljivanje. Prvi način podrazumeva da će prilikom objavljivanja na server samo aplikacija i njeni paketi biti instalirani, gde aplikacija zavisi od verzije .NET Core-a koja mora biti instalirana na sistemu. Drugi način podrazumeva da će prilikom objavljivanja aplikacije na server, verzija .NET Core koja je korišćena za razvoj biti instalirana zajedno sa aplikacijom i svim njenim paketima i ta verzija će se izvršavati nezavisno od drugih verzija .NET Core-a instaliranih na sistemu;
  • Modularnost – podrazumeva da je podeljen na manje pakete koji su dostupni preko NuGet paket menadžera.

Mikroservisi na .NET Core platformi u kombinaciji sa Docker-om

Docker je alat koji je dizajniran da olakša razvoj, objavljivanje na server i izvršavanje aplikacije koristeći kontejnere. Postoje Windows i Linux kontejneri. Kontejneri dozvoljavaju programeru da u njih smesti aplikaciju i sve pakete od kojih ona zavisi tako da budu tretirani kao jedan paket. Na taj način, programer može da bude siguran da će se aplikacija izvršavati na bilo kojoj mašini (Windows kontejneri na Windows OS a Linux kontejneri i na drugim OS), bez obzira na specifičnosti same mašine. Na neki način, Docker je kao virtuelna mašina, s tim što za razliku od virtuelne mašine koja kreira ceo operativni sistem, Docker dozvoljava aplikacijama da koriste isti kernel kao sistem na kome se izvršavaju i zahteva samo da aplikacija bude isporučena sa paketima koji ne postoje instalirani na host računaru. Na taj način se veličina aplikacije u značajnoj meri smanjuje.

Kontejneri se najčešće koriste u kombinaciji sa mikroservisnom arhitekturom, iako mogu biti iskorišćeni i za aplikacije i servise koji prate druge arhitekturalne šeme. Može se koristiti .NET Framework na Windows kontejnerima, ali modularnost i jednostavnost .NET Core-a čini tu platformu vrlo pogodnom za kontejnere i mikroservisnu arhitekturu.

Mikroservis bi trebalo da bude što jednostavniji prilikom izvršavanja, da implementira mali segment poslovnog procesa i da može brzo da obradi zahtev i vrati odgovor na zahtev. Da bi se svi ti zahtevi ispunili, najbolje je koristiti .NET Core platformu u kombinaciji sa Docker-om. Mi smo sa ovom kombinacijom arhitekturalnog rešenja i izabranom tehnologijom imali odlično iskustvo.

Slika 2: Docker kontejneri sa paketima

Amazon Web Services (AWS)

Na kraju, aplikaciju je trebalo objaviti na Amazonovim Web Servisima (AWS).

AWS predstavlja sigurnu cloud platformu koja klijentima nudi usluge hostovanja aplikacija, obezbeđuje prostor za skladištenje podataka i mnoge druge servise. AWS ima razvijen alat (AWS Toolkit) za Visual Studio 2017, sto je nama omogućilo jednostavan razvoj dokerizovanog mikroservisa i objavu na AWS kroz sam Visual Studio korišćenjem ECS-a (Elastic Container Service). S obzirom da je prema projektnoj dokumentaciji model podataka bio nerelacioni, kao bazu podataka smo koristili Amazonovu NoSql bazu DynamoDB sa kojom je jednostavno raditi korišćenjem SDK za .NET Core.  Druga stvar zbog koje smo se odlučili za DynamoDB je to što svi mikroservisi koji zavise od podataka iz određenog mikroservisa, bilo kakve izmene mogu da čitaju direktno iz DynamoDB stream-a.

Ovaj projekat je zaista odličan zato što uključuje dosta novih i modernih tehnologija i rešenja. Back end tim je bio zadovoljan i inspirisan za razvoj zato što ide u korak sa vremenom i uči najnovije stvari kada su Microsoft tehnologije u pitanju. Verujemo da će u budućnosti biti još dosta projekata koji su nalik ovom, kroz koje ćemo moći da učimo i pratimo savremene tehnologije i metodologije.

Share

Prijavi se da prvi dobijaš nove blogove i vesti.

Ostavite odgovor

Slaviša Božović

Senior Software Developer @ TNation
mm

Senior Software Developer sa višegodišnjim iskustvom u razvoju softvera na .NET platformi za finansijske institucije u Srbiji. Izuzetno motivisan za učenje novih tehnologija i primenu novih metodologija u programiranju. Slavišina interesovanja su vezana za .NET platformu, mikroservisnu arhitekturu, algoritmiku. Smatra da za svaki problem za koji postoji kompleksno rešenje mora da postoji i manje kompleksno rešenje, pa se trudi da za njim uvek traga. Privatno je “party manijak” i veliki obožavalac putovanja.

Prijavi se da prvi dobijaš nove blogove i vesti.

Kategorije