Ik wist voordat ik ging reageren dat me er eigenlijk gewoon buiten moest houden, maar... hier gaan we.
johnkeates schreef op woensdag 25 maart 2020 @ 10:37:
[...]
Juist wel, het gaat ook niet om een DTO, da's iets wat je vooral binnen een applicatie verwacht. Een API is ook gewoon versioned. Als je dus een modificatie doet die breaking is (bijv. toevoegen van verplichte velden) moet je je API versie ophogen. Dan draai je dus zolang het in gebruik is twee versies van de API.
Een DTO is een Data Transfer Object, een verzamelnaam voor envelopjes met data: een json representatie van data valt daar dus ook onder. Of het nu een object is tussen een library en een applicatie of een client met een service is irrelevant.
Dat een API versioned is; vanzelfsprekend. Het gaat erom dat je bij een 'centrale' definitie van je modellen niet een gedeelde verantwoordlijkheid hebt; maw: als elke afdeling binnen een bedrijf een eigen service exposed, moeten zij allemaal de centrale modellen updaten maar zijn er niet verantwoordlijk voor.
...Citation needed... Lekkere uitspraak.

johnkeates schreef op woensdag 25 maart 2020 @ 10:37:
[...]
Als je puur 'een kleinere service' draait dan is dat geen microservice maar een 'kleinere service'. Microservices zijn niet slechts hoe 'groot' je applicatie is of hoe veel services je per applicatie aanbiedt. Het is ook geen vertaling van een database, een DAL of DTO of iets dergelijks.
Het gaat om het toepassen van principes in architectuur. Hoe een ORM zijn modellen exposed aan een consumerende applicatie verschilt niet veel van hoe een client modellen van een service consumeert. Het is enkel een ander abstractieniveau van dezelfde principes.
Modellen die je service exposen staan los van de modellen in je (relationele) database, als je er al vanuit gaat dat elke service die modellen exposed een database heeft.
johnkeates schreef op woensdag 25 maart 2020 @ 10:37:
[...]
Voorbeeld: je maakt een shop en je hebt orders en producten en een winkelmand en klanten (en nog veel meer maar date laten we even voor wat het is):
Je frontend staat los van je backend. Misschien heb je een site die de frontpage laat zien, een die zoekopdrachten verwerkt, een voor de winkelmand, een voor de kassa, allemaal met een eigen verantwoordelijkheid. Of misschien is het juist een SPA, who knows.
Check, ik wilde eigenlijk nog niet eens een verschil maken in frontend of backend, je hebt een client en een service. Of die client nu een frontend is of een andere service of een applicatie van een derde partij is irrelevant. Maar voor dit voorbeeld: backend-frontend, ok.
johnkeates schreef op woensdag 25 maart 2020 @ 10:37:
[...]
Die gaat met je backend communiceren, door met een API te praten. Die API is niet rechtstreeks de API van een instance van een service maar een gateway of ingress controller. Je praat voor je requests tegen zo'n gateway of ingress en die zoekt verder zelf uit naar welke service en welke instance van zo'n service je request gaat.
Dat weet je niet en is irrelevant. Nogmaals: een client praat met een service. Hoeveel routers, reverse proxies, gateways, ingress controllers of andere hippe infrastructuurvoorzieningen nodig zijn is voor dit vraagstuk irrelevant.
johnkeates schreef op woensdag 25 maart 2020 @ 10:37:
[...]
Stel dat je frontend wil weten hoe veel items in je winkelmand zitten doet ie misschien een request naar winkel.com/api/v1/winkelmand en afhankelijk van hoe efficient je het bouwt een GET met een /count of een complete GET en dan in de frontend een count van de resultaten. Dan maakt het dus niet uit wat het contract of datamodel aan de binnenkant is, je werkt dan ook niet met een 'entity' maar met een API schema.
Het API schema dat, in jouw voorbeeld, via een gateway ontsloten wordt is de public facing API. Waar de TS het over heeft is een API van een service (bijvoorbeeld van TS: 'orders'). Elke service kan door een ander bedrijf(onderdeel) opgeleverd worden of in een andere taal geschreven zijn of niet eens in hetzelfde VPC staan. Ik zie nog steeds niet in waarom je gedeelde code na zou willen streven, met alle afhankelijkheidsimplicaties van dien.
Bovendien zou een model X dat service A met service B (gedeeltelijk) 'deelt' onderdeel uitmaken van die centrale code. Service C deelt model Y (gedeeltelijk) met zowel A en B, maar geeft niks om model X. Waarom zou X dan onderdeel moeten uitmaken van C?
My opinions may have changed but not the fact that I am right ― Ashleigh Brilliant