punim diplomesmu.umib.net/diplomapublikimipublic/downloaddok?dok... · 3 2. hyrja dhe motivimi në...

50
UNIVERSITETI I MITROVICËS “ISA BOLETINI” FAKULTETI I INXHINIERISË MEKANIKE DHE KOMPJUTERIKE DEPARTAMENTI: INFORMATIKË INXHINIERIKE PUNIM DIPLOME Mentori: Kandidati: MSc. Besmir Sejdiu, PhD Cand. Mentor Shyti Mitrovicë, Shtator, 2020

Upload: others

Post on 21-Oct-2020

33 views

Category:

Documents


1 download

TRANSCRIPT

  • UNIVERSITETI I MITROVICËS “ISA BOLETINI”

    FAKULTETI I INXHINIERISË MEKANIKE DHE

    KOMPJUTERIKE DEPARTAMENTI: INFORMATIKË

    INXHINIERIKE

    PUNIM DIPLOME

    Mentori: Kandidati:

    MSc. Besmir Sejdiu, PhD Cand. Mentor Shyti

    Mitrovicë, Shtator, 2020

  • 1

    UNIVERSITETI I MITROVICËS “ISA BOLETINI”

    FAKULTETI I INXHINIERISË MEKANIKE DHE

    KOMPJUTERIKE DEPARTAMENTI: INFORMATIKË

    INXHINIERIKE

    PUNIM DIPLOME

    Ueb shërbimet RESTful API dhe mikroshërbimet

    Mentori: Kandidati:

    MSc. Besmir Sejdiu, PhD Cand. Mentor Shyti

    Mitrovicë, Shtator, 2020

  • 2

    1. Përmbajtja

    2. Hyrja dhe motivimi ............................................................................................................................. 3

    3. Interneti, protokollet dhe komunikimi nëpërmjet ueb-it ................................................................ 4

    4. Ueb shërbimet RESTful .................................................................................................................... 11

    5. Mikroshërbimet ............................................................................................................................... 21

    6. Teknologjitë dhe arkitektura e përdorur për zhvillimin e aplikacionit ......................................... 27

    7. Zhvillimi i një aplikacioni që përdorë ueb ..................................................................................... 36

    8. Testimi i aplikacionit ........................................................................................................................ 45

    9. Përfundimi ....................................................................................................................................... 47

    10. Literatura ....................................................................................................................................... 48

    11. Lista e figurave .............................................................................................................................. 49

    10. Lista e tabelave .............................................................................................................................. 49

  • 3

    2. Hyrja dhe motivimi

    Në këtë punim diplome do të trajtohet tema që ka të bëjë me komunikimin në internet

    ndërmjet sistemeve të ndryshme si dhe programimin me anë të mikroshërbimeve

    (microservices).

    Për rritjen e vrullshme të përdorimit të internetit tanimë nuk kemi asnjë dyshim, gjë kjo që

    na shtyn që të përdorim teknologji të reja që mund ta përballojnë intensitetin e shfrytëzuesve

    të resurseve tona në internet si dhe ta rrisim shpejtësinë për t’iu qasur atyre.

    Në të kaluarën ka qenë synim se si të jemi prezent në internet, por me rritjen e shfrytëzimit

    të internetit janë rritur edhe nevojat për përdorimin e këtyre teknikave të reja që ua

    mundësojnë zhvilluesve sikur administratorëve ndërhyrjet më të shpejta dhe pa ndalim të

    funksionimit të resurseve të tyre në internet.

    Shumëllojshmëria e pajisjeve teknologjike që kanë qasje në internet, gjithashtu i ka shtyrë

    inxhinierët të mendojnë për sisteme unitare që programet në këto pajisje të ndryshme të kenë

    një pikë referuese për qasje në resurse të njëjta, për këtë arsye kemi vendosur që në këtë temë

    ta shtjellojmë komunikimin në mes sistemeve në internet e në veçanti për teknologjinë

    REpresentational State Transfer (REST).

    Gjithashtu në këtë temë do të flasim edhe për mikroshërbimet, për përdorimin e tyre, për

    përparësitë dhe ngecjet që kanë aplikacionet që përdorin mikroshërbimet si dhe do të shohim

    në praktikë se si funksionojnë në aplikacionin që e kemi zhvilluar.

  • 4

    3. Interneti, protokollet dhe komunikimi nëpërmjet ueb-it

    Interneti është gjithnjë e më shumë një pjesë e rëndësishme e njerëzve në mbarë botën.

    Në këtë kapitull që është si hyrje për shtjellimin e kapitujve të tjerë do t’i shpjegojmë

    konceptet bazike lidhur me internetin.

    Çka është interneti?

    Interneti është një rrjet global i miliarda kompjuterëve dhe pajisjeve të tjera elektronike.

    Me internet është e mundur që të keni qasje thuajse në çdo informacion, të komunikoni me

    të tjerët që ndodhen në largësi si dhe të bëni shumë gjëra të tjera.

    Ju mund t’i bëni të gjitha këto thjesht duke e kyçur një kompjuter në internet apo siç njihet

    ndryshe të hyni në linjë (going online). Pra kur dikush thotë që është online është thjesht një

    mënyrë tjetër për të thënë se është i kyçur në internet.

    Çka është Uebi (Web)?

    World Wide Web apo vetëm web, si quhet shkurt zakonisht, është një koleksion i

    uebsajteve(websites) që mund t’iu qasesh përmes internetit. Uebsajti është i përbërë nga

    teksti relevant, imazhet dhe resurset e tjera. Uebsajti mund t’i ngjajë formateve të ndryshme

    të medieve, p.sh.: artikullit të gazetës a ndonjë programi televiziv ose mund të jetë interaktiv

    në mënyrë që është unike për kompjuterët.

    Një uebsajt mund të dedikohet për qëllime të ndryshme, si: platformë lajmesh, për reklamim,

    librari online, forum për publikimin e fotografive ose diçka tjetër.

    Përderisa ju jeni të kyçur në internet ju mund t’iu qaseni dhe t’i shikoni uebsajtet duke e

    përdorur një aplikacion të quajtur web browser. Sa për sqarim, web browser-i nuk është

    interneti por vetëm përdoret si vegël për t’iu qasur uebsajteve në internet.

  • 5

    Si funksionon interneti?

    Adresat e internetit

    Për shkak se interneti është rrjet global i kompjuterëve, secili kompjuter që është i kyçur në

    të duhet të ketë një adresë unike. Adresat e internetit janë të formës nnn.nnn.nnn.nnn, ku

    nnn duhet të jetë një numër 0 – 255. Kjo adresë është e njohur si IP adresë. (IP do të thotë

    Internet Protocol – Protokoll Interneti)

    Figura 1 ilustron dy kompjuterë të lidhur në internet, njëri me IP adresë 1.2.3.4 dhe tjetri me

    IP adresë 5.6.7.8. Interneti është paraqitur si objekt abstrakt në mes tyre.

    Figura 1. Komunikimi i dy kompjuterëve përmes internetit

    Nëse kyçemi në internet përmes një ISP (Internet Service Provider) zakonisht na caktohet një

    IP adresë e përkohshme deri sa të mbarojë sesioni. Nëse ne lidhemi në internet nga një rrjet

    lokal (LAN – Local Area Network) kompjuteri ynë mund të ketë një IP adresë permanente

    ose mund të marrë një të përkohshme nga DHCP1 (Dynamic Host Configuration Protocol)

    server. Në secilin rast, kompjuteri ynë do të ketë një IP adresë unike [4].

    Protokollet dhe paketat

    Pasi kompjuteri ynë tashmë është i lidhur në internet dhe ka një IP adresë unike, të supozojmë

    se duam që nga kompjuteri ynë, me IP adresë 1.2.3.4, t’i dërgojmë një mesazh, me tekst

    “Tung”, kompjuterit me IP adresë 5.6.7.8. Është e qartë se mesazhi duhet të transmetohet

    nëpërmjet telave nga të cilët kompjuteri ynë është i lidhur në internet. P.sh. nëse ne jemi të

    lidhur në internet përmes LAN atëherë mesazhi duhet të transmetohet përmes kabllos

    koaksiale. Kështu, mesazhi duhet të përkthehet nga teksti alfabetik në sinjale elektronike, të

    1 Është një protokoll i menaxhimit të rrjetit i përdorur në rrjetet e Protokollit të Internetit

  • 6

    transmetohet përmes internetit dhe të arrijë në kompjuterin tjetër duke u përkthyer prapë në

    mesazh me tekst alfabetik. Si arrihet kjo? Kjo arrihet përmes përdorimit të një steku të

    protokollit. Çdo kompjuteri i nevojitet një stek i tillë që të komunikojë me internet dhe

    zakonisht sistemet operative janë të ndërtuara me një stek të tillë (si p.sh.: Windows, Unix

    etj.). Steku i protokollit që përdoret në internet quhet protokolli TCP/IP, për shkak të dy

    protokolleve kryesore të komunikimit që përdoren.

    TCP/IP protokoll steku duket kështu:

    Shtresat e protokollit Komenti

    Shtresa e protokolleve të aplikacionit

    (Application Protocols Layer)

    Protokollet specifike të aplikacioneve si p.sh.: www, e-

    mail, ftp etj.

    Shtresa e protokollit të kontrollit të

    transmisionit (TCP Layer)

    TCP i drejton paketat te një aplikacion specifik i

    kompjuterit duke përdorur një numër porti (port

    number)

    Shtresa e protokollit të internetit

    (Internet Protocol Layer)

    IP drejton paketat te një kompjuter specifik duke

    përdorur një IP adresë.

    Shtresa e Harduerit

    (Hardware Layer)

    Konverton paketat që janë në të dhëna binare në sinjale

    të rrjetit dhe anasjelltas.

    Tabela 1. Shtresat e protokollit

    Nëse e ndjekim udhën që mesazhi “Tung” bën nga kompjuteri me IP adresë 1.2.3.4 në

    kompjuterin me IP adresë 5.6.7.8, atëherë ndodh diçka e tillë si në vijim:

    Figura 2. Komunikimi përmes internetit sipas shtresave të protokolleve

  • 7

    1. Mesazhi do të fillojë në majë të stekut të protokollit në kompjuterin me IP adresë

    1.2.3.4 dhe do të shkojë poshtë siç tregon në figurën 2.

    2. Nëse mesazhi që dërgohet është i gjatë, ai mund të ndahet në pjesë të vogla nëpër

    shtresat që kalon. Kjo për shkak se të dhënat që kalojnë nëpër rrjetin e internetit,

    menaxhohen të dhëna në pjesë të vogla. Në internet, këto të dhëna në pjesë të vogla

    njiheni si paketa (packets).

    3. Paketat do të kalojnë nga shtresa e aplikacionit në shtresën TCP. Secilës paketë do t’i

    caktohet një numër porti. Portet do t’i shpjegojmë më vonë. Shumë programe në

    kompjuterin që pret mesazhin mund të përdorin stekun TCP, prandaj na nevojitet që

    të caktojmë numrin e portit për të ditur se në cilin port është duke pritur përgjigje

    aplikacioni specifik.

    4. Pas shtresës TPC, paketat kalojnë në shtresën IP. Këtu është momenti kur secila

    paketë e merr adresën e destinimit, në këtë rast 5.6.7.8.

    5. Tani që paketat e mesazhit tonë kanë një numër porti dhe një IP adresë, janë gati për

    t’u dërguar përmes internetit. Shtresa e harduerit kujdeset që t’i kthejë paketat tona

    që përmbajnë tekst alfabetik në sinjale elektronike dhe t’i transmetojë përmes rrjetit

    LAN.

    6. Në anën tjetër ISP-ja jonë ka lidhje direkte në internet. Ruteri (router) i ISP-ve

    ekzaminon adresën e destinacionit në secilën paketë dhe determinon ku ta dërgojë

    atë. Zakonisht, ndalesa e radhës e paketës është një ruter tjetër.

    7. Përfundimisht paketat arrijnë te kompjuteri me IP adresë 5.6.7.8. Këtu paketat fillojnë

    nga fundi i stekut TCP/IP të kompjuterit marrës dhe vazhdojnë lart.

    8. Përderisa paketat vazhdojnë rrugën lart përmes stekut, të gjitha të dhënat e rrugëtimit

    që janë shtuar nga kompjuteri dërgues (si p.sh.: IP adresa dhe numri i portit) hiqen

    nga paketat.

    9. Kur të dhënat mbërrijnë në maje të stekut, paketat janë konvertuar në formën

    origjinale dhe shfaqet mesazhi, në rastin tonë “Tung” [4].

    Protokollet e Aplikacionit: HTTP dhe WWW (World Wide Web)

    Hyper Text Transport Protocol (HTTP) është një protokoll i bazuar në kërkesë (request)

    dhe përgjigje (response) që ndodh ndërmjet klientit dhe serverit (client - server). Një

  • 8

    HTTP klient (p.sh. një ueb shfletues siç është Mozilla) kryen një HTTP kërkesë te një

    HTTP server (p.sh. Apache server), i cili kthen një HTTP përgjigje. Protokolli HTTP

    përbëhet nga kreu (header) dhe nga të dhënat (data). Header-i i protokollit HTTP është i

    bazuar në tekst, ku header-at janë të shkruar në rreshta me tekst.

    HTTP/1.1 lejon që komunikimi ndërmjet klientit dhe serverit të jetë i pashkëputur

    (pipelined), ku shumë kërkesa mund të dërgohen (shpesh edhe në të njëjtën paketë), pa

    pritur që serveri të kthejë përgjigje. Kufizimi i vetëm është se serveri duhet t’i kthejë

    përgjigjet (responses) në të njëjtin rend siç janë pranuar. Kjo mundëson në një efikasitet

    më të madh, veçanërisht në rivalidim. Gjithashtu, një variant tjetër është në dispozicion

    e që është emëruar si HTTPS. Ky zakonisht përdoret kur privatësia e të dhënave është e

    domosdoshme, p.sh. kur kemi të bëjmë me pagesa online. Në fakt protokolli HTTPS është

    i përbërë nga dy protokolle që funksionojnë në krye të njëri-tjetrit.

    Protokolli i parë është një protokoll sigurie siç janë SSL, TLS ose PCT. Protokolli i dytë

    që funksionon përmbi protokollit të sigurisë, është HTTP. URL-të që fillojnë me https://

    në të vërtetë janë vetëm një notim i shkurtër për përdoruesit e fundit. Shfletuesi (Web

    browser) e lexon skemën URI (https://), e inicion protokollin e sigurisë te server dhe

    pastaj kur protokolli i sigurisë është konsoliduar lëshon një kërkesë (HTTP request) të

    specifikuar në URI [4].

    Më shumë për Hyper Text Transfer Protocol (HTTP)

    HTTP është një protokoll i cili mundëson përmbajtje, siç janë dokumentet në HTML.

    Është baza e çdo këmbimi të të dhënave në Web dhe në protokollet klient-server, që do

    të thotë se kërkesat janë të iniciuara nga marrësi, zakonisht Web browser. Një dokument

    i plotë është i ndërtuar nga nëndokumente të paraqitura si p.sh.: tekst, përshkrim,

    fotografi, video, skripta dhe të tjera (figura 3).

  • 9

    Figura 3. Ilustrimi si funksionon një uebsajt në internet

    Klientët dhe serverët komunikojnë duke shkëmbyer mesazhe. Mesazhet dërgohen nga

    klienti, zakonisht një Web browser, që quhen kërkesa (requests) ndërsa mesazhet që

    dërgohen nga server si një përgjigje quhen përgjigje (responses) [5].

    I dizajnuar në vitet e hershme të të ‘90-ve, HTTP është një protokoll i zgjeruar i cili evulon

    gjatë gjithë kohës. Është një protokoll që shtrihet në shtresën e application layer, që dërguar

    përmes TCP ose përmes një TLS të enkriptuar në një lidhje TCP ose përmes çfarëdo transport

    protokolli të besueshëm, mundet teorikisht të shfrytëzohet. Në sajë të zgjerimit

    (përmirësimit), HTTP

    nuk shfrytëzohet vetëm për të shfaqur hypertext dokumente, por edhe për të shfaqur fotografi

    dhe video ose edhe për të postuar përmbajtje në server [5].

    Komponentët e sistemeve të bazuara në HTTP

    HTTP është një klient-server protokoll: kërkesat (requests) janë të dërguar nga një entitet,

    user-agent (ose një proxy në emër të tij). Shumicën e kohës user-agent është një ueb shfletues,

    por mund të jetë edhe tjetër gjë.

    Çdo kërkesë (request) që është dërguar në server, do të trajtohet nga server dhe do ta përcjellë

    një përgjigje (ang. response). Në mes të kërkesës dhe përgjigjes, mund të ketë një numër të

    entiteteve, që së bashku janë të dizajnuara si proxy e që performojnë operacione të ndryshme

    dhe sillen si gateways ose caches (figura 4).

  • 10

    Figura 4. Rrjedhshmëria kërkesë - klient

    Në realitet, janë disa kompjuterë në mes të një shfletuesi dhe serverit që i trajtojnë kërkesat;

    ata janë për shembull ruterët (routers), modemët ose edhe të tjerë. Duke iu falënderuar

    dizajnimit të mirë të Web-it, këto janë të fshehura në shtresat më të ulta (network and

    transport layers). HTTP është në krye të application layer. Edhe pse janë të rëndësishme për

    të diagnostikuar problemet e rrjetit, shtresat më të ulëta janë kryesisht të parëndësishme për

    përshkrimin e HTTP [5].

    HTTP is stateless, but not sessionless

    HTTP nuk ka gjendje (stateless): nuk ka asnjë lidhje në mes dy kërkesave që janë kryer me

    sukses në të njëjtin koneksion. Kjo menjëherë sjell probleme për përdoruesit që tentojnë të

    ndërveprojnë me disa faqe njëkohësisht, për shembull, duke e shfrytëzuar shportën e blerjes

    në një faqe ecommerce. Por derisa bërthama e HTTP-së është e paqëndrueshme (stateless),

    HTTP cookies lejon që të përdoren sesione të qëndrueshme (stateful). Duke përdorur header

    mund të zgjerohen, HTTP Cookies janë shtuar në procesin e punës, duke lejuar sesionin në

    çdo HTTP request të ndajë kontekst të njëjtë ose gjendje të njëjtë [5].

  • 11

    4. Ueb shërbimet RESTful

    Çka është RESTful?

    REST qëndron për Representational State Transfer dhe është një stil arkitektural që mundëson

    komunikimin mes dy sistemeve. Termi REST është shpikur nga Roy T. Fielding në temën

    për doktoraturën (PhD.) e tij.

    Koncepti REST është i definuar nga disa rregulla, kufizime ose principe. Sistemi, aplikacioni,

    shërbimi ose çfarëdo qoftë i cili i plotëson këto REST principe quhet RESTful.

    Ueb shërbimet që i përcjellin principet RESTful quhen shërbime RESTful. URI2 shfrytëzohet

    për t’iu qasur shërbimeve RESTful për t’i marrë resurset.

    Në fjalorin RESTful, resurset nuk janë gjë tjetër përpos të dhëna dhe funksione. Kështu që

    përfundimisht ne do t’i thërrasim ueb shërbimet përmes URI për t’iu qasur funksioneve dhe

    në këtë mënyrë për t’i marrë të dhënat [6].

    Pse RESTful?

    Para se të flasim më në detaje për Restful shërbimet, së pari do të theksojmë arsyet kryesore

    që e kanë bërë këtë stil arkitektural të popullarizuar:

    1. Gjuhë dhe mjedise heterogjene – Kjo është njëra nga arsyet fundamentale të cilën po

    ashtu e kanë edhe SOAP3 shërbimet.

    • Kjo mundëson që ueb aplikacionet që janë të ndërtuara në gjuhë programuese

    të ndryshme të komunikojnë ndërmjet vete.

    • Me ndihmën e Restful shërbimeve, këto ueb aplikacione mund të qëndrojnë

    në mjedise të ndryshme, disa nga to mund të qëndrojnë në Windows, e disa

    tjera në Linux

    2 Një Identifikues i Burimeve Uniforme (URI) është një varg karakteresh që identifikojnë qartë një burim të veçantë 3 Simple Object Access Protocol – është protokoll për shkëmbimin e informacionit mes sistemeve të ndryshme

  • 12

    Në fund, pavarësisht se në çfarë mjedisi është, rezultati përfundimtar duhet të jetë i njëjtë në

    mënyrë që sistemet të komunikojnë me njëra-tjetrën. Restful ueb shërbimet e ofrojnë këtë

    fleksibilitet për aplikacionet e ndërtuara në gjuhë programuese dhe platforma të ndryshme që

    të komunikojnë ndërmjet vete.

    Tani nëse aplikacioni ynë punon me sajte siç janë Facebook, Twitter etj. ne duhet të dimë me

    çfarë gjuhe janë programuar këto sajte si dhe në çfarë platforme janë ndëtruar.

    Bazuar në këtë që thamë, ne do të duhej të shkruanim kod për të gjitha këto ueb shërbime, e

    që do të ishte një mankth. Por, Facebook, Twitter, Google etj. i shfaqin funksionalitetet e tyre

    në formë të Restful ueb shërbimeve. Kjo na lejon që këto shërbime t’i thërrasim përmes REST

    [7].

    2. Shumëllojshmëria e pajisjeve – Ditët e sotme, çdo gjë duhet të punojë në pajisjet

    mobile, pavarësisht a janë telefona mobilë, pajisje portabël, apo edhe sisteme të

    veturave.

    3. Dhe se fundimi rasti i Cloud4 – Çdo gjë është duke lëvizur drejt Cloud. Aplikacionet

    ngadalë po lëvizin drejt sitemeve të bazuara në Cloud siç janë Azure ose Amazon.

    Azure dhe Amazon sigurojnë shumë API5 të bazuar në akitekturën Restful. Prandaj,

    aplikacionet tani duhet të zhvillohen në atë mënyrë që të jenë të përshtatshme për

    sistemet Cloud. Kështu, pasi të gjitha sistemet e bazuara në arkitekturën Cloud

    punojnë me principet REST, ka më shumë kuptim që ueb shërbimet të zhvillhen në

    arkitektura të bazuara në REST për t’i shfrytëzuar sa më mirë shërbimet e bazuara në

    Cloud.

    4 Cloud computing është disponueshmëria sipas kërkesës e burimeve të sistemit kompjuterik 5 Application Programming Interface – është një ndërfaqe që definon ndërveprimin në mes sistemeve softuerike

  • 13

    Elementet kryesore të RESTful

    Ueb shërbimet me të vërtetë kanë bërë një rrugë të gjatë prej se kanë filluar të përdoren. Në

    2002, ueb konsorciumi pati lansuar definicionin e ueb shërbimeve WSDL6 dhe SOAP. Kjo

    definoi standardin se si duhej të implementoheshin ueb shërbimet.

    Në 2004, ueb konsorciumi gjithashtu lansoi definicionin për standarde shtesë të quajtura

    RESTful. Gjatë këtyre viteve, ky standard u bë mjaft i popullarizuar dhe ka filluar të përdoret

    nga shumë uebsajte të njohura në të gjithë botën duke përfshirë edhe Facebook dhe Twitter.

    REST është një mënyrë e të qasurit të resurseve që janë në një mjedis specifik. Për shembull,

    ne mund të kemi një server që përmban dokumente të rëndësishme, fotografi ose video. Të

    gjitha këto janë shembuj të resurseve. Nëse një klienti, le të themi një ueb shfletuesi i nevojitet

    ndonjëra nga këto resurse, ai duhet të dërgojë një kërkesë në server për t’iu qasur këtyre

    resurseve. REST definon mënyrën se si këto resurse mund të qasen [7].

    Elementet kryesore të implementimit të Restful janë si në vijim:

    1. Resurset – Elementi i parë kryesor janë vet resurset. Le të supozojmë se një ueb

    aplikacion në server ka të ruajtura të dhënat e disa punëtorëve. Le të supozojmë se

    URL i ueb aplikacionit është http://empmen.test. Tani në mënyrë që t’iu qasemi të

    dhënave të një punëtori në resurse përmes REST, mund të lëshohet komanda

    http://empmen.test/employee/1 - Kjo komandë i tregon ueb serverit që të na sjellë të

    dhënat e punëtorit numri i të cilit është 1.

    2. Request verbs - Kjo e përshkruan se çfarë duam të bëjmë me resurset. Shfletuesi

    lëshon një komandë GET (merr) për ta udhëzuar ueb shërbimin se ai dëshiron të marrë

    të dhëna. Gjithsesi, ka edhe Request verbs të tjera si p.sh.: POST, PUT and DELETE.

    Kështu që në rastin e shembullit http://empmen.test/employee/1, ueb shfletuesi është

    dukë lëshuar një GET Verb sepse dëshiron t’i marrë detajet e punëtorit.

    6 Web Service Description Language - është një format XML për përshkrimin e shërbimeve të pikave të fundme

    http://empmen.test/http://empmen.test/employee/1http://empmen.test/employee/1

  • 14

    3. Request Headers (koka e kërkesës) – Këto janë instruksione shtesë që dërgohen në

    kërkesë (request). Këto mund të definojnë llojin e përgjigjes (response) së kërkuar

    ose detajet e autorizimit (authorization).

    4. Request Body (trupi i kërkesës) – të dhënat që dërgohen me kërkesën. Të dhënat

    zakonisht dërgohen në kërkesë kur një kërkesë POST bëhet në një REST ueb shërbim.

    Në një POST kërkesë, klienti i tregon ueb shërbimit se ai dëshiron të shtojë një resurs

    në server. Prandaj, request body (tupi i kërkesës) duhet të përmbajë të dhënat e

    nevojshme që resursi të shtohet në server.

    5. Response Body (trupi i përgjigjes) – Kjo është pjesa kryesore e përgjigjes (response).

    Kështu, nëse jemi duke e ndjekur shembullin e mëparshëm, nëse bëjmë kërkesë në

    ueb shërbim përmes http://empmen.test/employee/1, serveri mund të rikthejë një

    JSON dokument me të dhënat e punëtorit në trupin e kërkesës (Request Body).

    6. Request status codes (status kodet e përgjigjes) – Këto kode janë kode gjenerale të

    cilat kthehen me përgjigjen (response) nga ueb shërbimi. Një shembull është kodi 200

    që kthehet kur nuk ka ndodhur asnjë gabim kur kthehet përgjigja te klienti [7].

    Metodat Restful

    Diagrami i mëposhtëm (figura 5) tregon gati të gjitha metodat (POST, GET, PUT dhe

    DELETE) dhe nga një shembull se për çka përdoren.

    Figura 5. Diagrami i metodave HTTP

    http://empmen.test/employee/1

  • 15

    Le të supozojmë se ne kemi një RESTful ueb shërbim dhe ai është i definuar në lokacionin:

    http://empmen.test/employee. Kur një klient bën një kërkesë në këtë ueb shërbim, ajo mund

    të jetë njëra nga secilat metoda të HTTP (GET, POST, DELETE ose PUT). Më poshtë

    tregohet se çfarë ndodh nëse njëra nga metodat dërgohet nga klienti.

    1. POST – Kjo metodë përdoret për të krijuar një punëtor duke shfrytëzuar ueb

    shërbimet Restful

    2. GET – Kjo metodë përdoret për të marrë listën e të gjithë punëtorëve duke shfytëzuar

    ueb shërbimet Restful

    3. PUT – Kjo metodë përdoret për të azhurnuar të gjithë punëtorët duke shfytëzuar ueb

    shërbimet Restful

    4. DELETE – Kjo metodë përdoret për fshirjen e të gjithë punëtorëve duke shfytëzuar

    ueb shërbimet Restful

    Le të shohim perspektivën për vetëm një të dhënë. Le të themi se është një punëtor me numër

    1.

    Veprimet në vazhdim do të kenë këtë kuptim:

    1. POST – Kjo metodë nuk do të aplikohet për shak se ne jemi duke shfaqur të dhënat e

    punëtorit me numër 1, kjo do të thotë që ky punëtor tashmë ekziston në sistem.

    2. GET – Kjo metodë përdoret për të marrë detajet e punëtorit me numër 1 duke

    shfytëzuar ueb shërbimet Restful

    3. PUT – Kjo metodë përdoret për të azhurnuar të dhënat e punëtorit me numër 1 duke

    shfytëzuar ueb shërbimet Restful

    4. DELETE – Kjo metodë përdoret për fshirjen e të dhënave të punëtorit me numër 1

    [7].

    http://empmen.test/employee

  • 16

    Arkitektura Restful

    Figura 6. Diagrami i arkitekturës RESTful

    Një aplikacion ose arkitekturë konsiderohet si RESTful ose stili REST nëse ka karakteristikat

    në vijim:

    1. Gjendja (state) dhe funksionaliteti janë të ndara në resurse të shpërndara – Kjo do të

    thotë se çdo resurs duhet të jetë i qasshëm përmes HTTP komandave si GET, POST,

    PUT ose DELETE. Nëse për shembull dikush dëshiron të marrë një dokument nga

    serveri, ai duhet të ketë mundësi që përmes kërkesës GET ta marrë dokumentin. Nëse

    dëshiron që ta vendosë një dokument në server atëherë duhet që të jetë në gjendje që

    përmes komandave POST ose PUT ta bëjë këtë. Dhe së fundmi, nëse dëshiron ta

    fshijë dokumentin nga serveri atëherë këtë e bën përmes kërkesës DELETE.

    2. Arkitekruara është klient/server, pa gjendje (stateless), e shtresuar dhe përkrah

    cache7-in

    7 Është një komponentë harduer ose softuer që ruan të dhënat në mënyrë që kërkesat e ardhshme për ato të dhëna të mund të shërbehen më shpejt

  • 17

    • Klient-server është arkitektura tipike ku server mund të jetë një ueb server ku

    aplikacioni qëndron (hosting) dhe klienti mund të jetë thjesht një ueb

    shfletues.

    • Pa gjendje (stateless) do të thotë se gjendja e aplikacionit nuk mirëmbahet

    nga REST. Për shembull, nëse ne e fshijmë një resurs përmes komandës

    DELETE, ne nuk mund të presim që ai resurs të na vijë në kërkesën e radhës.

    Në mënyrë që të jemi të sigurt se resursi është fshirë, ne duhet ta dërgojmë një kërkesë

    GET. Kërkesa GET dërgohet për t’i marrë të gjitha resurset në server, ku më pas ne

    jemi në gjendje të shohim nëse resursi është fshirë me të vërtetë [7].

    RESTful principet dhe kufizimet

    Arkitektura REST është e bazuar në disa karakteristika të cilat do të shtjellohen më poshtë.

    Çdo ueb shërbim REST duhet të jetë në përputhje me karakteristikat e mëposhtme në mënyrë

    që të quhet RESTful. Këto karakteristika janë të njohura edhe si princpe të dizajnit (design

    principles) që duhet të ndiqen kur punojmë me servise të bazuara në RESTful [7].

    1. RESTful klient-server

    Kjo është kërkesa fundamentale për arkitekturat e bazuara në REST. Kjo do të thotë që serveri

    do të ketë një ueb shërbim REST që do ta përmbushë funksionalitetin e kërkuar nga klienti.

    Klienti dërgon një kërkesë në ueb shërbim që ndodhet në server. Serveri pastaj ose do ta

    refuzojë ose do të bindet duke i sjellë klientit një përgjigje adekuate.

    2. Stateless

    Koncepti i stateless (pa gjendje) ka të bëjë me atë se është në dorën e klientit të sigurohet që

    i gjithë informacioni i kërkuar të dërgohet në server. Serveri nuk duhet të mirëmbajë çfarëdo

    informate ndërmjet kërkesave të klientit. Është thjesht një sekuencë e pavarur pyetje –

    përgjigje. Klienti bën një pyetje, serveri përgjigjet në mënyrë të duhur. Klienti do të bëjë një

    pytje tjetër. Serveri nuk do të mbajë në mend skenarin e pyetje-përgjigjes së mëparshme dhe

    do të përgjigjet në pytjen e re në mënyrë të pavarur.

  • 18

    3. Cache

    Koncepti i Cache-it është që të na ndihmojë në problemet e stateless që i shpjeguam më lart.

    Pasi çdo server klient kërkesë është e pavarur në natyrë, nganjëherë klienti mund ta pyesë

    serverin për kërkesë të njëjtë, edhe pse e kishte kërkuar edhe më herët të njëjtën. Kjo kërkesë

    do të shkojë në server dhe serveri do të japë një përgjigje. Kjo e rritë trafikun në rrjet. Cache

    është një koncept i implementuar në anën e klientit për të ruajtur kërkesa që tashmë janë

    dërguar në server. Kështu që nëse bëhet kërkesa e njëjtë nga klienti, në vend se të shkojë në

    server, ajo do të shkojë në cache dhe do të marrë informacionin e kërkuar. Kjo kursen sasinë

    e trafikut në rrjet nga klienti në server.

    4. Sistem i shtresuar

    Koncepti i sistemit të shtresuar është se çdo shtresë e re, siç janë shtresat e mesme

    (middleware8), mund të shtohet në mes të kërkesës së klientit dhe serverit ku është vendosur

    REST ueb shërbimi (Shtresa middleware është ajo shtresë ku krijohet e gjithë biznes logjika.

    Ky mund të jetë një shërbim shtesë me të cilin klienti mund të komunikojë para se kërkesa

    të shkojë në ueb shërbim.). Por shtimi i kësaj shtrese duhet të jetë transparent në mënyrë që

    të mos e pengojë komunikimin në mes klientit dhe serverit.

    5. Interface/ Kontrata uniforme

    Kjo është teknika themelore se si një ueb shërbim RESTful duhet të punojë. RESTful në

    parim punon në shtresën e uebit HTTP dhe përdorë komandat e mëposhtme që të ketë qasje

    në resurset e serverit.

    • POST – Për të krijuar një resurs të ri në server

    • GET – Për të marrë një resurs nga serveri

    • PUT – Për t’i ndryshuar gjendjen ose për ta azhurnuar një resurs

    • DELETE – Për ta larguar ose fshirë një resurs nga serveri [7]

    8 Është softuer kompjuterik që ofron shërbime për aplikacione softuerësh përtej atyre që janë në dispozicion nga sistemi operativ

  • 19

    SOAP vs REST. Dallimet?

    SOAP (Simple Object Access Protocol) është një standard i bazuar në ueb shërbime me qasje

    në protokoll, që është në përdorim për një kohë të gjatë. Zhvilluar fillimisht nga Microsoft,

    SOAP nuk është aq i thjeshtë siç na sugjeron akronimi.

    Një përmbledhje e shpejtë e SOAP

    SOAP mbështetet ekskluzivisht në XML9 për të ofruar shërbime të mesazheve. Microsoft

    fillimisht zhvilloi SOAP për t’i zëvendësuar teknologjitë e vjetra që nuk punonin mirë në

    internet si p.sh.: Distributed Component Object Model (DCOM) dhe Common Object

    Request Broker Architecture (CORBA).

    Këto janë funksionet kryesore të SOAP:

    • SOAP është një protokoll komunikimi i dizajnuar të komunikojë përmes internetit.

    • SOAP mund ta zgjerojë HTTP-në për mesazhe në XML format.

    • SOAP siguron transportin e të dhënave për ueb shërbimet.

    • SOAP mund të shkëmbejë dokumente të plota ose të thërrasë një procedurë të largët

    (remote procedure)

    • SOAP mund të përdoret për transmetimin e një mesazhi.

    • SOAP është platformë që është e pavarur nga gjuhët programuese.

    • SOAP është në format XML që definon se çfarë informacioni dërgohet dhe si.

    • SOAP u mundëson aplikacioneve të klientit që lirisht të lidhen me shërbime në

    distancë dhe të shfrytëzojnë metodat e këtyre shërbimeve.

    REST apo SOAP

    Nëse veç planifikoni të krijoni shërbimin tuaj të internetit, vendimi se cili protokoll duhet të

    përdoret është krejtësisht në duart tuaja. Janë jashtëzakonisht pak ueb shërbime në internet,

    siç është Amazon, që i mbështesin të dyja protokollet. Vendimi juaj shpesh përqendrohet më

    9 Qëndron për eXtensible Markup Language. XML është dizajunar për të ruajtur dhe transportuar të dhënat

  • 20

    shumë në atë se cili ueb shërbim i plotëson më së miri nevojat tuaja, sesa cilin protokoll ta

    përdorni.

    Përparësitë e SOAP

    SOAP ofron këto përparësi kur krahasohet me REST:

    • Gjuha, platforma dhe transporti i pavarur (REST kërkon të përdoret HTTP)

    • Punon mirë në mjediset e shpërndara të ndërmarrjeve (REST përdor komunikimin

    pikë në pikë (point-to-point))

    • I standardizuar

    • Siguron një shtrirje të konsiderueshme pre-build në formën e standardeve WS10

    • Menaxhim të integruar të gabimeve

    • I automatizuar kur përdoret në disa gjuhë

    Përparësitë e REST

    REST është më i lehtë për t’u përdorur dhe më fleksibil. Ka këto përparësi nga SOAP:

    • Nuk kërkon asnjë mjet të shtrenjtë të ndërveprojë me ueb shërbimet

    • Më i lehtë për t’u mësuar

    • Efikas (SOAP përdorë XML për të gjitha mesazhet, Rest mund të përdorë formate të

    tjera më të vogla për mesazhe)

    • Shpejtësi (nuk kërkohet ndonjë përpunim i gjerë (extensive))

    • Më i afërt me ueb teknologjitë tjera sa i përket filozofisë së dizajnit [8].

    10 Qëndron për Web Services (ueb shërbime)

  • 21

    5. Mikroshërbimet

    Arkitektura e mikroshërbimeve (microservices) është njëra nga arkitekturat softuerike më të

    diskutuara, dhe e ka ndryshuar përgjithmonë mënyrën sesi zhvillohen aplikacionet e

    ndërmarrjeve të mëdha. Në vend të qasjes monolitike (monolithic) të ngadalshme dhe

    komplekse, zhvilluesit dhe kompanitë kudo janë kthyer në arkitekturën e mikroshërbimeve

    për të thjeshtësuar dhe shkallëzuar strukturat e tyre. Në fakt, edhe kompanitë si Amazon,

    Netflix, Spotify dhe Uber e kanë bërë këtë tranzicion [9].

    Në vazhdim do të flasim rreth:

    • Çka është arkitektura microservices?

    • Dobitë dhe të metat

    • Microservices dhe Docker

    • Steket e teknologjisë dhe modelet arkitekturore (Technology stacks and architecture

    patterns)

    Çka është arkitektura mikroshërbimeve?

    Nuk ka ndonjë term të përgjithshëm për mikroshërbime. Definicioni më i thjeshtë për

    mikroshërbimet, të quajtura ndryshe edhe si arkitektura microservice, është një stil

    arkitekturor që strukturon një aplikacion duke shfrytëzuar shërbime që janë të lidhura në

    afërsi. Këto koleksione apo module mund të zhvillohen, të vendosen online dhe të

    mirëmbahen në mënyrë të pavarur.

    Ato veprojnë me një shpejtësi shumë më të shpejtë dhe janë më të besueshme sesa

    aplikacionet monolitike tradicionale dhe të komplikuara. Duke përdorur arkitekturat e

    mikroshërbimeve, një organizatë e çfarëdo madhësie mund të evoluojë steket teknologjike

    për t’i përshtatur me aftësitë e tyre.

    Ka shumë dobi të dukshme kur përdorim mikroshërbimet, të cilat do t’i diskutojmë më vonë,

    por janë ende disa polemika mbi atë se a duhet kompanitë të kalojnë nga sistemet monolitike

    në ato të mikroshërbimeve apo jo. Le të ekzaminojmë dallimet në mes tyre që ta kemi më të

    qartë çështjen [9].

  • 22

    Monolitik kundrejt mikroshërbimeve (Monolithic vs. Microservices)

    Arkitektura monolitike është mënyra tradicionale për zhvillimin dhe vendosjen online të

    aplikacioneve. Kjo strukturë është e bazuar rreth konceptit të një njësie të pandashme duke

    përfshirë pjesën e serverit, pjesën e klientit dhe bazën e të dhënave. Të gjitha aspektet janë

    unifikuar dhe menaxhuar si një njësi e vetme. Kjo do të thotë se për çfarëdo azhurnimi të

    kodit i gjithë sistemi do të ndryshojë. Aplikacionet monolitike mund të bëhen shpejt

    komplekse, kështu që i gjithë procesi i zhvillimit zakonisht zgjatë më shumë.

    Arkitekturë e mikroshërbimeve, në anën tjetër, e zbërthen atë në njësi të pavarura që

    funksionojnë si shërbime të ndara. Kjo do të thotë se secili shërbim e ka logjikën dhe kodin

    (codebase) e vet. Këto shërbime të ndara komunikojnë ndërmjet vete përmes API-ve

    (Application Programming Interfaces).

    Pra, cilën arkitekturë duhet ta përdorim? Le ta zbërthejmë këtë.

    Kur duhet ta zgjedhim arkitekturën monolitike?

    • Nëse ne jemi një kompani me një ekip të vogël. Në këtë mënyrë ne nuk do të

    merremi me implementimin (deploying) kompleks të një arkitekture microservice.

    • Nëse duam një lansim (launch) të shpejtë. Arkitektura monolitike kërkon më pak

    kohë për lansim. Ky sistem do të kërkojë më shumë kohë më vonë kur ne duam ta

    azhurnojmë sistemin, mirëpo lansimi fillestar është më i shpejtë.

    Kur duhet ta zgjedhim arkitekturën e mikroshërbimeve?

    • Nëse duam të implementojmë një aplikacion më të shkallëzuar (scalable).

    Shkallëzimi (sacling) i një arkitekture me mikroshërbime është shumë më i lehtë.

    Veçoritë dhe modulet e reja mund të shtohen me shumë shpejtësi dhe lehtësi.

    • Nëse kompania jonë është e madhe ose planifikon të rritet. Përdorimi i

    microservices është i përshtatshëm për kompanitë që planifikojnë të rriten, për arsye

    se microservices arkitektura është më shumë e shkallëzuar (scalable) dhe më e lehtë

    të përshtatet me kalimin e kohës. [9]

  • 23

    Dobitë dhe të metat e mikroshërbimeve (microservices)

    Ka një numër të madh të arsyeve pse një arkitekturë microservices është zgjedhje më e mirë

    gjatë zhvillimit të projekteve. Le t’i diskutojmë dobitë më të dukshme të kësaj arkitekture

    dhe pastaj do t’i shfaqim disa nga të metat. [9]

    Dobitë

    Përmirësimi i shkallëzueshmërisë (Scalability) dhe i produktivitetit

    Ekipet e mëdha zakonisht punojnë së bashku në projekte të mëdha dhe komplekse. Me

    microservices, projektet mund të ndahen në njësi më të vogla dhe të pavarura. Kjo do të thotë

    se ekpiet mund të veprojnë në mënyrë të pavarur varësisht nga logjika e domenit, kjo do të

    minimizojë koordinimin dhe tendosjen. Në sajë të kësaj, ekipet janë përgjegjëse dhe mund të

    vendosin se cilat teknologji t’i përdorin varësisht nga nevoja për çdo microservice.

    Për shembull, struktura e brendshme e secilës njësi ose konteiner (container) nuk ka rëndësi

    për aq kohë sa ndërfaqja (interface) funksionon në mënyrë korrekte. Prandaj, çdo gjuhë

    programuese mund të përdoret për të ndërtuar një microservice, kështu që ekipi përgjegjës

    mund ta zgjedhë gjuhën më të përshtatshme për anëtarët e tij.

    Integrohet mirë me sistemet e vjetra

    Sistemet monolitike janë të vështira për t’u mirëmbajtur. Shumë sisteme të vjetra janë dobët

    të strukturuara, dobët të testuara, ose varen nga tekonologji të vjetruara. Fatmirësisht,

    microservices mund të punojnë me sistemet e vjetra për ta përmirësuar kodin dhe t’i

    zëvendësojnë pjesët e vjetra. Integrimi është i lehtë dhe mund të zgjidhë shumë probleme që

    i bën sistemet monolitike diçka që i përket të kaluarës.

    Zhvillimi i qëndrueshëm

    Arkitekturat microservice krijojnë sisteme që mbesin të mirëmbajtshme për kohë të gjatë

    derisa disa pjesë mund të zëvendësohen. Kjo do të thotë se microservices mund të shkrihen

    lehtë pa e komprementuar sistemin në përgjithësi. Përderisa vartësitë (dependencies) janë

    menaxhuar në mënyrë të përshtatshme, ndryshimet mund të bëhen lehtë për t’i optimizuar

    nevojat e ekipit dhe performancën.

  • 24

    Cross-functionality11

    Microservices janë më të mira për ekipe të shpërndara. Nëse ne kemi një ekip që është rreth

    e rreth botës dhe i ndarë në divizione, microservices përfitojnë lirinë dhe fleksibilitetin për të

    punuar të pavarura. Vendimet teknike mund të merren shpejt që të integrohen me shërbime

    të tjera me shpejtësi. Cross-functionality kurrë nuk ka qenë më i lehtë. [9]

    Të metat

    Procesi i zhvillimit kërkon më shumë punë

    Operacioni për ta bërë një sistem microservices do më shumë përpjekje, pasi janë më shumë

    njësi që duhet të vendosen në server dhe gjithashtu të monitorohen. Ndryshimet në interface-

    a duhet të implementohen kështu që vendosja në server e shërbimeve individuale në mënyrë

    të pavarur të jetë ende e mundur.

    Testimi duhet të jetë i pavarur

    Përderisa të gjitha microservices duhet të testohen bashkërisht, një microservice mund ta

    bllokojë fazën e testimit dhe ta ndalojë vendosjen e microservice-ve të tjera në server. Ka

    shumë interface për t’u testuar dhe testimi duhet të bëhet në mënyrë të pavarur për të dy pjesët

    e interface.

    Vështirësitë në ndryshimin e shumë microservices

    Ndryshimet që ndikojnë shumë microservices mund të jenë më të vështira për t’u

    implementuar. Në microservice sistemin, ndryshimet kërkojnë disa koordinime për

    vendosjen e tyre në server [9].

    Microservices dhe Docker

    Docker dhe mikroshërbimet (microservices) janë sinonime të afërta. Mikroshërbimet duhet

    të jenë të sojit që të mund të vendosen në server ndaras si njësi të pavarura me shkallëzim

    (scalable). Por, çka nëse ne krijojmë shumë mikroshërbime për një aplikacion të vetëm?

    Docker është një zgjidhje e lehtë e problemit për t’i vendosur mikroshërbimet në server. Një

    11 Duke përfshirë njerëz ose departamente që bëjnë lloje të ndryshme të punës për të njëjtën kompani

  • 25

    mikroshërbim mund të paketohet në një Docker image dhe të izolohet si një Docker

    konteiner. Në këtë mënyrë ne mund të ndërtojmë një aplikacion i cili është i pavarur nga

    mjedisi i serverit. [9]

    Në vend se të ketë një makinë të tërë virtuale në pronësi, Docker konteinerët e ndajnë

    bërthamën (kernel) e sistemit operativ në serverin e Docker-it. Proceset nga konteinerët

    shfaqen në tabelën e proceseve të sistemit operativ në të cilën Docker konteinerët janë duke

    funksionuar.

    Për të përdorur Docker-in me microservices, ne duhet të krijojmë Docker images përmes

    fajllave të quajtur Dockerfile. Dockerfile-at janë të lehtë për tu shkruar, kështu që përdorimi

    i softuerit mund të jetë i lehtë. Të shohim një shembull të Dockerfile për microservices në

    Java.

    Figura 7. Shembull të Dockerfile për microservices në Java

    Një sistem mikroshërbimi tipik përmban shumë Docker konteinera. Koordinimi i një sistemi

    të konteinerëve të shumëfishtë Docker kërkon konfigurime për rrjetin virtual. Konteinerët

    duhet të jenë në gjendje të gjejnë njëri-tjetrin për të komunikuar. Docker Compose mjedisi

    mund të komunikojë me një server tjetër përmes një vegze (link), duke ofruar një sistem

    service discovery [9].

    Mikroshërbimet asinkrone

    Mikroshërbimet sinkrone i bëjnë një kërkesë microservice-ve të tjera ndërsa përpunojnë

    kërkesa dhe presin rezultate. Protokollet e komunikimit asinkron dërgojnë mesazhe, ndaj të

    cilëve reagojnë marrësit, por nuk ka përgjigje të drejtpërdrejtë. Një mikroshërbim mund të

    përkufizohet si asinkron nëse nuk bën kërkesa për mikroshërbime të tjera gjatë përpunimit,

    ose bën kërkesa, por nuk pret për rezultate.

  • 26

    Mikroshërbimet asinkrone ofrojnë disa avantazhe të dukshme për mikroshërbimet sinkrone

    dhe zgjidhin shumë prej sfidave të sistemeve të shpërndara. Logjika e kërkuar për të trajtuar

    kërkesat e mikroshërbimeve nuk varet nga rezultatet, duke i bërë kështu shumë më të

    pavarura.

    Në mënyrë të ngjashme, nëse një partner komunikimi do të dështonte, ai nuk do të rrëzonte

    të gjithë sistemin, duke ofruar rezistencë të përgjithshme për sistemin tuaj. Për më tepër,

    përpunimi dhe shpërndarja janë pothuajse gjithmonë të garantuara.

    Disa shembuj të zakonshëm të teknologjive për microservice-t asinkrone janë Kafka (një

    MOM që përdoret zakonisht për mesazhe), formatin e të dhënave REST dhe Atom (për

    infrastrukturë shtesë) [9].

    Platformat e mikroshërbimeve (microservices)

    Platformat e mikroshërbimeve, të tilla si PaaS dhe Docker scheduler, mbështesin

    funksionimin dhe komunikimin e microservices tuaja. Këto teknologji mundësojnë

    komunikimin midis mikroshërbimeve për vendosjen, analizën e log-ut dhe monitorimin.

    Për shembull, këto platforma mbështesin HTTP dhe REST me balancimin e ngarkesës dhe

    zbulimin e shërbimit. Mbështetje e kufizuar e operacioneve është e nevojshme për zbatimin

    e mikroshërbimeve, në mënyrë që ato të vendosen shpejt dhe të mbështesin mikroshërbime

    të shumta.

    Platformat e mikroshërbimeve përfaqësojnë një thjeshtëzim dhe zgjidhje të çështjeve të

    zakonshme. Disa platforma të njohura janë Kubernetes dhe Docker, të cilat janë shumë të

    rëndësishme për operacionet e microservices. PaaS dhe Cloud Foundry janë gjithashtu të

    dobishme, por ato nuk janë aq të njohura.

    Është e rëndësishme të theksohet se migracioni në këto platforma kërkon një ndryshim në

    funksionimin dhe instalimin e aplikacioneve, i cili mund të bëjë në përdorimin e një platforme

    mikroshërbimi një hap të madh dhe në kohë. Kjo është pengesa kryesore e platformave të

    mikroshërbimeve [9].

  • 27

    6. Teknologjitë dhe arkitektura e përdorur për zhvillimin e

    aplikacionit

    Siç e kemi cekur edhe në hyrje, për këtë punim diplome ne do të zhvillojmë edhe një

    aplikacion i cili vë në funksion modalitetet që i kemi shpjeguar në këtë punim.

    Në fillim do të flasim për teknologjitë e përdorura dhe arysen pse i kemi përdorur këto

    teknologji e më pas do të lëshohemi në arkitekturën e përdorur për ta ndërtuar këtë aplikacion.

    Teknologjitë

    Gjuha programuese bazë në të cilën është zhvilluar është PHP (Hypertext Preprocessor).

    Çka është PHP dhe për çfarë shërben?

    PHP është shkurtesë për Personal Home Page. E krijuar në vitin 1994 nga Rasmus Lerdorf,

    me qëllim të përcjelljes së vizitave në Web faqen që e përmbante rezymenë e tij. Kuptimi që

    i jepet sot është PHP: Hypertext Preprocessor.

    Është gjuhë programuese, e dedikuar në veçanti për zhvillimin e Web aplikacioneve. Duke

    qenë gjuhë për përpilimin e skriptave që ekzekutohen në server, programet e shkruara në PHP

    nuk kompajlohen, por interpretohen gjatë ekzekutimit. Efekti kryesor negativ i kësaj qasjeje

    është se aplikacionet, gjegjësisht skriptat, ekzekutohen më ngadalë se ato të kompajluara, siç

    janë aplikacionet e shkruara në gjuhët programuese C apo C++. Në këtë aspekt, PHP është i

    krahasueshëm me JavaScript, me një dallim thelbësor se JavaScript ekzekutohet brenda

    shfletuesit, ndërsa PHP ekzekutohet ekskluzivisht në server.

    Meqenëse shfletuesit i njohin vetëm kodet e përpiluara në HTML, CSS dhe JavaScript, edhe

    rezultati që gjenerohet nga një PHP skriptë duhet të jetë në njërën nga gjuhët e përmendura.

    Kodi i PHP mund të futet brenda kodit HTML, ku është në gjendje t’i shtojë faqes ekzistuese

    kodin HTML të gjeneruar në mënyrë programore.

    Pra, përdorimi i PHP është shumë specifik: gjenerimi i HTML kodit që insertohet në një

    HTML faqe ekzistuese. Me PHP nuk mund të shkruhen aplikacione të pavarura që rezultojnë

    në një .exe aplikacion.

  • 28

    Kodi në PHP ekzekutohet në server, jo te klienti (shfletuesi). Për dallim nga JavaScript,

    ekzekutimi i kodit në PHP nuk varet nga modeli apo versioni i shfletuesit të caktuar.

    Skripta ruhet në server dhe shfletuesit i dërgohet vetëm rezultati i ekzekutimit të kodit, në

    formë të dokumentit të formatuar në HTML/CSS.

    Për këtë shkak, skripta në PHP nuk mund të shihet në shfletues me "View Source", gjë që

    është avantazh në aspektin e mbrojtjes së pronës intelektuale, por edhe në aspektin e sigurisë

    së aplikacionit.

    Sipas Bacon J. (2007), PHP ofron një gjuhë programuese solide dhe mirë të definuar që

    përfshin përkrahjen për programim të orientuar në objekte (object-orientated programming -

    OOP), strukturat logjike, manipulimet me fajlla, aritmetikë, e shumëçka tjetër.

    Gjuha PHP është e ngjashme semantikisht me atë të gjuhëve skriptuese kombinuar me

    lehtësitë që ofron gjuha C.

    Pasi ne për zhvillimin e aplikacionit kemi përdorur Lumen framework, së pari do të flasim

    për termin framework në përgjithësi pastaj edhe për Lumen framework në veçanti [10].

    Çka është framework-u?

    Në përgjithësi, një framework është një strukturë e vërtetë ose konceptuale, e synuar të

    shërbejë si mbështetje ose udhëzues për ndërtimin e diçkaje që e zgjeron strukturën në diçka

    të dobishme.

    Në sistemet kompjuterike, një framework është shpesh një strukturë shtresore që tregon se

    çfarë lloj programesh mund ose duhet të ndërtohen dhe si ato do të ndërlidheshin. Disa

    framework-a të sistemit kompjuterik gjithashtu përfshijnë programet aktuale, specifikojnë

    ndërfaqet (interfaces) e programimit ose ofrojnë mjete programimi për përdorimin e

    framework-ave. Një framework mund të jetë për një seri funksionesh brenda një sistemi dhe

    mënyrën sesi ato ndërlidhen; shtresat e një sistemi operativ; shtresat e një nënsistemi

    aplikimi; sesi komunikimi duhet të standardizohet në njëfarë niveli të një rrjeti; dhe kështu

    me radhë. Një framework është përgjithësisht më gjithëpërfshirës sesa një protokoll dhe më

    normativ sesa një strukturë [11].

  • 29

    Lumen framework

    Lumen është një projekt i ri nga krijuesi i Laravel12, Taylor Otwell. Është një mikro-

    framework, që do të thotë është më i vogël, më i shpejtë, version më i pakët se versioni i plotë

    i ueb framework. PHP ka edhe dy mikro-framework tjerë të njohur, Slim dhe Silex.

    Lumen ka të njëjtin themel si Laravel, dhe shumë prej të njëjtëve komponentë. Por Lumen

    është i ndërtuar për mikroshërbime, jo aq shumë për aplikacione që “shihen” nga përdoruesit

    (megjithëse mund të përdoret për çdo gjë.)

    Për çka përdoret?

    Lumen është për projekte dhe komponentë që mund të përfitojnë nga komoditeti dhe fuqia e

    Laravel, por mund të përballojë të sakrifikojë disa konfigurime dhe fleksibilitete në këmbim

    të shpejtësisë.

    Lumen është në shënjestër të mikroshërbimeve - komponentëve të vegjël, të shoqëruar

    lirshëm që zakonisht mbështesin dhe përmirësojnë një projekt thelbësor (core).

    Mikroshërbimet janë komponentë të veçantë me kontekste të kufizuara (d.m.th. ato kanë

    ndërfaqe (interfaces) të përcaktuara mirë mes njëra-tjetrës), kështu që në një arkitekturë me

    mikroshërbime mund të keni disa aplikacione të vogla Lumen që mbështesin një tjetër

    aplikacion, ndoshta të mundësuar nga Laravel.

    PHP Mikro-Framework vs. Full-Stack Framework

    Framework-at full-stack ndihmojnë programuesit me të gjithë raftet e zhvillimit nga

    ndërfaqja me përdoruesin në bazën e të dhënave. Çdo gjë jashtë një framework-u të plotë,

    është teknikisht një "framework jo i plotë". Për atë grup, nëse framework-at dhe libraritë janë

    më të vogla se "5k", ose 5,000 rreshta kod, ajo njihet si një mikro-framework.

    Mikro-framework-at lënë shumë nga komponentët e një konfigurimi të plotë (full-stack

    setup), duke përfshirë:

    12 Laravel është një kornizë aplikacioni (framework) në internet me sintaksë ekspresive, elegante. Zhvilluar në PHP

  • 30

    • Mekanizmin për shabllonet ueb (Web template engine)

    • Validimin për futjen e të dhënave (Input Validation)

    • Abstraksionin e bazës së të dhënave (Database abstraction)

    • Rolet, llogaritë, dhe verifikimin (authentication)

    Arkitektura

    Figura 8. Diagrami i funksionimit te arkitekturës së mikroshërbimeve në ueb aplikacion

    Siç e kemi cekur edhe në kapitujt e mëhershëm, programin të cilin e kemi ndërtuar ka të

    mbërthyer arkitekturën me mikroshërbime (microservices). Këtu shpjegimin do ta nisim duke

    filluar nga pjesët më të mëdha të programit e duke e “copëtuar” në pjesë më të vogla për ta

    pasur një pasqyrë më të qartë.

    Ashtu siç është paraqituar edhe në figurën 8, pjesa me të cilën ka kontakt klienti është e

    quajtuar API Gateway e cila është si një portë që merr kërkesat nga klienti dhe i futë në

    funksion shërbimet (services) specifike që menaxhojnë kërkesën e caktuar.

    API Gateway merr kërkesën në formë të kërkesës HTTP ku edhe e bën filtrimin e asaj kërkese

    dhe përmes middleware kryen edhe verifikimin (authentification) dhe pastaj bën kërkesë në

    servise përkatëse. Këto kërkesa nuk janë gjë tjetër veçse thirrje në API. Zakonisht këto thirrje

    janë brenda një sistemi dhe sigurohen me një kod ose token për të cilin ka dijeni API

    Gateway. Kur servisi kthen përgjigjen, API Gateway e filtron atë përgjigje dhe ia kthen

  • 31

    klientit i cili ka bërë kërkesë. API Gateway e luan rolin e një shërbimi (service) por që është

    ndërmjetsues mes klientit dhe shërbimeve në sistem.

    Në vazhdim do të flasim për arkitekturën apo më mirë të themi për strukturën që kemi zbatuar

    nëpër shërbime.

    Kemi përdorur framework-un Lumen, ai punon në bazë të dizajnit MVC (Model-View-

    Controller), por pasi Lumen nuk është framework i plotë e zakonisht përdoret për API, ai nuk

    e ka pjesën e pamjes (View).

    PHP MVC Framework me shtresa të srtukturuara (Slim PHP MVC Frameworks with

    a Layered Structure)

    Një PHP MVC aplikacion “i trashë” ka varësi gjithandej, bllokimi dhe prirja ndaj gabimeve,

    përderisa një strukturë me shtresa përdorë injeksionin e vartësisë (dependency injection) për

    t’i mbajtur gjërat të pastra dhe të qarta.

    Janë pesë shtresa kryesore që do t'i mbulojmë:

    • Shtresa e kontrollerit

    • Shtresa e servisit

    • DTOs, një nëngrup i shtresës së servisit

    • View decorators, edhe ky një nëngrup i shtresës së servisit

    • Shtresa e repository-t

    Figura 9. Arkitektura e pa strukturuar kundrejt arkitekturës së strukturuar

  • 32

    Për të implementuar një strukturë me shtresa (layered structure), neve na nevojitet një

    konteiner për injeksionin e vartësisë (dependency injection container), një objekt që di si t’i

    inicializojë dhe t’i konfigurojë objektet. Ne nuk duhet të krijojmë ndonjë klasë shtesë sepse

    framework-u e bën të gjithë magjinë. Konsideroni shembullin e mëposhtëm:

  • 33

    Në shembullin më lart, UserService është injektuar në SiteController, UserRepository në

    UserService dhe modelet User dhe Logs janë injektuar në klasën UserRepository [12].

    Shtresa e kontrollerit (The Controller Layer)

    Puna kryesore e kontrollerit është që ta pranojë kërkesën dhe ta paraqesë rezultatin. Një

    kontroller nuk duhet të përmbajë ndonjë biznes logjikë (business logic) të aplikacionit;

    përndryshe, është shumë e vështirë të ripërdorim kodin ose ta ndryshojmë mënyrën sesi

    komunikon aplikacioni.

    Le të shqyrtojmë një shembull të kontrollerit të mbingarkuar:

  • 34

    Pse ky shembull është i keq? Ja disa arsye:

    • Përmban shumë biznes logjikë

    • Punon direkt me rekorde aktive (Active Record), kështu që nëse ne ndryshojmë diçka

    në databazë, për shembull nëse i ndërrojmë emrin fushës last_login, ne duhet ta

    ndryshojmë atë në çdo kontroller.

    • Ka njohuri për lidhjet në bazën e të dhënave, pra nëse ndryshojmë diçka në databazë

    ne duhet ta ndryshojmë atë çdokund.

    • Nuk është kodi i ripërdorshëm, kjo çon në ripërsëritjen e kodit.

    Kontrolleri duhet të jetë i thatë. Gjithçka çfarë duhet të bëjë është të marrë kërkesën dhe të

    kthejë rezultatin. Ja një shembull i tillë:

    Por ku shkojnë të gjitha gjërat e tjera? Kjo i përket shtresës së servisit [12].

    Shtresa e servisit (The Service Layer)

    Shtresa e servisit është shtresa e biznes logjikës. Këtu, dhe vetëm këtu, duhet të gjendet

    informacioni rreth rrjedhjes së biznes proceseve dhe interaksioni me modele. Kjo është një

    shtresë abstrakte dhe do të jetë e ndryshme për aplikacione të ndryshme, por principi gjeneral

    është pavarësia nga të dhënat që i ruajmë.

    Kjo është faza me potencialin më të madh për të ndodhur probleme. Zakonisht një AR model

    kthehet në kontroller, dhe si rezultat, kontrolleri duhet të punojë me këto modele dhe duhet

    të jetë i vetëdijshëm për atributet dhe vartësitë e tyre. Kjo i bën gjërat të çrregullta, nëse ne

    duam ta ndryshojmë një lidhje ose atribut të modelit ne duhet ta ndryshojmë atë në çdo vend.

    Për të mos pasur punë direkt me modele që punojnë me entitet të databazës këtu na hyjnë në

    punë DTO-t (Data Transfer Object) [12].

  • 35

    DTO (Data Transfer Object)

    Një DTO është një objekt që përdoret për t’i mbërthyer të dhënat, dhe i dërgon ato nga një

    nënsistem i një aplikacioni në një tjetër.

    DTO-t zakonisht përdoren më së shumti në shtresën e servisit, në një aplikacion me N shtresa,

    për të transferuar të dhënat nga kjo shtresë në shtresën e pamjes (UI Layer). Dobia kryesore

    këtu është reduktimi i sasisë së të dhënave që duhet të transmetohen në linja në një sistem të

    shpërndarë. Këto gjithashtu krijojnë modele të mrekullueshme në një patern MVC.

    Dekoratorët e pamjes (View Decorators)

    Pasi aplikacioni që e kemi bërë ne nuk ka komponentën e pamjes sepse është vetëm një API,

    Dekoratorët e pamjes nuk na nevojiten në këtë aplikacion mirëpo do ta shpjegojmë

    funksionin e tyre shumë shkurt.

    Për të mos pasur nevojë që brenda pamjes (view) të përdorim logjikë, këtë e bëjmë përmes

    dekoratorëve të pamjes (view decorators) [12].

    Shtresa e Repository-t (Repository Layer)

    Shtresa e repository-t punon me zbatimin konkret të ruajtjes së të dhënave. Më së miri është

    ta injektojmë repository-n përmes një ndërfaqeje për fleksibilitet dhe për zëvendësim të lehtë.

    Nëse ndryshojmë ruajtjen e të dhënave tona, duhet të krijojmë një repository të ri që zbaton

    ndërfaqen (interface) tonë të repository-ve, por të paktën nuk duhet t’i ndryshojmë shtresat e

    tjera.

    Repository e kryen rolin e një query objekti. Merr të dhëna nga baza e të dhënave dhe drejton

    punën e disa modeleve të Active Record. Modelet Active Record, në këtë kontekst, luajnë

    rolin e njësive të vetme të modelit të të dhënave - çdo objekti në sistemin për të cilin

    kujdesemi ta modelojmë dhe t’i ruajmë informacionin. Ndërsa çdo entitet përmban

    informacion, ai nuk e di se si shfaqet (nëse është krijuar ose marrë nga baza e të dhënave),

    ose si të ruajë dhe të ndryshojë gjendjen e tij. Përgjegjësi kryesore e repository-t është të

    shtojë dhe/ose të ndryshojë një entitet; kjo siguron ndarje më të mirë të problemeve duke e

    mbajtur menaxhimin e entiteteve në repository dhe duke i bërë entitetet më të thjeshta. [12]

  • 36

    7. Zhvillimi i një aplikacioni që përdor ueb shërbime

    Në kapitullin e mëparshëm folëm rreth teknologjive dhe arkitekturës që i kemi përdorur në

    zhvillimin e aplikacionit. Kurse në këtë kapitull do të flasim sesi i kemi implementuar ato

    teknologji dhe arkitektura në aplikacion.

    Shpjegimin e zhvillimit të aplikacionit do ta bëjmë në mënyrë që në fillim do t’i shpjegojmë

    funksionet e përbashkëta që i kanë të gjitha shërbimet e më pas do të ndalemi në veçoritë e

    secilit shërbim. Por në fillim le të flasim për strukturën gjenerale të aplikacionit.

    Aplikacionin të cilin e kemi zhvilluar kemi vendosur ta quajmë Todomen. Ky aplikacion

    është në formën e ueb shërbimeve dhe përdor principet e teknologjisë REST prandaj edhe

    quhet aplikacion RESTful. Qëllimi i aplikacionit është caktimi i detyrave (tasks) për

    përdoruesit. Aplikacioni ka një API Gateway që menaxhon me kërkesat që vijnë nga kilenti

    si dhe ka 4 shërbime të ndryshme që kryejnë punë të ndryshme në mënyrë të pavarur.

    Për arsye se punimi jonë ka të bëjë më shumë me ueb shërbime më shumë do të flasim përmes

    kodit, po për ta ilustruar më mirë qëllimin e aplikacionit nëse ne do t’i bënim edhe pjesën për

    pamje atëherë ai do të dukej diçka si në figurën 10.

    Figura 10. Ilustrim i pamjes (frontend) së aplikacionit

    Për shërbime (services) do të flasim pak më vonë por tani do vazhdojmë pak me strukturën

    dhe krijimin e aplikacionit në Lumen API.

  • 37

    Që të mundemi ta instalojmë Lumen duhet t’i përmbushim këto kërkesa:

    • PHP >= 7.2

    • OpenSSL PHP Extension

    • PDO PHP Extension

    • Mbstring PHP Extension

    Që ta shkarkojmë Lumen, na duhet të instalojmë Composer që lehtësisht e gjejmë me një

    kërkim në Google. Pastaj në Command Prompt shënojmë:

    Pastaj për të krijuar një aplikacion në Lumen japim komandën:

    Në rastin tonë e kemi shënuar todomen se kështu është emri i aplikacionit tonë, por mund të

    jetë çfarëdo emri tjetër.

    Pasi të hapim instalimin e krijuar në Lumen në ndonjë editor ose IDE do të kemi këtë

    strukturë (figura 11):

    Figura 11. Struktura e përgjithshme e aplikacionit

    Fokusi ynë kryesor do të jetë te dosja (folder) app, ku është pjesa kryesore e framework-ut.

    Aty do të krijojmë edhe dosje të tjera që do të na ndihmojnë në shtresëzimin e aplikacionit.

  • 38

    Gjithashtu interes do të kemi edhe te dosja database në të cilën ka një nëndsoje me emrin

    migrations, ku ruhen migracionet që në vete përmbajnë krijimin e tabelave në databazë ose

    manipulimin me to. Pjesa ku ne i caktojmë se çfarë URL do të kenë endpoints-at tonë është

    te dosja routes në skedarin (file) web.php. Në figurën 12 tregohet se si duket web.php:

    Figura 12. Rutat (routes) në web.php

    Kjo është struktura përfundimtare e aplikacionit tonë:

    Figura 13. Shërbimet e aplikacionit

    Në të gjitha shërbimet (services) ne kemi vendosur një middleware të quajtur

    AuthenticateAccessMiddleware.php i cili e bllokon qasjen nga jashtë të këtyre shërbimeve

    pa e poseduar një kod të fshehur në header të kërkesës (request), d.m.th APIGateway është

    në dijeni për këtë dhe posedon këtë kod (shifër) dhe mund t’u qaset shërbimeve pa problem.

    public function handle($request, Closure $next)

    {

    $validSecrets = explode(',', env('ACCEPTED_SECRETS'));

    if(in_array($request->header('Authorization'), $validSecrets) )

    { return $next($request);} abort(Response::HTTP_UNAUTHORIZED);

    }

  • 39

    Shërbimet (services)

    • WorkspaceAPI

    Ky servis shërben për krijimin e hapësirave punuese (workspaces) ku është edhe pikënisja

    e këtij aplikacioni. Shfrytëzuesit kanë të drejtë të krijojnë një apo disa hapësira punuese

    dhe t’i emërtojnë sipas dëshirës. Gjithashtu shfrytëzuesi mund të ftojë shfrytëzues të tjerë

    t’i bashkëngjiten hapësirës punuese të tij, ta bëjë dikë administrues ose edhe ta fshijë fare.

    Në vijim do t’i shpjegojmë hapat të cilët i kemi ndjekur për t’i bërë operacionet CRUD

    (Create Read Update Delete) për hapsirën punuese (workspace).

    Në fillim kemi krijuar tabelën për workspace përmes komandave me php artisan.

    Nga komanda:

    Do të gjenerohet skedari (file) që përmban kodin në vazhdim pasi i kemi shtuar edhe

    fushat të cilat na janë nevojitur për të krijuar tabelën workspaces:

    class CreateWorkspacesTable extends Migration

    {

    public function up()

    {

    Schema::create('workspaces', function (Blueprint $table) {

    $table->bigIncrements('id');

    $table->string('name');

    $table->boolean('is_active');

    $table->timestamp('expire_date')->nullable();

    $table->bigInteger('created_by_id')->unsigned();

    $table->timestamps();

    });

    }

    public function down()

    { Schema::dropIfExists('workspaces');

    }}

  • 40

    Në këtë klasë kemi dy funksione up() dhe down(), funksioni up thirret kur migracioni

    (migration) ekzekutohet ndërsa funksioni down thirret kur tërhiqet (rollback) migracioni.

    Komanda në vazhdim e ekzekuton funksionin up të klasës më lartë duke krijuar tabelën

    në bazën e të dhënave.

    Më pas krijojmë modelin AR për tabelën workspaces ku pastaj përmes ORM* mund të

    manipulojmë me të dhënat në tabelë. Modeli i tillë duket si kodi në vazhdim:

    class Workspace extends Model

    {

    protected $table = 'todomen_workspace_db.workspaces';

    protected $fillable = ['name', 'is_active', 'expire_date', 'created_by_id'];

    }

    Pasi të kemi krijuar modelin Workspace mund të manipulojmë me të dhëna në shtresën

    të cilën e kemi quajtur Respository ose më saktë klasën WorkspaceRespository.php. Për

    ta përdorur modelin e krijuar në e inicializojmë atë përmes injeksionit të varësisë

    (dependency injection), që mund ta shohim në konstruktorin (cunstructor) e klasës në

    vijim:

    class WorkspaceRepository

    {

    protected $workspace;

    public function __construct(Workspace $workspace)

    {

    $this->workspace = $workspace;

    }

    public function addWorkspace($workspace){

    return $this->workspace->create($workspace);

    }

    public function getWorkspaceById(int $id){

    return $this->workspace->findOrFail($id);

    }

  • 41

    public function getWorkspaces(){

    return $this->workspace->orderBy('id', 'DESC')->get();

    }

    }

    Siç edhe e kemi shpjeguar në kapitullin paraprak, te arkitektura funksionet e Repository-

    t i shfrytëzon shtresa e servisit që në rastin tonë është WorkspaceService.php:

    class WorkspaceService

    {

    use ApiResponser;

    protected $workspaceRepository;

    public function __construct(WorkspaceRepository $workspaceRepository)

    {

    $this->workspaceRepository = $workspaceRepository;

    }

    public function saveWorkspace($requestWorkspace, $userId)

    {

    $workspace = [

    'name' => $requestWorkspace['name'], 'is_active' => true,

    'created_by_id' => $userId];

    $ws = $this->workspaceRepository->addWorkspace($workspace);

    $wsUserAdmin = ['workspace_id' => $ws['id'], 'user_id' => $userId,

    'is_active' => true, 'create_by_id' => $userId];

    $this->saveWorkspaceUser($wsUserAdmin);

    $this->saveWorkspaceAdmin($wsUserAdmin);

    return $this->successResponse($ws, Response::HTTP_CREATED);

    }

    public function getWorkspace(int $id)

    {

    return $this->successResponse($this->workspaceRepository-

    >getWorkspaceById($id));

    }}

    Sipas arkitekturës së cekur këto funksione të serviseve i thërrasim në kontroller dhe pastaj

    kthejmë përgjigje në formë të Restful response. Kodi i kontrollerit

    WorkspaceController.php është si vijon:

  • 42

    class WorkspaceController extends Controller

    {

    use ApiResponser;

    protected $workspaceService;

    protected $request;

    public function __construct(WorkspaceService $workspaceService, Request

    $request)

    {

    $this->workspaceService = $workspaceService;

    $this->request = $request;

    }

    public function index(){

    return $this->workspaceService->getUserWorkspaces($this->request-

    >header('Authorization-Key'));

    }

    public function store(Request $request)

    {

    $rules = ['name' => 'required|max:254', 'expire_date' => 'date_format:Y-

    m-d H:i:s'];

    $this->validate($request, $rules);

    return $this->workspaceService->saveWorkspace($request, $this->request-

    >header('Authorization-Key'));

    }

    public function show($workspace)

    {

    return $this->workspaceService->getWorkspace($workspace);

    }

    }

    Këto përgjigje pastaj i pranon APIGateway.

    Për shkak të ngjashmërive në strukturë mes shërbimeve, vetëm këtë shërbim e kemi

    shpjeguar me anë të kodit, ndërsa të tjerëve do t’ua tregojmë vetëm funksionin.

    • BoardAPI

    Është tjetër shërbim që shërben për krijimin e tabelave në çdo hapësirë punuese.

  • 43

    Sa herë që krijohet një hapësirë punuese (workspace) tri tabela (boards) do të krijohen

    në mënyrë automatike, të cilat janë To do, Doing, Done. Shfrytëzuesi mund të krijojë

    tabela (boards) të tjera sipas dëshirës apo edhe t’i fshijë ato.

    • ListAPI

    Ky shërbim është si ndërmjetës mes shërbimit BoardAPI dhe TaskAPI. Këtu mbahet

    lista e detyrave (tasks) të cilat ndodhen në një tabelë (board).

    • TaskAPI

    Te ky shërbim jepen detaje për detyrën (task) që i caktohet shfrytëzuesit. Detyra ka

    titullin, përshkrimin që mund të jetë tekst ose figurë ose dyjat bashkë, po ashtu ka

    edhe komentet. Detyra (task) mund t’i caktohet një apo më shumë shfrytëzuesve si

    dhe mund të ketë kohë të caktuar të përfundimit.

    Në fund APIGateway ka servise që i thërrasin shërbimet e cekura më lart. Për ta thirrur

    shërbimin WorkspaceAPI e përdorim servisin WorkspaceService.php

    class WorkspaceService

    {

    use ConsumeExternalService;

    public $baseUri; public $secret; public $userId;

    public function __construct()

    {

    $this->baseUri = config('services.workspaces.base_uri');

    $this->secret = config('services.workspaces.secret');

    }

    public function obtainWorkspaces() { return $this->performRequest('GET',

    '/workspaces'); }

    public function createWorkspace($data)

    {

    return $this->performRequest('POST', '/workspaces', $data);

    }

    public function obtainWorkspace($id)

    {

    return $this->performRequest('GET', "/workspaces/{$id}");

    }

    }

  • 44

    Përmes këtyre funksioneve bëhet konsumimi i shërbimeve që i kemi në aplikacion e më pas

    këto funksione thirren në kontroller të APIGateway ku edhe jepet përgjigja përfundimtare.

    WorkspaceController.php është si në vazhdim:

    class WorkspaceController extends Controller

    {

    use ApiResponser;

    protected $workspaceService;

    public function __construct(WorkspaceService $workspaceService, Request

    $request)

    {

    $this->workspaceService = $workspaceService;

    $this->workspaceService->userId = $request->user()->id;

    }

    public function index()

    {

    return $this->successResponse($this->workspaceService-

    >obtainWorkspaces());

    }

    public function store(Request $request)

    {

    return $this->successResponse($this->workspaceService-

    >createWorkspace($request->all()));

    }

    public function show($workspace)

    {return $this->successResponse($this->workspaceService-

    >obtainWorkspace($workspace));

    }}

    Shumica e resurseve në APIGateway nuk mund të qasen pa pasur një verifikim

    (authentification). Këtë problem e kemi zgjidhur përmes integrimit të Laravel Passport në

    projektin tonë. Instalimi i Laravel Passport bëhet përmes Composer me komandën:

  • 45

    8. Testimi i aplikacionit

    Testi i njësisë (Unit test) na ndihmon të përcaktojmë se çfarë supozojmë të bëjmë para se të

    fillojmë ta bëjmë atë. Lumen ka të konfiguruar mjedisin e testimit për ne. Skeda (file) e

    konfigurimit është phpunit.xml e vendosur brenda direktoriumit të projektit. I gjithë testi ynë

    do të jetë brenda direktoriumit të testeve.

    Për arsye të testimit kemi krijuar një skedar (file) të ri prove (test) brenda këtij direktoriumi.

    Skedarin e kemi emëruar WorkspaceTest.php. Dosja jonë e provës do ta trashëgojë klasën

    TestCase. Me këtë klasë tani kemi qasje në të gjitha metodat që mund t’i përdorim për të

    testuar pikat tona përfundimtare (endpoints).

    Testimi do të përfshijë këto pika të fundme (endpoints):

    • /workspaces [GET] — i merr të gjitha hapësirat punuese (workspaces).

    • /workspaces/id [GET] — e merr vetëm një hapësirë punuese.

    • /workspaces [POST] — shton një hapësirë punuese të re.

    • /workspaces/id [PUT] — ndryshon një hapësirë punuese.

    • /workspaces/id [DELETE] — fshin një hapësirë punuese.

    Ky është skedari (file) ynë:

    class WorkspaceTest extends TestCase

    {

    public function testShouldReturnAllWorkspaces()

    {

    $this->get("workspaces", []); $this->seeStatusCode(200);

    $this->seeJsonStructure(['data' => ['*' => ['id', 'name', 'is_active',

    'expire_date', 'created_by_id', 'created_at', 'created_at']]]);

    }

    public function testShouldReturnWorkspace()

    {

    $this->get("workspaces/2", []); $this->seeStatusCode(200);

    $this->seeJsonStructure(['data' => ['id', 'name', 'is_active',

    'expire_date', 'created_by_id', 'created_at', 'created_at']]);

  • 46

    }

    public function testShouldCreateWorkspace()

    {

    $parameters = ['name' => 'TEST name'];

    $this->post("workspaces", $parameters, []);

    $this->seeStatusCode(201);

    $this->seeJsonStructure(['data' => ['id', 'name', 'is_active',

    'created_by_id', 'created_at', 'created_at']]);

    }

    public function testShouldUpdateWorkspace(){

    $parameters = ['name' => 'TEST edited name', 'is_active' => true];

    $this->put("workspaces/6", $parameters, []);

    $this->seeStatusCode(200);

    }

    public function testShouldDeleteWorkspace(){

    $this->delete("workspaces/15", [], []); $this->seeStatusCode(204);

    }

    }

    Pasi kemi përfunduar klasën WorkspaceTest atëherë ne mund t’i ekzekutojmë provat (tests)

    tona. Ekzekutimin e bëjmë përmes terminalit duke përdorur komandat specifike.

    Nëse duam ta testojmë një metodë specifike, testSholudRetrunAllWorkspaces në rastin tonë,

    ose nëse duam t’i testojmë të gjitha metodat e klasës atë e bëjmë përmes komandës:

    Pas ekzekutimit të komandës së fundit në terminal do të na shfaqet mesazhi se testimet janë

    kryer me sukses:

  • 47

    9. Përfundimi

    Mikroshërbimet janë më të përshtatshmet për aplikacione më të mëdha. Aplikacionet më të

    vogla zakonisht janë më mirë me një bazë kodi monolit (monolith).

    Ndonëse është më e lehtë për të zhvilluar dhe për të mirëmbajtur mikroshërbime të pavarura,

    menaxhimi i rrjetit kërkon përpjekje shtesë.

    Ne kemi folur në detaje për të dy stilet e arkitekturës monolitike dhe atë të mikroshërbimeve.

    Ne diskutuam gjithashtu problemet e ndryshme kyçe të aplikacioneve monolitike dhe sesi

    paraqiten mikroshërbimet për t'i zgjidhur ato në botën e re të zhvillimeve të aplikacioneve.

    Me pak fjalë, zgjidhni arkitekturën e mikroshërbimeve për benefitet e mëposhtme:

    • Zhvilloni dhe vendosni në mënyrë të pavarur shërbime

    • Shpejtësia dhe gatishmëria

    • Cilësia më e mirë e kodit

    • Kodi i krijuar / organizuar rreth funksionalitetit të biznesit

    • Rritja e produktivitetit

    • Shkallëshmëria (scale) më e lartë

    • Liria (në një farë mënyre) për të zgjedhur teknologjinë / gjuhën e zbatimit

    Edhe me të gjitha përfitimet e ofruara nga arkitektura e mikroshërbimeve, ajo nuk është një

    plumb argjendi. Ka ndërlikimet e veta. Mendoni për raste të shumta të qindra shërbimeve në

    një projekt të madh. Si do t’i monitoroni këto? Në rast të ndonjë dështimi të shërbimit, si do

    të gjurmohet dhe korrigjohet një gabim?

    Prandaj edhe në aplikacione të vogla dhe leht të mirëmbajtura aplikimi i arkitekturës së

    mikroshërbimeve do të na sjellte kosto shtesë. Ndërsa për aplikacione të mëdha ky stil i

    arkitekturës sjell përfitime mjaft të mëdha.

  • 48

    10. Literatura

    [1] Sam Newman, “Building Microservices: Designing Fine-Grained Systems”, O’Reilly

    Media, Inc., ISBN: 978-1491950357, 2015.

    [2] Sam Newman, “Monolith to Microservices”, O’Reilly Media, Inc., ISBN: 978-

    1492047841, 2019.

    [3] Samisa Abeysinghe, “RESTful PHP Web Services”, Packt Publishing, 2008.

    [4] https://web.stanford.edu/class/msande91si/www-

    spr04/readings/week1/InternetWhitepaper.htm, qasur më 15/06/2020.

    [5] https://developer.mozilla.org/en-US/docs/Web/HTTP/Overview, qasur më 18/06/2020.

    [6] https://phppot.com/php/php-restful-web-service/, qasur më 19/06/2020.

    [7] https://www.guru99.com/restful-web-services.html, qasur më 19/06/2020.

    [8] https://smartbear.com/blog/test-and-monitor/soap-vs-rest-whats-the-difference/, qasur

    më 25/06/2020.

    [9] https://www.educative.io/blog/microservices-architecture-tutorial-all-you-need-to-get-

    started, qasur më 28/06/2020.

    [10] Tahir Hoxha, “PHP dhe MySQL për fillester”, 2015.

    [11] https://whatis.techtarget.com/definition/framework, qasur më 02/07/2020.

    [12] https://www.toptal.com/php/maintain-slim-php-mvc-frameworks-with-a-layered-

    structure, qasur më 03/06/2020.

    [13] https://lumen.laravel.com/docs/7.x, qasur më 03/06/2020.

    [14] https://medium.com/@OlabodeAbesin/microservice-architecture-the-complete-guide-

    357bf7131cf1, qasur më 05/06/2020.

    https://web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htmhttps://web.stanford.edu/class/msande91si/www-spr04/readings/week1/InternetWhitepaper.htmhttps://developer.mozilla.org/en-US/docs/Web/HTTP/Overviewhttps://phppot.com/php/php-restful-web-service/https://www.guru99.com/restful-web-services.htmlhttps://smartbear.com/blog/test-and-monitor/soap-vs-rest-whats-the-difference/https://www.educative.io/blog/microservices-architecture-tutorial-all-you-need-to-get-startedhttps://www.educative.io/blog/microservices-architecture-tutorial-all-you-need-to-get-startedhttps://whatis.techtarget.com/definition/frameworkhttps://www.toptal.com/php/maintain-slim-php-mvc-frameworks-with-a-layered-structurehttps://www.toptal.com/php/maintain-slim-php-mvc-frameworks-with-a-layered-structurehttps://lumen.laravel.com/docs/7.xhttps://medium.com/@OlabodeAbesin/microservice-architecture-the-complete-guide-357bf7131cf1https://medium.com/@OlabodeAbesin/microservice-architecture-the-complete-guide-357bf7131cf1

  • 49

    11. Lista e figurave

    Figura 1. Komunikimi i dy kompjuterëve përmes internetit .............................................................. 5

    Figura 2. Komunikimi përmes internetit sipas shtresave të protokolleve ........................................... 6

    Figura 3. Ilustrimi si funksionon një uebsajt në internet ..................................................................... 8

    Figura 4. Rrjedhshmëria kërkesë - klient ............................................................................................ 9

    Figura 5. Diagrami i metodave HTTP ............................................................................................... 16

    Figura 6. Diagrami i arkitekturës RESTful ........................................................................................ 17

    Figura 7. Shembull të Dockerfile për microservices në Java ............................................................ 25

    Figura 8. Diagrami i funksionimit te arkitekturës së mikroshërbimeve në ueb aplikacion ............... 30

    Figura 9. Arkitektura e pa strukturuar kundrejt arkitekturës së strukturuar ...................................... 31

    Figura 10. Ilustrim i pamjes (frontend) së aplikacionit ..................................................................... 36

    Figura 11. Struktura e përgjithshme e aplikacionit ........................................................................... 37

    Figura 12. Rutat (routes) në web.php ................................................................................................ 38

    Figura 13. Shërbimet e aplikacionit .................................................................................................. 38

    12. Lista e tabelave

    Tabela 1: Shtresat e protokollit .......................................................................................................... .6

    file:///C:/Users/Dardan/Desktop/Dardan%20Baliu%20-%20Tema%20e%20diplomes.docx%23_Toc511676572file:///C:/Users/Dardan/Desktop/Dardan%20Baliu%20-%20Tema%20e%20diplomes.docx%23_Toc511676572file:///C:/Users/Dardan/Desktop/Dardan%20Baliu%20-%20Tema%20e%20diplomes.docx%23_Toc511676574file:///C:/Users/Dardan/Desktop/Dardan%20Baliu%20-%20Tema%20e%20diplomes.docx%23_Toc511676574