Mikroservisi

Mikroservisi su tehnika razvoja softvera - varijanta servisno-orijentisanog arhitekturalnog (SOA) stila koji struktuira aplikaciju kao kolekciju labavo povezanih servisa. U mikroservis arhitekturi, servisi su sitno granulirani, a protokoli su jednostavni. Korist od razgradnje aplikacije na posebne, manje servise je u tome što se poboljšava modularnost, aplikacija je lakša za razumevanje, razvoj, testiranje i otpornija je na eroziju arhitekture.[1] Ona omogućava paralelizaciju razvoja tako što dozvoljava manjim, autonomnim timovima da nezavisno razvijaju, isporučuju i skaliraju servise.[2] Takođe dozvoljava da se individualni servisi razvijaju kroz proces konstantnog refaktoringa.[3] Arhitektura zasnovana na mikroservisima omogućava kontinualnu isporuku[1][4]

Detalji[уреди | уреди извор]

Još uvek ne postoji industrijski konsenzus o karakteristikama mikroservisa, a takođe nedostaje i zvanična definicija. Neke od karakteristika koje se najčešće citiraju uključuju:

Apstraktni prikaz mikroservisa

Arhitektura zasnovana na mikroservisima:


Istorija[уреди | уреди извор]

Tokom radionice softver arhitekata održane u okolini Venecije u Maju 2011. korišćen je izraz "mikroservisi" da opiše ono što su učesnici videli kao zajednički arhitektonski stil koji su mnogi od njih tada istraživali. U Maju 2012. ta ista grupa je došla do zaključka da je "mikroservis" najprikladniji naziv. Džejms Luis (James Lewis) je neke od ovih ideja predstavio u studiji na konferenciji "33rd Degree" u Krakovu "Mikroservisi - Java, na Unix način".[15] Adrijan Kokroft (Adrian Cockcroft) iz Netflixa je opisao ovaj pristup kao "sitno granulirani SOA", bio je pionir ovog stila na web nivou, kao i mnogi drugi pomenuti u ovom tekstu - Džo Valnes (Joe Walnes), Den Nort (Dan North), Ivan Bočer (Evan Bottcher) i Grejem Tekli (Graham Tackley).[16]

Dr. Piter Rodžers (Peter Rodgers) uveo je termin "Mikro-web-servisi" tokom prezentacije na Web Services Edge konferenciji 2005. Na slajdu br. 4 prezentacije iznosi tvrdnju da su "Softverske komponente zapravo Mikro-web-servisi".[17] Juval Lovi (Juval Löwy) je imao slične ideje u vezi klasa kao granuliranih servisa, kao sledeći korak u evoluciji Majkrosoft arhitekture.[18][19][20] "Servisi su sastavljeni pomoću Unix-olike protočne obrade. Servisi mogu da pozivaju servise. Kompleksni servisni skupovi su apstrakovani iza jednostavnih URI interfejsa. Svaki servis u bilo kojoj granuliranosti može biti objavljen". On je opisao kako dobro dizajnirana servisna platforma "primenjuje arhitekturalne principe Web-a i Web servisa zajedno sa Unix-olikim raspoređivanjem i protočnom obradom da bi obezbedila radikalnu fleksibilnost i unapređenu jednostavnost obezbeđujući platformu za servisno orijentisanu arhitekturu kroz vaše aplikacijsko okruženje".[21] Dizajn, koji je potekao iz istraživačkog projekta Hjulet-Pakarda, ima za cilj da napravi kod manje krhkim, te da velike, kompleksne softverske sisteme učini robusnijim za promene.[22] Da bi "Mikro-web-servisi" funkcionisali, moraju se ispitati i analizirati temelji arhitekturalnih stilova (poput SOA) i uloga razmene poruka između softverskih komponenti da bi se došlo do nove generalne računarske apstrakcije.[23] U ovom slučaju možemo razmišljati o resursno-orijentisanom računarstvu (ROC) kao o generalizovanoj formi Web apstrakcije. Ako je Unix apstrakcija bila "sve je datoteka", u ROC-u, sve je "Mikro-web-servis". Može sadržati informacije, kod ili rezultate izračunavanja tako da servis može biti kako proizvođač, tako i potrošač u simetričnoj i evoluirajućoj arhitekturi.

Mikroservisi su specijalizacija implementacije pristupa za servisno-orijentisana arhitekturu (SOA), korišćena za izradu nezavisno isporučivih softverskih sistema.[24] Mikroservis pristup je prva SOA realizacija kojoj je sledilo uvođenje DevOps-a i postalo je popularno za izgradnju sistema sa kontinualnom isporukom.[25]

Filozofija[уреди | уреди извор]

Filozofija mikroservis arhitekture se suštinski izjednačava sa Unix filozofijom "Radi jednu stvar i radi je dobro". Ona je opisana sledećim:[26][27][28]

  • Servisi su mali - sitno granulirani da imaju jednu funkciju.
  • Organizaciona kultura mora da prihvati automatizaciju testiranja i isporuke. Ovo olakšava teret menadžmentu i operacijama i omogućava različitim razvojnim timovima da rade na nezavisno isporučivim delovima koda.[29]
  • Kultura i principi dizajna moraju prihvatiti neuspehe i greške.
  • Svaki servis je elastičan, otporan, kompozitan, minimalistički i kompletan.[28]

Jezički pristup[уреди | уреди извор]

Jezički pristup razvoju mikroservisa[30] se fokusiran je na izbor programskog jezika koji lako može da predstavi mikroservis kao jedinstveni softverski artifakt. Jezik koji je dobro prilagođen mikroservisima navodi programera da razmišlja i programira u stilu mikroservisa od početka umesto da startuje koristeći drugu programersku paradigmu, da bi kasnije uradio refaktoring završenog programa kako bi isti mogao biti isporučen kao mikroservis.[31] Programski jezik koji pretenduje da ispuni ovu ulogu je Jolie.[32][33] Jednostavnost Jolie programskog jezika i njegova jednostavna isporučivost našli su primenu i u Internet stvarima i pametnim kućama, gde su mikroservisi pogodan arhitekturalni izbor.[34][35]

Tehnologije[уреди | уреди извор]

Svaki mikroservis može biti implementiran u drugom programskom jeziku i može da koristi drugačiju infrastrukturu. Prema tome, najvažniji tehnološki izbor predstavlja način na koji će mikroservisi da komuniciraju između sebe (sinhrono, asinhrono, UI integracija) i protokoli koji će se koristiti za komunikaciju (REST, razmena poruka, ...). U tradicionalnim sistemima, najveći broj tehnoloških izbora, poput programskog jezika, utiče na ceo sistem. Prema tome, izbor tehnologija kod mikroservisa je posve drukčiji.[36]

Kritike[уреди | уреди извор]

Mikroservis pristup je podleže kritikama za niz pitanja:

  • Servisi formiraju informativne barijere.[37]
  • Inter-servisni pozivi preko mreže imaju veću cenu u smislu mrežne latentnosti (kašnjenja) i obrade poruka nego vreme unutar-procesnih poziva u okviru monolitnih servisnih procesa.[6]
  • Testiranje i isporuka je komplikovanija.[38]
  • Pomeranje odgovornosti između servisa je teže.[1] Ono može uključivati komunikaciju između različitih timova, ponovno pisanje postojećih funkcionalnosti u drugim programskim jezicima ili ukalupljivanje u drugu infrastrukturu.[6]
  • Gledanje veličine servisa kao primarnog strukturnog mehanizma može dovesti do previše servisa, dok bi alternativa u vidu interne modularizacije dovela do jednostavnijeg dizajna.[39]

Kognitivno opterećenje[уреди | уреди извор]

Ova arhitektura uvodi dodatnu kompleksnost i nove probleme koje treba uzeti u obzir poput latentnosti mreže, formata poruka, balansiranja opterećenja i tolerancije greški.[40][38]

Kompleksnost monolitnih aplikacija je samo premeštena na mrežu, ali i dalje postoji:

Možete je pomeriti, ali je i dalje tu!

— Robert Enet (Robert Annett): Gde je kompleksnost?[41]

Takođe, aplikacija sastavljena od bilo kog broja mikroservisa mora imati pristup svojim respektivnim ekosistemima koji mogu imati nepotrebnu kompleksnost.[42] Ova vrsta kompleksnosti može se redukovati standardizovanjem pristupnih mehanizama. Web kao sistem standardizovao je pristupni mehanizam zadržavajući isti pristupni mehanizam između aplikacija i brauzera zadnjih 20 godina. Prema broju web strana koje Google indeksira, web je porastao sa 26 miliona strana 1998. na otprilike 60 biliona 2015. bez potrebe da se menja pristupni mehanizam. Web je i sam primer kako kompleksnost nasleđena iz monolitnog softverskog sistema može biti prevaziđena.[43][44]

Nanoservisi[уреди | уреди извор]

Previše usitnjeni mikroservisi su kritikovani kao anti-uzorak (anti-patern), imenovani od strane Arnona Rotem Gal Oza (Arnon Rotem-Gal-Oz) kao nanoservisi:

[A] nanoservis je anti-uzorak kod koga je servis previše usitnjen. [A] nanoservis je servis čija cena komunikacije prevazilazi njenu korisnost.[45][46]

Predložene alternative nanoservisima uključuju:

  • Pakovanje funkcionalnosti kao softverske biblioteke umesto kao servisa.
  • Kombinovanje funkcionalnosti sa drugim funkcionalnostima, stvarajući značajnije i korisnije servise.
  • Refaktoring sistema, premeštajući funkcionalnost u druge servise ili redizajniranje sistema.

Vidi još[уреди | уреди извор]

Reference[уреди | уреди извор]

  1. ^ а б в г д ђ Chen, Lianping (2018). Microservices: Architecting for Continuous Delivery and DevOps. The IEEE International Conference on Software Architecture (ICSA 2018) (на језику: енглески). IEEE. 
  2. ^ Richardson, Chris. „Microservice architecture pattern”. microservices.io (на језику: енглески). Приступљено 19. 3. 2017. 
  3. ^ Chen, Lianping; Ali Babar, Muhammad (2014). Towards an Evidence-Based Understanding of Emergence of Architecture through Continuous Refactoring in Agile Software Development. The 11th Working IEEE/IFIP Conference on Software Architecture(WICSA 2014) (на језику: енглески). IEEE. 
  4. ^ ceracm (4. 1. 2017). „Microservices-based architectures enable continuous delivery/deployment”. Eventuate.IO (на језику: енглески). Приступљено 19. 3. 2017. 
  5. ^ Nicola Dragoni, Saverio Giallorenzo, Alberto Lluch Lafuente, Manuel Mazzara, Fabrizio Montesi, Ruslan Mustafin, Larisa Safina. „Microservices: yesterday, today, and tomorrow” (PDF) (на језику: енглески). Приступљено 2. 5. 2017. 
  6. ^ а б в г д Martin Fowler. „Microservices” (на језику: енглески). Архивирано из оригинала на датум 14. 02. 2018. Приступљено 19. 05. 2018. 
  7. ^ Newman, Sam. Building Microservices (на језику: енглески). O'Reilly Media. ISBN 978-1491950357. 
  8. ^ Wolff, Eberhard. Microservices: Flexible Software Architectures (на језику: енглески). ISBN 978-0134602417. 
  9. ^ „Micro-services for performance”. Vanilla Java (на језику: енглески). Приступљено 19. 3. 2017. 
  10. ^ а б Nadareishvili, I., Mitra, R., McLarty, M., Amundsen, M., Microservice Architecture: Aligning Principles, Practices, and Culture, O’Reilly 2016
  11. ^ „IFS: Microservices Resources and Positions”. hsr.ch (на језику: енглески). Приступљено 28. 12. 2016. 
  12. ^ Nicola Dragoni, Schahram Dustdar, Stephan T. Larsen, Manuel Mazzara. „Microservices: Migration of a Mission Critical System” (PDF) (на језику: енглески). Приступљено 2. 5. 2017. 
  13. ^ Nicola Dragoni, Ivan Lanese, Stephan Thordal Larsen, Manuel Mazzara, Ruslan Mustafin, Larisa Safina. „Microservices: How To Make Your Application Scale” (PDF) (на језику: енглески). Приступљено 2. 5. 2017. 
  14. ^ Manuel Mazzara, Kevin Khanda, Ruslan Mustafin, Victor Rivera, Larisa Safina, Alberto Sillitti. „Microservices Science and Engineering” (PDF) (на језику: енглески). Приступљено 14. 11. 2017. 
  15. ^ James Lewis (2012). „Micro services - Java, the Unix Way” (на језику: енглески). Krakow, Poland. 
  16. ^ James Lewis and Martin Fowler. „Microservices” (на језику: енглески). 
  17. ^ Rodgers, Peter. „Service-Oriented Development on NetKernel- Patterns, Processes & Products to Reduce System Complexity Web Services Edge 2005 East: CS-3”. CloudComputingExpo 2005 (на језику: енглески). SYS-CON TV. Архивирано из оригинала на датум 20. 5. 2018. Приступљено 3. 7. 2017. 
  18. ^ Löwy, Juval (oktobar 2007). „Every Class a WCF Service”. Channel9, ARCast.TV (на језику: енглески). 
  19. ^ Löwy, Juval (2007). Programming WCF Services 1st Edition (на језику: енглески). стр. 543—553. 
  20. ^ Löwy, Juval (maj 2009). „Every Class As a Service”. Microsoft TechEd Conference, SOA206 (на језику: енглески). Архивирано из оригинала на датум 30. 10. 2018. Приступљено 19. 05. 2018. 
  21. ^ Rodgers, Peter. „Service-Oriented Development on NetKernel- Patterns, Processes & Products to Reduce System Complexity”. CloudComputingExpo (на језику: енглески). SYS-CON Media. Архивирано из оригинала на датум 7. 9. 2015. Приступљено 19. 8. 2015. 
  22. ^ Russell, Perry; Rodgers, Peter; Sellman, Royston (2004). „Architecture and Design of an XML Application Platform”. HP Technical Reports (на језику: енглески). стр. 62. Архивирано из оригинала на датум 09. 09. 2015. Приступљено 20. 8. 2015. 
  23. ^ Hitchens, Ron (decembar 2014). Swaine, Michael, ур. „Your Object Model Sucks”. PragPub Magazine (на језику: енглески). Pragmatic Programmers: 15. 
  24. ^ Pautasso, Cesare (2017). „Microservices in Practice, Part 1: Reality Check and Service Design”. IEEE Software (на језику: енглески). 34 (1): 91—98. doi:10.1109/MS.2017.24. 
  25. ^ „Continuous Deployment: Strategies”. javacodegeeks.com (на језику: енглески). Приступљено 28. 12. 2016. 
  26. ^ Lucas Krause. Microservices: Patterns and Applications (на језику: енглески). ASIN B00VJ3NP4A. 
  27. ^ Lucas Krause. „Philosophy of Microservices?” (на језику: енглески). Архивирано из оригинала на датум 12. 11. 2016. Приступљено 19. 05. 2018. 
  28. ^ а б Bugwadia, Jim. „Microservices: Five Architectural Constraints” (на језику: енглески). Архивирано из оригинала на датум 03. 03. 2016. Приступљено 19. 05. 2018. 
  29. ^ Li, Richard. „Microservices Essentials for Executives: The Key to High Velocity Software Development”. Datawire (на језику: енглески). Datawire, Inc. Приступљено 21. 10. 2016. 
  30. ^ Claudio Guidi. „What is a microservice? (from a linguistic point of view)” (на језику: енглески). 
  31. ^ Claudio Guidi, Ivan Lanese, Manuel Mazzara, Fabrizio Montesi. „Microservices: a Language-based Approach” (на језику: енглески). Приступљено 2. 5. 2017. 
  32. ^ Jolie Team. „Vision of microservices revolution” (на језику: енглески). 
  33. ^ Fabrizio Montesi. „Programming Microservices with Jolie - Part 1: Data formats, Proxies, and Workflows.” (на језику: енглески). 
  34. ^ Dilshat Salikhov, Kevin Khanda, Kamill Gusmanov, Manuel Mazzara, Nikolaos Mavridis. „Microservice-based IoT for Smart Buildings” (на језику: енглески). Приступљено 9. 2. 2018. 
  35. ^ Kamill Gusmanov, Kevin Khanda, Dilshat Salikhov, Manuel Mazzara, Nikolaos Mavridis. „Jolie Good Buildings: Internet of things for smart building infrastructure supporting concurrent apps utilizing distributed microservices” (на језику: енглески). Приступљено 9. 2. 2018. 
  36. ^ Wolff, Eberhard. Microservices - A Practical Guide (на језику: енглески). ISBN 978-1717075901. 
  37. ^ Jan Stenberg (11. 8. 2014). „Experiences from Failing with Microservices” (на језику: енглески). 
  38. ^ а б „Developing Microservices for PaaS with Spring and Cloud Foundry” (на језику: енглески). 
  39. ^ Tilkov, Stefan (17. 11. 2014). „How small should your microservice be?”. innoq.com (на језику: енглески). Приступљено 4. 1. 2017. 
  40. ^ Pautasso, Cesare (2017). „Microservices in Practice, Part 2: Service Integration and Sustainability”. IEEE Software (на језику: енглески). 34 (2): 97—104. doi:10.1109/MS.2017.56. 
  41. ^ Robert Annett. „Where is the complexity?” (на језику: енглески). 
  42. ^ „BRASS Building Resource Adaptive Software Systems” (на језику: енглески). U.S. Government. DARPA. 7. 4. 2015.  "Access to system components and the interfaces between clients and their applications, however, are mediated via a number of often unrelated mechanisms, including informally documented application programming interfaces (APIs), idiosyncratic foreign function interfaces, complex ill-understood model definitions, or ad hoc data formats. These mechanisms usually provide only partial and incomplete understanding of the semantics of the components themselves. In the presence of such complexity, it is not surprising that applications typically bake-in many assumptions about the expected behavior of the ecosystem they interact with."
  43. ^ Alpert, Jesse; Hajaj, Nissan. „We knew the web was big”. Official Google Blog (на језику: енглески). Google.com. Приступљено 22. 8. 2015. 
  44. ^ „The Story”. How search works (на језику: енглески). Google.com. Приступљено 22. 8. 2015. 
  45. ^ Services, Microservices, Nanoservices – oh my! (језик: енглески), Arnon Rotem-Gal-Oz
  46. ^ Practical SOA: 1.1: Nanoservices (језик: енглески), Arnon Rotem-Gal-Oz, 2010

Literatura[уреди | уреди извор]

Dodatne informacije[уреди | уреди извор]