Omdat je per component toch nog steeds maar praktisch zoveel man eigenaar ervan kan laten zijn.
Oftewel als je 1 login-component hebt kan je niet snel iets in de lucht gooien dat voor china bijv het inloggen ook via wechat kan laten verlopen. Je hele applicatie verwacht dat het via die ene login-component verloopt.
Met microservices zou je gewoon een 2e login microservice de lucht in kunnen gooien (gemaakt door een los team in china die de microservice gewoon in een totaal andere taal kan maken) die je alleen gebruikt voor ip's afkomstig uit china.
Met microservices kan je echt elke onderlinge koppeling weghalen en ze puur laten werken op hoe je het verkeer laat routeren binnen je microservices mesh.
En hoe je het verkeer dan routeert hoef je nergens echt vast te leggen, dat kan je gewoon door hardwarematige load-balancers etc doen die weer totaal geen kennis hebben van jouw microservices maar wel verkeer routeren als een malle (inclusief failover en redundancy etc waardoor je je infrastructuur ook gelijk failover en redundant maakt)
Dat is tegelijk het mooie en het gevaar van microservices, in principe kan je gewoon login v2 lanceren die iets andere parameters pakt waarbij je login v1 micro-services dus een error 500 teruggeven bijv zodat je loadbalancers vanzelf login v1 micro-services uit gaan faseren en daar hoef je in principe niets voor te doen, het gaat "automatisch". En mocht het toch fout zijn in die login v2 dan geef je gewoon de oude parameters weer terug en je login v2 gaat nu error 500 produceren (want foutieve parameters) en gaat vanzelf uitgefaseerd worden terwijl login v1 vanzelf weer terug komt (want die gaat weer code 200 teruggeven)
Want je moet het organisatorisch wel redelijk strak hebben geregeld om te weten welke login services er allemaal draaien als micro-services en wie er waarvoor verantwoordelijk is en wie je moet hebben bij een upgrade etc.
Want het is een reeel risico dat iemand een verkeerde microservice lanceert en dat die dan alles omver trekt.
Plus dat je een uitgebreid monitoringssysteem moet hebben om exact te weten wat er nu allemaal draait binnen je micro-services mesh. Want in theorie kan iedereen een microservice lanceren en daarmee de jouwe overbodig maken. Of jij kan iemand anders zijn aanpassing overrulen.
Het voordeel is wel weer dat als alles platgetrokken wordt, dat je niet zoals bij componenten moet gaan debuggen en de code bekijken etc, nee je trekt gewoon de laatste update terug van die microservice en kijkt of dat het oplost, zoja dan is het binnen seconden / minuten gefixed tegenover uren in een klassiek componenten systeem.
Of laat ik het eens anders proberen te beschrijven, in een monoliet heb je allerlei functies die met code aan elkaar verbonden worden. In microservices heb je grofweg diezelfde functies alleen heten ze nu microservices en zijn ze niet meer via code aan elkaar verbonden, maar via het netwerk.
Alleen waar iedereen in code zou zeggen : Je moet geen hele lijsten switch/case/if-else statements aan gaan maken op ip-adres etc. want dat valt niet te onderhouden en je hebt geen overzicht.
Is dat in netwerkland zo ongeveer de norm, alleen zijn die lijsten dan nog eens veelal dynamisch via BGP en afhankelijk van de load etc en kunnen daarnaast de berichten weer via message-queues lopen die weer andere configs kunnen hebben etc. etc.
Kijk op netwerk-gebied zijn ze veel verder qua optimale routing etc dan iemand in code kan beschrijven, alleen waar een monoliet altijd zo goed als 0 latency heeft, daar kan het netwerk wel eens besluiten dat de amerikanen op de chinese micro-services moeten aanloggen en dan praat je rustig over 10 of 20 ms latency.
Met microservices kunnen berichten ook out-of-order binnenkomen en daar heb je maar mee te dealen (als je al het complete bericht krijgt en het niet verdeeld wordt over 2 micro-services die elk een half bericht krijgen)