<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>microservices &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/tag/microservices/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Thu, 09 Apr 2026 12:23:17 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>microservices &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Ecosysteem Architectuur</title>
		<link>https://www.smalsresearch.be/ecosysteem-architectuur/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Mon, 28 Feb 2022 16:22:49 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[Eventual Consistency]]></category>
		<category><![CDATA[mesh]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[NewSQL]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=16980</guid>

					<description><![CDATA[Bij het software bouwen, maken we meestal geen op zichzelf staande programma&#8217;s meer. We bouwen vandaag eerder Applicatie Ecosystemen. Wanneer we dus een stuk software schrijven, mogen we niet zomaar de ontwikkeling lokaal optimaliseren, maar moeten we ook continu rekening houden met het grotere geheel. In deze blog maken we een verkenning van een aantal [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft size-full is-resized"><a href="/wp-content/uploads/2016/06/logomicro.png"><img decoding="async" src="/wp-content/uploads/2016/06/logomicro.png" alt="" class="wp-image-9733" width="163" height="147" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/logomicro.png 679w, https://www.smalsresearch.be/wp-content/uploads/2016/06/logomicro-300x272.png 300w" sizes="(max-width: 163px) 100vw, 163px" /></a></figure></div>



<p class="justify-text">Bij het software bouwen, maken we meestal geen op zichzelf staande programma&#8217;s meer. We bouwen vandaag eerder Applicatie Ecosystemen. Wanneer we dus een stuk software schrijven, mogen we niet zomaar de ontwikkeling lokaal optimaliseren, maar moeten we ook continu rekening houden met het grotere geheel. In deze blog maken we een verkenning van een aantal zaken waar we rekening mee moeten houden bij het bouwen van een ecosysteem, en van concrete principes die we kunnen toepassen bij het uitbouwen van een erbij passende modulaire architectuur.</p>



<span id="more-16980"></span>



<h2 class="wp-block-heading" id="de-paradox-van-de-afhankelijkheid">De Paradox van de Afhankelijkheid</h2>



<p class="justify-text">Er heerst grote waarde in zaken met elkaar verbinden, en in reeds bestaande zaken te <a href="/hergebruik-de-dos-en-donts/" data-type="post" data-id="13002">hergebruiken</a> bij het bouwen van nieuwe dingen. Gegevens, en ook de manier waarop ze worden verwerkt, ja, soms zelfs hele stukken van een applicatie, van één instelling, kunnen ook van pas komen bij een andere. En uiteraard geldt hetzelfde ook al binnen één en dezelfde instelling. Er is dus een meerwaarde te vinden door zaken met elkaar te verbinden en door zaken van elkaar te gaan hergebruiken. Dit is ook het hele opzet achter het <a href="https://www.ict-reuse.be/nl">ReUse verhaal binnen onze sector</a>. Connecties en communicaties tussen systemen creëren hergebruik, efficiëntie en business waarde.</p>



<p class="justify-text">Maar wanneer we zaken verbinden, maken we ze van elkaar afhankelijk. Die afhankelijkheid heeft op technisch vlak vooral nadelen. Denk maar aan het onbeschikbaar zijn van een dienst waarvan andere diensten rechtstreeks afhangen; vaak worden deze laatste dan eveneens <a href="/99-9-availability-fundamenteel-anders/" data-type="post" data-id="1244">onbeschikbaar</a>. Maar ook semantisch maakt het de zaken moeilijker. We mogen niet zomaar puur lokaal nadenken over alle concepten die we in onze computerprogramma&#8217;s verwerken; nee, we moeten er rekening mee houden dat ze geïntegreerd of hergebruikt kunnen worden. We moeten ervoor proberen te zorgen dat de betekenis ervan voorbijgaat aan wat puur noodzakelijk is voor ons specifieke geval. Dat soort zaken maakt het ontwikkelen van software een stuk moeilijker. Dit niet doen is echter nog erger: de &#8220;technical debt&#8221; die ontstaat door teveel kortetermijn- en lokaal denken, zal dan op termijn alleen maar onbeheersbaarder worden.</p>



<p class="justify-text">En dat is dus de paradox: de afhankelijkheid tussen de systemen binnen een applicatie ecosysteem creëert enorme business waarde, maar maakt de IT een stuk lastiger (en duurder).</p>



<h2 class="wp-block-heading" id="de-mesh-van-microservices">De &#8220;Mesh&#8221; Architectuur</h2>



<p class="justify-text">Een goede architectuur kan echter soelaas brengen in dit verhaal, en consequent rekening houden met hergebruik kan uiteindelijk zelfs geld gaan besparen. Het gebruik van een <a href="/services-in-alle-maten-van-macro-naar-nano/" data-type="post" data-id="11111">Service Oriented Architecture (SOA)</a> is daarbij één van onze belangrijkste wapens om de afhankelijkheden in ons ecosysteem de baas te kunnen, met de <a href="/van-n-tier-naar-microservices/" data-type="post" data-id="9702">Microservices Architectuur</a> als ultieme voorbeeld. Dit zijn echter slechts voorbeeld technische implementaties van het belangrijke concept <em>Modulariteit </em>(dat men in principe zelfs binnenin een monolithisch systeem kan implementeren). Wat proberen we hiermee te bereiken?</p>



<ul class="justify-text wp-block-list"><li>Modules zijn zo onafhankelijk van elkaar als maar kan (maar maken toch van elkaar gebruik vanwege de waarde die dit heeft): ze zijn liefst &#8220;loosely coupled&#8221;: veranderingen in de werking of het ontwerp van één module hebben zo weinig mogelijk impact op de werking of het ontwerp van een andere. Dit laat toe om ze apart van elkaar te laten werken en ze te laten onderhouden door aparte teams, zonder dat er continu overleg of downtime moet zijn (in het geval van een monoliet verliest men wel dit downtime voordeel).</li><li>Modules zijn voldoende klein. Men volgt hier de <a href="https://en.wikipedia.org/wiki/Unix_philosophy">Unix filosofie &#8220;do one thing and do it well&#8221;</a>. In de praktijk wil dit zeggen dat modules gericht zijn op het aanbieden van één bepaalde business capabiliteit, die in principe apart kan worden gedeployed. Hoe men precies de context van een service afbakent, is één van de belangrijkste onderdelen van de <a href="https://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design (DDD)</a> ontwikkelingsmethode.</li></ul>



<p class="justify-text">Het tweede punt is niet te onderschatten en één van de moeilijkste zaken, reeds bij de business en functionele analyse en ook verderop in het ontwerp van software. In deze blog richten we ons echter op de aspecten van een groter ecosysteem, en daarom zullen we ons hier beperken tot de eerste vraag: </p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow"><p>Hoe houden we onze modules zo goed mogelijk onafhankelijk, terwijl we ze toch laten communiceren?</p></blockquote>



<h2 class="wp-block-heading" id="een-aantal-helpende-principes">Een aantal helpende Principes</h2>



<p class="justify-text">We gaan er vanaf hier van uit dat we onze modules verpakken in aparte services, en we zullen nu een aantal ontwerpprincipes overlopen die ons gaan helpen bij het uitbouwen van een ecosysteem architectuur waarin we een grote onafhankelijkheid, maar ook herbruikbaarheid, van onze services nastreven.</p>



<div class="wp-block-image justify-text"><figure class="alignright size-full is-resized"><a href="/wp-content/uploads/2022/02/usingAPI.png"><img fetchpriority="high" decoding="async" src="/wp-content/uploads/2022/02/usingAPI.png" alt="" class="wp-image-17010" width="309" height="172" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/02/usingAPI.png 497w, https://www.smalsresearch.be/wp-content/uploads/2022/02/usingAPI-300x167.png 300w" sizes="(max-width: 309px) 100vw, 309px" /></a><figcaption>Figuur 1: Twee APIs, telkens geïmplementeerd door een onderliggende service. De ene service gebruikt de API van de andere, en is dus enkel daarvan afhankelijk en niet van de onderliggende service. De pijl duidt hier de richting van de afhankelijkheid aan, maar de communicatie is steeds bidirectioneel (vraag-antwoord) en synchroon (men wacht op het antwoord).</figcaption></figure></div>



<p class="justify-text"><strong>1.  Het gebruik van APIs</strong>. Dit principe is reeds goed gekend en vormt een basissteen van SOA: Een <a href="/data-centric-it-met-rest/" data-type="post" data-id="9535">service stelt zich open naar de buitenwereld toe via zijn API</a>, en deze API is dan ook het enige waarvan andere services afhankelijk kunnen zijn. Op die manier beperkt men dus de afhankelijkheid die andere zaken m.b.t. een service zullen hebben, tot wat strikt noodzakelijk is. Men is hier echter wel nog semantisch en syntactisch afhankelijk van de APIs van andere services die men wenst te gebruiken, en ook technisch afhankelijk van het online zijn van die andere services.</p>



<p class="justify-text"><strong>2.  Het gebruik van Events</strong>. <a href="/event-driven-apis/" data-type="post" data-id="16655">Event Driven Architecture</a> is ook al oud, maar maakt meer recent furore dankzij de Reactive beweging. In plaats van (of naast) communicatie via een API, kan men de communicatie tussen services ook via het versturen van <a href="/het-event-als-leidend-voorwerp-in-software-engineering/" data-type="post" data-id="8942">events</a> laten gebeuren. Daar hoort bij dat een service die een event verstuurt, niet op voorhand weet welke andere services dit event zullen ontvangen. Services hebben hier enkel controle over de events die ze zelf versturen en dewelke ze zelf wensen te ontvangen. Het is duidelijk dat hier de onafhankelijkheid nog sterker is dan in het geval van APIs: men is niet langer rechtstreeks afhankelijk van de interface, noch van het online zijn, van een andere service. Men is enkel nog technisch afhankelijk van het online zijn van de <a href="/geavanceerd-event-driven-engineering/">Event Bus</a> (een middleware systeem dat men met grote redundantie kan opzetten), en semantisch afhankelijk van de definitie van de betrokken events (een niet te vermijden afhankelijkheid die wordt opgelegd door de business vereiste van het gebruik van de betreffende business capabiliteit die door het event mede wordt ondersteund).</p>



<div class="wp-block-image justify-text"><figure class="alignleft size-full is-resized"><a href="/wp-content/uploads/2022/02/usingCQRS-Events.png"><img decoding="async" src="/wp-content/uploads/2022/02/usingCQRS-Events.png" alt="" class="wp-image-17035" width="302" height="285" srcset="https://www.smalsresearch.be/wp-content/uploads/2022/02/usingCQRS-Events.png 467w, https://www.smalsresearch.be/wp-content/uploads/2022/02/usingCQRS-Events-300x283.png 300w" sizes="(max-width: 302px) 100vw, 302px" /></a><figcaption>Figuur 2: Twee services die gebruik maken van events om met elkaar te communiceren. De eerste biedt een command API aan, dewelke door een client wordt gebruikt om data in te dienen. Daarna stuurt deze een event naar de Event Bus, dat iets later ontvangen wordt door de tweede service. Deze zal het event gebruiken om zijn opvraagbare data te updaten, zodat deze daarna door een client kan worden opgevraagd. De pijlen van de events duiden effectief op éénrichtingscommunicatie, waarbij men niet wacht op antwoord (asynchroon).</figcaption></figure></div>



<p class="justify-text"><strong>3.  CQRS</strong>. Wanneer we microservices bouwen die zo klein en onafhankelijk mogelijk zijn, betekent dit eigenlijk dat we een onderscheid moeten beginnen maken tussen services die data binnenkrijgen en/of (deels) verwerken, en services die daarop verder bouwen om informatie te verschaffen en vragen te kunnen beantwoorden. Typisch zullen dit verschillende business capabilities zijn, en dus een aparte service vereisen. Bovendien maken we de microservices liefst zo klein, dat er vaak data van meerdere microservices afkomstig, nodig zal zijn om bepaalde queries te beantwoorden, waardoor het sowieso minder vanzelfsprekend wordt om de queries te implementeren als onderdeel van één van die microservices; ook daardoor wordt het dus logischer om ze in een aparte dienst te deployen. Dit principe noemen we <a href="https://martinfowler.com/bliki/CQRS.html">Command Query Responsability Segregation (CQRS)</a>: we scheiden de ver-antwoordelijkheid voor het behandelen van commando&#8217;s (opnemen en verwerken van data) en die voor het beantwoorden van queries (teruggeven van, meestal verwerkte, data) in aparte services.</p>



<p class="justify-text"><strong>4.  Sagas</strong>. Soms is het nodig dat in een applicatie zaken gebeuren die ofwel gezamenlijk slagen, ofwel gezamenlijk falen. Dit noemt men een transactie. Zoals reeds in een <a href="/eventual-consistency-1/" data-type="post" data-id="15544">eerdere blog</a> vermeld, is het nuttig om transacties binnen onze systemen te minimaliseren en goed na te denken op business niveau of ze echt wel nodig zijn. Desalniettemin zullen we ze toch niet geheel kunnen vermijden. Binnen één microservice is de implementatie hiervan doorgaans geen probleem: de onderliggende database zal dit ondersteunen volgens het tweefasig &#8220;commit&#8221; protocol (2 Phase Commit, 2PC). Wat we echter absoluut moeten vermijden, is om dit protocol toe te passen op meerdere services tegelijk <a href="/high-availability-wc-papier/" data-type="post" data-id="1368">in een gedistribueerde omgeving</a>. Om dan toch tegemoet te komen aan de nood aan gedistribueerde transacties, kunnen we sagas gebruiken. Een saga bestaat uit een reeks lokale transacties (binnen één service), waarbij elke service een event zal publiceren om de volgende transactie binnen de saga te triggeren in de volgende service die eraan meedoet. Indien één van de lokale transacties faalt, dan zal het verstuurde event verschillen van wat het normaal is, en dan volgen compenserende transacties in de services die reeds aan beurt kwamen, om de eerdere veranderingen terug ongedaan te maken. Men kan sagas op 2 manieren implementeren: de eerste is een <em>choreografie</em>, waarbij de services zelf weten wat ze wanneer moeten doen (op basis van de events die ze binnenkrijgen). De tweede optie is de <em>orchestratie</em>, waarbij één service zal optreden als de organisator van het gebeuren en de transactie stap voor stap opvolgt. De communicatie met participerende services kan hier ook met events plaatsvinden, maar eventueel ook via rechtstreekse API calls om de opeenvolgende opdrachten te geven (de antwoorden komen dan wel best via events terug binnen in de orchestrator, anders zondigt men tegen CQRS). Een voorbeeld van een saga (met choreografie) is het verhaal van de webshop in de <a href="/event-driven-apis/" data-type="post" data-id="16655">vorige blog over Event-Driven APIs</a>.</p>



<p class="justify-text">Naast deze 4 principes zijn er nog een aantal secundaire ondersteunende zaken die we mogelijk kunnen doen binnen ons ecosysteem. Denk bijvoorbeeld aan het gebruik van <a href="/geavanceerd-event-driven-engineering/" data-type="post" data-id="9041">Event Sourcing</a>, of het inzetten van <a href="/newsql-getest-en-goedgekeurd/" data-type="post" data-id="13705">NewSQL databases</a> om een microservice met toestand goed te kunnen schalen. Deze zaken bespraken we reeds voldoende in vorige blogposts.</p>



<h2 class="wp-block-heading" id="besluit-even-wennen">Besluit: even Wennen</h2>



<p class="justify-text">Een moderne architectuur voor een complex Applicatie Ecosysteem bestaat uit meer dan alleen maar APIs, en kan best stevig gebruik maken van de toegevoegde waarde die EDA en CQRS bieden. Wanneer men eerder traditionele architecturen gewend is, is de verhoogde complexiteit natuurlijk even wennen. De voordelen overwegen volgens ons echter op de nadelen van deze leercurve. Eens men deze zaken in de vingers heeft en een aantal keer heeft toegepast, zal men zowel op technisch vlak als op business vlak de pluspunten beginnen ondervinden.</p>



<p class="justify-text">Om het allemaal een beetje behapbaarder te maken, zullen we in een volgende blog trachten deze principes verder te illustreren aan de hand van een voorbeeld applicatie ecosysteem.</p>





<p></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Serverless Architecture: Is Software nu Lego?</title>
		<link>https://www.smalsresearch.be/serverless-architecture-is-software-nu-lego/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 17 Dec 2019 08:23:22 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[EDE]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[FaaS]]></category>
		<category><![CDATA[FPaaS]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=13933</guid>

					<description><![CDATA[Serverless: de ideale link tussen APIs, Events, en je eigen code. Serverless Computing is een Cloud Computing model waarbij de gebruikers enkel code en een stuk configuratie aanleveren voor een beoogde software, en de cloud provider de volledige verantwoordelijkheid in handen neemt voor het beheer van de onderliggende resources (rekenkracht, geheugen, netwerk, etc.). De gebruikers [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/12/mijn-logo.png" alt="" class="wp-image-13973" width="133" height="133" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/12/mijn-logo.png 685w, https://www.smalsresearch.be/wp-content/uploads/2019/12/mijn-logo-150x150.png 150w, https://www.smalsresearch.be/wp-content/uploads/2019/12/mijn-logo-300x300.png 300w" sizes="auto, (max-width: 133px) 100vw, 133px" /></figure></div>



<p class="has-text-align-center"><em>Serverless: de ideale link tussen APIs, Events, en je eigen code.</em></p>



<p class="justify-text">Serverless Computing is een Cloud Computing model waarbij de gebruikers enkel code en een stuk configuratie aanleveren voor een beoogde software, en de cloud provider de volledige verantwoordelijkheid in handen neemt voor het beheer van de onderliggende resources (rekenkracht, geheugen, netwerk, etc.). De gebruikers zijn normaal gezien software ontwikkelaars, en het concept valt dan ook onder de noemer &#8220;<a href="/productiviteitsverhoging-met-paas/">Platform as a Service</a>&#8221; (PaaS). Bij Gartner wordt deze technologie ook <a href="https://blogs.gartner.com/tony-iams/containers-serverless-computing-pave-way-cloud-native-infrastructure/">Functional Platform as a Service</a> (FPaaS) genoemd. Elders gebruikt men kortweg de term &#8220;<a href="https://en.wikipedia.org/wiki/Function_as_a_service">Function as a Service</a>” (FaaS).</p>



<span id="more-13933"></span>



<p class="justify-text">Serverless gaat dus nog een stuk verder dan wat momenteel als &#8220;mainstream&#8221; PaaS-gebruik kan worden beschouwd: <a href="/disruptie-in-de-cloud-stack-caas/">Container platformen en Kubernetes</a>. Bij deze laatste is de developer zelf nog verantwoordelijk voor een deel van de &#8220;<a href="/architecturale-evoluties-deel-2/">stack</a>&#8221; en bepaalt daarmee zelf voor een groot deel op welke manier de software binnen de container zal werken, en daarmee dus ook over de manier waarop de gecompileerde programmacode wordt geïnstalleerd en uitgerold. Bij Serverless zal men enkel broncode (en een stuk tekstuele configuratie) uploaden naar het platform. De configuratie bepaalt daarbij op welke manier het stuk code kan worden opgeroepen (daarover dadelijk meer). Ook de <a href="/services-in-alle-maten-van-macro-naar-nano/">granulariteit</a> van Serverless is typisch kleiner dan die van Containers: meestal wordt er slechts één specifieke functie per Serverless eenheid geïmplementeerd, tegenover typisch een volledige <a href="/van-n-tier-naar-microservices/">microservice</a> (of groter&#8230;) bij Containers.</p>



<div class="wp-block-image justify-text"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/12/lambda.png" alt="" class="wp-image-13958" width="82" height="82"/><figcaption>AWS Lambda</figcaption></figure></div>



<p class="justify-text">Serverless Architecture verwierf bekendheid dankzij het product &#8220;<a href="https://aws.amazon.com/lambda/">AWS Lambda</a>&#8221; van Amazon. Dit is momenteel nog steeds het platform waarrond het meest furore wordt gemaakt, mede dankzij een verregaande integratie met de rest van de AWS platformen. Je kan b.v. erg interessante zaken doen rond <a href="https://www.cloudforecast.io/blog/event-driven-pipeline-aws-serverless/">event-based monitoring</a>.  Naast Amazon hebben alle grotere Cloud providers nu wel een Serverless oplossing, en er zijn ook reeds enkele open source initiatieven ontstaan (b.v. <a href="https://kubeless.io/">Kubeless</a>, een platform dat bovenop een Kubernetes cluster werkt), waarmee je op je eigen infrastructuur een FPaaS kan gaan opzetten.</p>



<h2 class="wp-block-heading">Serverless = Event Driven</h2>



<p class="justify-text">Men kan dus als het ware functies in een Cloud uitrollen, maar hoe worden deze dan uiteindelijk opgeroepen? Daar komt de configuratie bij te pas. Zo&#8217;n functie zal men namelijk typisch oproepen als gevolg van één of andere gebeurtenis, en dit zal men dan definiëren in de bijhorende configuratie. Indien het een functie is die een website ondersteunt kan dit b.v. een <a href="/data-centric-it-met-rest/">oproep naar een bepaalde API zijn</a>, waar de functie dan een stukje van implementeert. Maar in principe kan men de functie laten reageren op alle mogelijke soorten gebeurtenissen, zolang men deze gebeurtenissen kan capteren via het gebruikte Cloud platform. Voorbeelden zijn legio:</p>



<ul class="wp-block-list"><li>Business Events (b.v. een bestelling wordt geplaatst)</li><li>Events gepubliceerd door andere software (mogelijks andere Serverless functies)</li><li>Het binnenkomen van nieuwe data (b.v. door het monitoren van een database of door het volgen van een zogenaamde &#8220;stream&#8221;, dus eigenlijk een vorm van &#8220;<a href="https://en.wikipedia.org/wiki/Reactive_programming">Reactive Programming</a>&#8220;).</li><li>Het verstrijken van een bepaalde hoeveelheid tijd (dit komt neer op scheduling)</li><li>Het binnenkomen van sensor data (denk aan <a href="/er-zit-een-hacker-in-mijn-diepvries/">Internet of Things</a>)</li></ul>



<p class="justify-text">De mogelijkheden zijn in principe eindeloos. Men kan dus eigenlijk stellen dat Serverless Architecture een vorm is van <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Driven Architecture</a>, waarbij van het infrastructuur aspect abstractie wordt gemaakt. Over <a href="/geavanceerd-event-driven-engineering/">Event Driven Engineering</a> hebben we reeds uitvoerig <a href="/de-vortex-van-enablers/">geblogd</a>.</p>



<h2 class="wp-block-heading">Voor- en Nadelen</h2>



<p>Serverless is een nuttige technologie aan het worden, met duidelijke voordelen. Er moet echter nog een beetje gezocht worden naar oplossingen voor enkele problemen&#8230;</p>



<h3 class="wp-block-heading">Pay Per Use</h3>



<p class="justify-text">In de meeste platformen zal men een Serverless functie enkel uitvoeren en dit aanrekenen, wanneer ze daadwerkelijk wordt opgeroepen. Je betaalt dus enkel voor het daadwerkelijke verbruik ervan, en wanneer ze niet wordt gebruikt, betaal je niets. Dit principe noemt men &#8220;Scale to Zero&#8221;. Dit kan echter ook een nadeel zijn: als de functie echt enorm veel gebruikt wordt, zal de prijs typisch nogal oplopen en kan het interessanter worden deze op een andere manier aan te bieden (b.v. door een aantal containers die men permanent actief maakt, aan een lagere maandelijkse kost).</p>



<h3 class="wp-block-heading">Schaalbaarheid en Elasticiteit</h3>



<p class="justify-text">Deze aspecten zijn nu heel gemakkelijk. Een functie heeft typisch geen toestand, en vermits de developer enkel rekening moet houden met de code voor één uitvoering, is het de Cloud provider die instaat voor het verzorgen van parallellisatie en alle andere aspecten die bij een verhoogde schaal komen kijken. Men krijgt dus als het ware een zeer flexibele schaalbaarheid cadeau (en in het geval van een publieke Cloud Provider ook een quasi oneindige). Daartegenover staat weliswaar dat de performantie bij een laag gebruik iets slechter kan zijn, vermits een serverless functie normaal gezien pas wordt geïnitialiseerd (en resources krijgt) op het moment dat ze wordt opgeroepen.</p>



<h3 class="wp-block-heading">Veiligheid</h3>



<p class="justify-text">Ook het veiligheidsaspect is een tweesnijdend zwaard: alhoewel men zich minder zorgen moet maken over de veiligheid van onderliggende infrastructuur (de Cloud Provider doet dit normaal gezien volgens de state of the art), vergroot men op een andere manier de zogenaamde &#8220;attack surface&#8221;. Typisch zal men voor een volledige oplossing heel veel kleine functies nodig hebben, en het aantal toegangswegen tot de applicatiecode is op die manier groter.</p>



<h3 class="wp-block-heading">Eenvoudige Ontwikkeling, Complex Beheer</h3>



<p class="justify-text">De productiviteit van de ontwikkelaars zal waarschijnlijk een stuk hoger zijn, gezien ze enkel rekening moeten houden met functionaliteit en code, en veel minder belang moeten hechten aan onderliggende infrastructuur. Daartegenover staat een verhoogde vendor lock-in: een stuk van de code en de configuratie zal typisch gebruik maken van vendor-specifieke functies, die men bij een andere provider niet zal terugvinden.</p>



<p class="justify-text">Daarnaast is er een groot nadeel verbonden aan het bouwen van een groot web van interopererende functies: de complexiteit van dit gedistribueerde geheel. <em>Er ontstaat als het ware een doos vol kleine &#8220;legoblokjes&#8221; van allerlei functies</em>, die men dan wel nog met een goed plan tot een mooi geheel in elkaar zal moeten puzzelen. In principe is dit niet nieuw: zelfs binnen monolithische applicaties moet men aandacht besteden aan allerlei componenten en stukken code die onderling afhankelijk zijn, omdat ze elkaar oproepen of dezelfde resources gebruiken. Maar doordat deze complexiteit nu verschuift naar de configuratie en het platform, en ze typisch overheen een netwerk zal reiken, wordt het een probleem van beheersbaarheid en routering, eerder dan van code kwaliteit. Men zal nog goede manieren moeten vinden om dit soort zaken beter te gaan ondersteunen, misschien zelfs door encapsulatie, zoals dit reeds vrij goed op punt staat voor het eigenlijke programmeerwerk.</p>



<h2 class="wp-block-heading">Conclusie</h2>



<p class="justify-text">Serverless Architecture is een snel maturerende technologie met duidelijke voordelen. De FaaS platformen maken zeker deel uit van wat de aantrekkingskracht van de Cloud groter maakt. Ze moeten zich echter nog iets grondiger gaan bewijzen: nu komt het er op aan om de laatste nadelen, zoals de beheersbaarheid, nog op punt te stellen en om de meest nuttige toepassingen voor deze architectuur te vinden en te bouwen.</p>



<p>

_________________________</p>



<p><em>Dit is een ingezonden bijdrage van Koen Vanderkimpen, IT consultant bij Smals Research. &nbsp;Dit artikel werd geschreven in eigen naam en neemt geen standpunt in namens Smals.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Hergebruik: Enkele Do&#8217;s en Don&#8217;ts&#8230;</title>
		<link>https://www.smalsresearch.be/hergebruik-de-dos-en-donts/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 09 Apr 2019 09:45:52 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[reuse]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=13002</guid>

					<description><![CDATA[Hergebruik: het gebruiken van een bestaand stuk software voor een nieuwe toepassing. Het lijkt een eenvoudig principe, maar er komt meer bij kijken dan je zou denken. Vooral wanneer je effectief een software artefact probeert te hergebruiken, creëer je al snel problemen. In deze blog gaan we wat dieper in op dit ogenschijnlijk simpele productiviteitsprincipe. [&#8230;]]]></description>
										<content:encoded><![CDATA[
<div class="wp-block-image"><figure class="alignleft is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/04/recycle.png" alt="" class="wp-image-13048" width="139" height="139"/></figure></div>



<p style="text-align:center"><em>Hergebruik: het gebruiken van een bestaand stuk software voor een nieuwe toepassing</em>.</p>



<p class="justify-text">Het lijkt een eenvoudig principe, maar er komt meer bij kijken dan je zou denken. Vooral wanneer je effectief een software artefact probeert te hergebruiken, creëer je al snel problemen. In deze blog gaan we wat dieper in op dit ogenschijnlijk simpele productiviteitsprincipe.</p>



<span id="more-13002"></span>



<p class="justify-text">In mijn <a href="/services-in-alle-maten-van-macro-naar-nano/">blog over Microservices</a> van eind 2017 had ik het reeds kort over &#8220;re-use&#8221; als een antipatroon: dit ging vooral over hergebruik van code versus hergebruik van grotere componenten, zoals b.v. een API met een daarachterliggende microservice. Dit is een belangrijk voorbeeld van een breder principe: men moet goed weten op welk niveau van modulariteit men hergebruik wenst toe te passen.</p>



<p class="justify-text">Verderop in deze blog gaan we dieper in op drie assen volgens welke we afwegingen zullen moeten maken om te besluiten in welke mate we hergebruik zullen nastreven en toepassen: Het niveau van granulariteit, het niveau van abstractie, en het niveau van functionaliteit.</p>



<p class="justify-text">Daarnaast is het ook zo dat hergebruik maar kan op 2 voorwaarden: </p>



<ul class="justify-text wp-block-list"><li>Er bestaat een dienst, module, bibliotheek, &#8230; kortweg, een <em>software artefact</em>, dat herbruikbaar is.</li><li>We gebruiken een methodologie van software ontwikkeling die ons toelaat zaken te hergebruiken. Dit wil zeggen dat we enerzijds in staat zijn om de herbruikbare component te vinden en dat we er toegang toe hebben (en dat deze voldoende is gedocumenteerd), en we anderzijds een architectuur toepassen in de doeltoepassing die toelaat het bestaande artefact ook daadwerkelijk in te zetten.</li></ul>



<p class="justify-text">In deze blog zullen we ons focussen op principes rond het bouwen van herbruikbare artefacten, en dus niet op het tweede aspect: het beheren en gebruiken van een patrimonium van herbruikbare software componenten. Verder gaan we ook niet dieper in op zaken die gerelateerd zijn aan hergebruik, zoals bv. het gebruiken van een gedeelde infrastructuur of het vinden van allerlei synergieën op ándere vlakken.</p>



<h2 class="wp-block-heading">Spanningsvelden bij het Beschouwen van Hergebruik</h2>



<p class="justify-text">Zoals reeds aangehaald, zal mogelijk hergebruik van een software artefact afhangen van een aantal verschillende factoren. Telkens zal er een zeker spanningsveld heersen en zal er een middenweg moeten worden gevonden, die van project tot project of van artefact tot artefact kan verschillen.</p>



<h3 class="wp-block-heading">Niveau van Granulariteit</h3>



<p class="justify-text">De grootte van het software artefact dat we willen hergebruiken, heeft een grote invloed op de mogelijke impact van het hergebruik: het is uiteraard voordeliger als we ineens een volledige, kant-en-klare service kunnen hergebruiken, die duizenden lijnen code encapsuleert, dan wanneer we enkel en alleen, op het niveau van de code, een bepaalde functie van een paar regels code kunnen hergebruiken. Nochtans hebben ze elk hun eigen kracht. Alle artefacten die we gebruiken moeten worden onderhouden; doorgaans is de kost die hiermee gepaard gaat evenredig met de grootte. Daarnaast is het zo, dat men een kleiner bouwblok, indien goed gekozen, vaker zal kunnen hergebruiken dan een groter.  <br>Het spreekt voor zich dat, hoe meer zaken men in één component verpakt, op hoe meer manieren deze component kan hergebruikt worden, maar tegelijk hoe omslachtiger het wordt om dit ook effectief te doen, omdat je teveel bagage meesleept. Beter is het om componenten zo klein mogelijk te houden, zodat ze één functionaliteit aanbieden, en deze kleine componenten dan op zoveel mogelijk plaatsen te gaan inzetten. Hier is echter weeral een spanningsveld: hoe meer componenten er bestaan, des te moeilijker wordt het om te <em>weten</em> dat ze bestaan (en om ze terug te vinden, dus). Kleine componenten bieden daarnaast echter nog vele andere voordelen (bv. microservices en agility, zoals beschreven in de blog <a href="/van-n-tier-naar-microservices/">daaromtrent</a>).</p>



<p class="justify-text">Maar ook de context van het hergebruik speelt een rol bij overwegingen betreffende de grootte van de component: de functie van een paar regels code: zullen we deze enkel hergebruiken binnen eenzelfde project? Of als deel van een bibliotheek of raamwerk dat nog door vele andere projecten kan worden gebruikt? Hier zat de essentie van het verhaal bij microservices: men moet goed waken over de onfhankelijkheid van deze <a href="/architecturale-evoluties-deel-1/">wonderen van de moderne architectuur</a>: wanneer twee microservices gebruik maken van eenzelfde stuk code, heeft men in principe een afhankelijkheid gecreëerd tussen de beide.</p>



<h3 class="wp-block-heading">Mate van Abstractie</h3>



<p class="justify-text">De mate van abstractie van software kan sterk variëren. Men kan een stuk software bouwen, nauwelijks parametriseerbaar, specifiek voor één welbepaalde taak. Dit zal nauwelijks herbruikbaar zijn. Maar indien men te ver probeert te gaan in de mate van abstractie die een stuk software aanbiedt, krijgt men uiteindelijk iets dat onbruikbaar is voor het oorspronkelijk doeleinde, omdat het zo generisch is, dat er nog heel veel werk bij komt kijken om het als dusdanig te parametriseren aan het doel waarvoor het werd ontworpen. Bovendien is software met een hoge mate van abstractie vaak ook moeilijker te begrijpen voor ontwikkelaars. Hier komt het er dus op neer een gouden middenweg te vinden: voldoende abstractie, zodat er binnen het business domein, en zoniet op een technisch vlak, nog enige kans bestaat op later hergebruik, maar niet teveel, zodat het artefact nog voldoende snel en eenvoudig inzetbaar is voor het oorspronkelijke doel. Daar komt dan wel nog een tweede spanningsveld roet in het eten gooien: dat van <em>kost versus mate van abstractie</em>. Een stuk software op een meer generische manier ontwerpen, vraagt doorgaans meer resources en een langere ontwikkeltijd dan om iets te bouwen voor één welbepaald doel. Men kan dus niet tegelijkertijd van een team van ontwikkelaars verwachten om zoveel mogelijk kostenbesparend te werken en enorm veel functionaliteit op te leveren tegen strakke deadlines, en tegelijkertijd geweldig herbruikbare (en onderhoudbare, robuuste, stabiele, &#8230; ) producten af te leveren.</p>



<h3 class="wp-block-heading">Hoogte in de functionele stack</h3>



<div class="wp-block-image justify-text"><figure class="alignright is-resized"><img loading="lazy" decoding="async" src="/wp-content/uploads/2019/04/functional-stack.png" alt="" class="wp-image-13062" width="301" height="454" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/04/functional-stack.png 454w, https://www.smalsresearch.be/wp-content/uploads/2019/04/functional-stack-199x300.png 199w" sizes="auto, (max-width: 301px) 100vw, 301px" /><figcaption>In grote lijnen de &#8220;Functionele Stack&#8221;: hoger liggende componenten maken hier typisch enkel gebruik van lager liggende zaken. Hoe lager iets ligt, des te vaker het kandidaat is voor hergebruik.</figcaption></figure></div>



<p class="justify-text">Een afgewerkte software, gebouwd voor een specifiek doel, met een eigen UI, is ongeveer wat als het hoogste in de &#8220;functionele stack&#8221; beschouwd kan worden. Dit is nauwelijks herbruikbaar, want purpose-built (met een grote uitzondering voor <a href="/de-saus-op-je-saas/">SaaS-software</a>). Lager in deze stack vindt men business-domein-specifieke bibliotheken en APIs. Deze zijn, binnen een bepaalde context, al een stuk herbruikbaarder (maar niet onmiddellijk functioneel inzetbaar zonder er iets vóór of rond te bouwen). Nog lager in de stack vindt men zaken die over domeinen heen herbruikbaar zijn: database software, cloud platformen, algemene software libraries en raamwerken. De laagste elementen in de stack, daar denken we zelfs al niet meer bij na wanneer we ze hergebruiken: het gaat om constructies die in bijna alle programmeertalen voorkomen (gegevensstructuren zoals arrays, ondersteuning voor reguliere expressies, etc.).</p>



<p class="justify-text">Bedrijven die een sprong maken naar een <a href="/cloud-metaforen-elektriciteit-goud/">Cloud Platform</a>, maken typisch ook een sprong in herbruikbaarheid wat betreft het niveau in de functionele stack. Het gebruik van zaken als virtualisatie zorgt er bv. voor dat het veel sneller gaat om infrastructuur te koppelen aan een applicatie en dat deze koppeling ook bruikbaar is voor gelijkaardige applicaties (door de configuratie van zo&#8217;n machine te hergebruiken). Hogerop in de stack laat <a href="/productiviteitsverhoging-met-paas/">een platform</a> als <a href="/disruptie-in-de-cloud-stack-caas/">Kubernetes </a>en het gebruik van <a href="/de-vortex-van-enablers/">containers</a> toe dat men software images van over de hele wereld, en bovendien ook de eigen images, kan hergebruiken.</p>



<h2 class="wp-block-heading">Wat kan ons Helpen?</h2>



<p class="justify-text">Kunnen we nu doorheen de anaylse van deze verschillende dimensies van hergebruik een rode draad trekken? Op welke manier zullen we het vaakst &#8220;de gulden middenweg&#8221; kunnen exploiteren? Hier speelt de gebruikte methodologie van software ontwikkeling een rol, en zeker ook de architectuur van zowel het mogelijks herbruikbare artefact en van de doeltoepassing. <a href="/architecturale-evoluties-deel-1/">Moderne architecturale principes</a> hebben hier vrijwel altijd een streepje voor, en de software industrie blijft hierin innoveren. Modulariteit is één van de sterkste drijvende krachten (ik verwijs opnieuw naar microservices, en nu misschien ook al naar <a href="/architecturale-evoluties-deel-2/">FPaaS</a>).</p>



<h3 class="wp-block-heading">Over MicroServices en APIs</h3>



<p class="justify-text">Ik heb nu reeds tweemaal modulariteit en microservices aangehaald, maar daar moet wel een serieuze kanttekening bij worden gemaakt.</p>



<p style="text-align:center"><em>Microservices zijn OP ZICH NIET herbruikbaar</em>. <em>Het zijn de </em><strong><em>API</em></strong><em>s die men rond </em><strong><em>diensten</em></strong><em> bouwt, die herbruikbaar zijn door andere zaken.</em></p>



<p class="justify-text">Van cruciaal belang is dus het ontwerp van deze APIs, rigoureus volgens standaarden (<a href="/data-centric-it-met-rest/">REST</a>) die nog eens zijn versterkt door een weldoordachte huisstijl (of beter nog, &#8220;sector-stijl&#8221;). Daarnaast moet men bij het ontwerpen van deze APIs goed rekening houden met de hierboven beschreven mate van abstractie en hoogte in de functionele stack. Bovendien moeten de APIs ook bekend zijn, en toegankelijk zijn. Het laatste vergt goed API management en sterke documentatie (en &#8220;kruisbestuifmensen&#8221; die kunnen fungeren als katalysatoren, overheen projecten), en ook een vlot proces van het ter beschikking stellen van APIs. Bij dit laatste spelen zaken zoals GDPR uiteraard een rol, maar spijtig genoeg ook af en toe politieke redenen (men wil soms te hard zijn &#8220;eigenaarschap&#8221; over bepaalde diensten of data behouden, en men belemmert om deze reden het hergebruik; of nog vindt men van zijn eigen systemen dat deze &#8220;te uniek&#8221; zouden zijn om in een hergebruik-kader te functioneren). Ten slotte is het ook van belang dat de systemen die schuilgaan achter de APIs, voldoende schaalbaar zijn, zodat ze bij toenemend gebruik nog kunnen volgen.</p>



<div class="wp-block-image justify-text"><figure class="alignleft"><img loading="lazy" decoding="async" width="381" height="273" src="/wp-content/uploads/2019/04/API.png" alt="" class="wp-image-13073" srcset="https://www.smalsresearch.be/wp-content/uploads/2019/04/API.png 381w, https://www.smalsresearch.be/wp-content/uploads/2019/04/API-300x215.png 300w" sizes="auto, (max-width: 381px) 100vw, 381px" /><figcaption>APIs: de herbruikbare interface waar zoveel zaken achter kunnen liggen. Hergebruik van werkende systemen dient zoveel mogelijk via RESTful APIs te gebeuren.<br></figcaption></figure></div>



<p class="justify-text">Wanneer we over APIs spreken, spreken we hier dus over het hergebruik van (werkende) diensten. Dit is de belangrijkste vorm wat betreft zelfgemaakte software artefacten. <em>Het hergebruik van (eigen) code is iets totaal anders</em>. Dit kan zelfs contraproductief zijn: één van de krachtigste eigenschappen van microservices binnen een moderne architectuur, is hun onderlinge onafhankelijkheid: een microservice moet volledig op eigen benen kunnen staan (eigen werking, eigen logica, eigen data(-base), eigen (deeltje van de) infrastructuur, … De enige connectie met de buitenwereld is via Events (zie verder) en een API&nbsp;! ). Daarnaast maakt men ze zo klein mogelijk. Dit maakt ze enorm flexibel (&#8220;agile&#8221;): men kan ze apart van andere zaken onderhouden, aanpassen, vervangen (vandaar ook dat ze klein moeten zijn, &#8220;rip-and-replace&#8221; mag niet teveel kosten). Deze flexibiliteit maakt het mogelijk voor een softwarebedrijf om enorm snel op veranderende behoeften van de business in te spelen, doordat het geheel aan microservices continu en heel snel kan evolueren zonder volledig offline te gaan of langdurige aanpassingsprojecten en redeployments te moeten ondergaan. Welnu, vermits microserives zo onafhankelijk mogelijk van elkaar moeten zijn, kan het soms contraproductief zijn om zaken (niet alleen code maar bv. ook een bepaalde database) te gaan hergebruiken tussen meerdere microservices. Dergelijk hergebruik creëert afhankelijkheden en verplichtingen die de wendbaarheid van een microservice doen afnemen! Enkel zeer algemeen inzetbare bibliotheken (typisch 3rd party, vaak open source) vormen goede kandidaten om binnen een microservice herbruikt te worden; deze zitten typisch iets lager op de functionale stack dan het (business) domein waar de microservice rond is opgebouwd.</p>



<h3 class="wp-block-heading">Event Driven Architecture</h3>



<p class="justify-text">In deze context komen we best ook terug op <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Driven Architecture</a>. Events zijn één van de datastructuren die men het dichtst bij de werkelijkheid kan doen aanleunen. Het gaat om een opdracht of aangifte of aanvraag die binnenkomt, een gebeurtenis uit de echte wereld die men modeleert, een bepaald gegeven dat beschikbaar wordt, een verandering van een reeds gekend gegeven, … <br>Deze zaken kunnen allemaal veel letterlijker gemapt worden op de werkelijkheid, dan wanneer ze eerst reeds binnen een bepaalde context (meestal de toepassing via dewelke ze het eerst worden ingevoerd) worden verwerkt. Hoe dichter deze informatie aanleunt bij de werkelijke wereld, hoe herbruikbaarder ze is voor andere zaken. Hetzij andere toepassingen die reeds bestaan en anders moeten wachten tot de data (soms in batch) wordt doorgestuurd of kan worden opgehaald via API, hetzij toepassingen die men pas zal bedenken doordat de events al bestaan (het zogenaamde kruisbestuiven binnen een applicatie ecosysteem).</p>



<p class="justify-text">Zaak is dus van events heel goed te ontwerpen, vooral op het niveau van business events, en van deze meer en meer te gaan (her-)gebruiken. Naast mogelijk hergebruik heeft dit ook een mooie standaardisatie tot gevolg in de manier waarop applicaties (asynchroon) communiceren en data geprolifereerd wordt binnen een netwerk van toepassingen, en bovendien krijgt men de data op die manier veel sneller op alle plaatsen waar men ze nodig heeft, waardoor men op business niveau veel sneller kan reageren en flexibeler kan zijn. Goede documentatie van de events die men reeds heeft gedefiniëerd is dan uiteraard heel belangrijk. Ten slotte heeft men via events automatisch de volledige geschiedenis van de gegevens en niet alleen van de huidige toestand. Deze geschiedenis kan eveneens <strong>hergebruikt</strong> worden bij o.a. het aanpassen en testen van toepassingen, het ontwikkelen van nieuwe zaken, en <a href="/geavanceerd-event-driven-engineering/">verregaande analyse</a> (evt. ook voor het trainen van <a href="/ai-en-desinformatie/">een AI</a>)</p>



<h2 class="wp-block-heading">Besluit</h2>



<p class="justify-text">Wanneer men praat over herbruikbaarheid, is het belangrijk te verduidelijken of men het nu over code, dan wel APIs, diensten, componenten, infrastructuur of volledige software-pakketten gaat hebben. Samenvattend komt dit neer op het definiëren van de modulariteit, de mate van abstractie en de hoogte in de functionele stack van hetgeen men zou willen hergebruiken. Daarenboven moet men de afweging maken tussen de herbruikbaarheid van een artefact en de kostprijs om het te bouwen en onderhouden.</p>



<p class="justify-text">Indien men met al deze aspecten rekening houdt, kan men besluiten dat hergebruik niet altijd alleszaligmakend is en dat het soms zelfs contraproductief kan zijn. Het belangrijkste hergebruik zal zich vaak ook niet op het niveau van de code bevinden.</p>



<p class="justify-text">Wat applicatie architectuur in het algemeen betreft, maar dan nu specifiek toegepast op herbruikbaarheid, kunnen we daarnaast besluiten dat APIs (ondersteund door microservices, uitgerold op containers) en Event Driven Architecture een grote meerwaarde kunnen bieden.</p>



<p></p>



<p></p>



<h5 class="wp-block-heading">Verdere resources:</h5>



<ul class="wp-block-list"><li>Een boek over het hergebruik van software: <a href="https://vijaynarayanan.gitbooks.io/art-of-software-reuse/content/">https://vijaynarayanan.gitbooks.io/art-of-software-reuse/content/</a></li><li>Over de val van genericiteit en &#8216;super&#8217;-libraries, en de voordelen van modulariteit: <a href="https://josdejong.com/blog/2015/01/06/code-reuse/">http://josdejong.com/blog/2015/01/06/code-reuse/</a></li><li>Over de <strong>valstrikken</strong> van &#8220;code reuse&#8221; en hoe management dit echter meestal ziet: <a href="https://blog.ndepend.com/code-reuse-not-good-goal/">https://blog.ndepend.com/code-reuse-not-good-goal/</a></li><li>Over de <strong>kost</strong> van hergebruik: <a href="https://dzone.com/articles/economics-reuse">https://dzone.com/articles/economics-reuse</a></li><li>Bedenkingen bij extreme programming, een methodologie dewelke &#8220;design for reuse&#8221; eigenlijk afraadt: <a href="https://www.infoq.com/news/2009/04/agile-code-reuse">https://www.infoq.com/news/2009/04/agile-code-reuse</a></li><li>Talk van Rob Pike, met de quote &#8220;<strong><em>A little copying is better than a little dependency</em></strong>&#8221; (code reuse zorgt voor dependencies!): <a href="https://www.youtube.com/watch?v=PAAkCSZUG1c&amp;t=9m28s">https://www.youtube.com/watch?v=PAAkCSZUG1c&amp;t=9m28s</a></li><li>Martin Fowler over, o.a. , reuse: <a href="https://martinfowler.com/bliki/Seedwork.html">https://martinfowler.com/bliki/Seedwork.html</a></li><li>Methodologische tips voor hergebruik: <a href="https://www.infoq.com/articles/vijay-narayanan-software-reuse">https://www.infoq.com/articles/vijay-narayanan-software-reuse</a></li><li>Hoe reuse aanpakken op bedrijfsniveau: <a href="https://www.cs.cmu.edu/afs/cs/usr/ppinto/www/reuse.html">http://www.cs.cmu.edu/afs/cs/usr/ppinto/www/reuse.html</a></li></ul>


]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Architecturale Evoluties, deel 2</title>
		<link>https://www.smalsresearch.be/architecturale-evoluties-deel-2/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 06 Nov 2018 12:16:29 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[MASA]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11475</guid>

					<description><![CDATA[Tijd om met een aantal exotische afkortingen te beginnen schermen, zoals EDA, CQRS en MASA. De moderne architectuur is soms ingewikkelder dan de oude, maar wie ze meester is, kan profiteren van een enorme flexibiliteit. Deze blog is het tweede deel van een reeks, waarin we een aantal mogelijkheden die ons worden geboden door goede architecturale [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2018/05/architecture2.png"><img loading="lazy" decoding="async" class="alignleft wp-image-11754 size-full" src="/wp-content/uploads/2018/05/architecture2.png" alt="" width="146" height="141" /></a>Tijd om met een aantal exotische afkortingen te beginnen schermen, zoals EDA, CQRS en MASA. De moderne architectuur is soms ingewikkelder dan de oude, maar wie ze meester is, kan profiteren van een enorme flexibiliteit.</p>
<p><span id="more-11475"></span></p>
<p style="text-align: justify;">Deze blog is het tweede deel van een reeks, waarin we een aantal mogelijkheden die ons worden geboden door goede architecturale principes en technologieën, zullen toelichten. Een aantal van deze zaken werden ook reeds in vroegere blogs besproken, en de meeste worden ook nog eens samengevat in de blog &#8220;<a href="/de-vortex-van-enablers/">Vortex van Enablers</a>&#8220;. De eerste blog van deze reeks beschouwde de gedeeltes van een applicatie-architectuur die de gebruikersinterface en externe clients ondersteunen: <a href="/architecturale-evoluties-deel-1/">Architecturale Evoluties, deel 1</a>.</p>
<p style="text-align: justify;">In dit deel duiken we dieper in de applicatie, en zullen we beschouwen hoe we de interacties met onze applicatie verder kunnen afhandelen. Interacties kunnen via allerlei wegen onze applicatie binnenkomen (b.v. aanvragen vanuit een GUI, requests via een extern-gerichte API, maar ook interne, geplande acties die op bepaalde momenten worden gestart). Voor de binnenste onderdelen van de architectuur is dit onderscheid echter van minder belang. Wel belangrijk is of het gaat om een vraag om output te genereren (dit zullen we een <strong>query</strong> noemen), of dat het eerder gaat om nieuwe input (vaak een <strong>command</strong> genoemd, maar dit komt eigenlijk overeen met een <a href="/het-event-als-leidend-voorwerp-in-software-engineering/"><strong>Event</strong></a>). Soms zijn deze beide vormen gecombineerd (er is nieuwe input, die op zich al tot nieuwe output moet leiden), maar vaak is het mogelijk om deze aspecten in de verwerking van de interactie voldoende gescheiden te houden.</p>
<h1 style="text-align: justify;">De Moderne Architectuur, Deel 2</h1>
<p style="text-align: justify;">In het eerste deel van deze blogreeks beschreven we reeds hoe alle externe interactie met onze applicatie kon worden herleid tot het oproepen van Restful APIs, die we konden aanbieden via één of meerdere <a href="/van-n-tier-naar-microservices/">microservices</a>. In dit tweede deel kunnen we ons daardoor volledig focussen op de interne werking van een collectie microservices, die samen een applicatie (of een groep van applicaties) ondersteunen. Dit is een radicale breuk met de meer traditionele 3-tier of n-tier architecturen van weleer. Gartner heeft deze nieuwe trend de naam &#8220;MASA&#8221; gegeven, wat staat voor <a href="https://www.gartner.com/doc/3645328/top--strategic-technology-trends">Mesh App and Service Architecture</a>: een zeer modulair and flexibel aanpasbaar netwerk van oplossingen die de dynamisch veranderde behoeften vanuit de business snel kunnen opvangen.</p>
<p style="text-align: justify;">Eén opmerking die we voor de volledigheid nog moeten maken, is dat het in deel 1 om interactie met écht externe zaken ging, zoals de clients en 3rd party applicaties. Dit leidt er doorgaans toe dat we sterk gestandaardiseerde interactievormen via het web zullen gebruiken (waardoor vrijwel enkel REST APIs kunnen worden beschouwd). Integratie binnen het eigen ecosysteem kan echter, naast APIs, ook nog via de <strong>Event Bus</strong> gebeuren, die op zich gebouwd is bovenop het principe van asynchrone uitwisseling van berichten tussen de services. Dit duale principe (synchroon REST kanaal en asynchroon event kanaal, ook reeds toegelicht in de <a href="/data-centric-it-met-rest/">blog over Data Centric IT</a>) moet volstaan om alle communicatie tussen de verschillende onderdelen van een applicatie (of ecosysteem) in goede banen te leiden. Op zijn beurt laat deze ogenschijnlijke beperking toe om de technische kant van het verhaal te standaardiseren.</p>
<ul>
<li>
<h2>Een woordje over de MASA</h2>
</li>
</ul>
<p><figure id="attachment_12263" aria-describedby="caption-attachment-12263" style="width: 300px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/11/mesh.png"><img loading="lazy" decoding="async" class="wp-image-12263 size-medium" src="/wp-content/uploads/2018/11/mesh-300x294.png" alt="" width="300" height="294" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/11/mesh-300x294.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/11/mesh.png 693w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-12263" class="wp-caption-text">Fig. 1: Mesh App &amp; Service Architecture</figcaption></figure></p>
<p style="text-align: justify;">Zoals reeds gezegd, staat MASA voor &#8220;Mesh App &amp; Service Architecture&#8221;. Het woordje &#8220;mesh&#8221; (= een fijnmazig net) betekent dat de huidige architectuur uit vele aparte onderdelen zal bestaan, die via steeds veranderende configuraties met elkaar communiceren. Het model dat we in deze blogreeks uit de doeken doen, namelijk een ecosysteem van samenwerkende microservices, communicerend via <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event Bus</a> en RESTful APIs, is daarbij eigenlijk nog een eenvoudige versie. In de praktijk zal men evolueren naar ingewikkelder patronen, waarbij in deze mesh ook legacy toepassingen zullen verweven zitten, alsook zaken die in de <a href="/disruptie-in-de-cloud-stack-caas/">Cloud</a> draaien i.p.v. op het lokale netwerk, afzonderlijke functies die volgens het zogenaamde &#8220;<a href="https://en.wikipedia.org/wiki/Serverless_computing">Serverless</a>&#8221; principe werken, en zelfs <a href="/er-zit-een-hacker-in-mijn-diepvries/">IoT</a> devices. Dit soort gemengde architectuur ontstaat doordat vele organisaties nu eenmaal legacy toepassingen draaiende moeten houden, en doordat er een grote heterogeniteit aan projecten te volbrengen is, hetgeen er voor zorgt dat er vaak ook verschillende keuzes gemaakt worden wat betreft de onderliggende platformen. In zo&#8217;n geval is het echter ook belangrijk (of zelfs nog belangrijker) dat men tracht de communicatiepatronen tussen al deze verschillende zaken te standaardiseren, om aldus de compatibiliteit en integreerbaarheid te maximaliseren.</p>
<ul>
<li>
<h2>De Duale Service Interface: CQRS</h2>
</li>
</ul>
<p style="text-align: justify;">In de introductie vermeldden we reeds het onderscheid tussen commando&#8217;s en queries. <a href="https://martinfowler.com/bliki/CQRS.html">CQRS</a> staat voor <a href="https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs">Command Query Responsability Segregation</a>, wat zoveel betekent als &#8220;scheiding van de verantwoordelijkheid voor het afhandelen van commando&#8217;s en queries&#8221;. In de praktijk wil dat zeggen dat we zullen proberen om een logische scheiding te krijgen tussen de systemen die commando&#8217;s verwerken en tussen degene die vragen beatwoorden. Dit is schematisch weergegeven in onderstaande Fig. 2.</p>
<p><figure id="attachment_12196" aria-describedby="caption-attachment-12196" style="width: 688px" class="wp-caption alignnone"><a href="/wp-content/uploads/2018/09/highlevelbackend.png"><img loading="lazy" decoding="async" class="wp-image-12196 size-large" src="/wp-content/uploads/2018/09/highlevelbackend-1024x372.png" alt="" width="688" height="250" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-1024x372.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-300x109.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend-768x279.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/09/highlevelbackend.png 1081w" sizes="auto, (max-width: 688px) 100vw, 688px" /></a><figcaption id="caption-attachment-12196" class="wp-caption-text">Fig. 2: Schematisch overzicht van de backend systemen: aanvragen worden opgesplitst in queries en commands, die elk hun eigen pad vervolgen richting een groep backend (micro-)services. Deze zullen informatie in de vorm van inkomende events verwerken tot hapklare zaken die later door queries kunnen worden opgevraagd.</figcaption></figure></p>
<p style="text-align: justify;">Queries kunnen doorgaans rechtstreeks door een API worden beantwoord, al dan niet door de vraag, mogelijks in stukjes gekapt, aan een verdere API door te geven. Uiteindelijk zullen het de onderliggende (micro-)services zijn die het echte werk doen van opzoeken in databases en eventueel nog een paar bewerkingen uitvoeren om het antwoord in de gevraagde vorm te krijgen. Wat betreft de interactie tussen verschillende services, hoeft hier dus niet te worden afgeweken van RESTful synchrone communicatie.</p>
<p style="text-align: justify;">Het ligt iets anders voor commando&#8217;s. Wanneer we volledig het paradigma van <a href="/geavanceerd-event-driven-engineering/">Event Sourcing</a> toepassen, zullen we een commando steeds omzetten in een gebeurtenis (b.v. het commando &#8220;<em>bestel één <a href="/blockchain-vs-event-driven-architecture/">blockchain</a> boek</em>&#8221; wordt dan het <span style="text-decoration: underline;">event</span> &#8220;<em>bestelling van één <a href="https://www.larciergroup.com/nl/blockchain-en-smart-contracts-2018-9782807909380.html">blockchain boek</a> geplaatst</em>&#8220;). Deze omzetting zal door een eerste laag van services worden gedaan, speciaal gebouwd voor het opvangen van dergelijke commando&#8217;s vanuit de client side.</p>
<p style="text-align: justify;">Het commando kan dan verder worden afgehandeld als een typisch event: het komt op de Event Bus terecht en alle geïnteresseerde diensten zullen het asynchroon ontvangen en kunnen behandelen (één backend service zal b.v. de inventory aanpassen; een andere zet het verpakken op gang en nog een andere verwittigt de koerierdienst). In elk geval is het creëren van afgeleide informatie (b.v. de hoeveelheid in stock) een verantwoordelijkheid van een microservice die daarvoor zijn eigen database zal hebben.</p>
<p style="text-align: justify;">Wanneer nu later een vraag toekomt die betrekking heeft op informatie beïnvloed door een eerder commando, dan zal deze geforward worden naar de microservices die deze up-to-date informatie controleren (b.v. de vraag &#8220;<em>hoeveel van die blockchain boeken zijn er nog in voorraad</em>&#8221; komt uiteindeljik terecht bij de service voor de inventory). Vermits events asynchroon werken kan het soms zijn dat een vraag nét te snel komt en de informatie dus niet volledig up-to-date is (meestal is het echter een kwestie van enkele seconden). Vandaar dat het bij dit soort architecturen aangewezen is de principes van &#8220;<a href="https://en.wikipedia.org/wiki/Eventual_consistency">eventual consistency</a>&#8221; goed toe te passen, en zelfs door te trekken tot op business niveau.</p>
<p><figure id="attachment_12198" aria-describedby="caption-attachment-12198" style="width: 1050px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2018/09/complexexample.png"><img loading="lazy" decoding="async" class="size-full wp-image-12198" src="/wp-content/uploads/2018/09/complexexample.png" alt="" width="1050" height="543" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample.png 1050w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-300x155.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-768x397.png 768w, https://www.smalsresearch.be/wp-content/uploads/2018/09/complexexample-1024x530.png 1024w" sizes="auto, (max-width: 1050px) 100vw, 1050px" /></a><figcaption id="caption-attachment-12198" class="wp-caption-text">Fig. 3: Een iets gedetailleerder voorbeeld. Voor de uitleg verwijzen we naar de tekst.</figcaption></figure></p>
<p style="text-align: justify;">Bovenstaande Figuur 3 toont een iets gedetailleerder voorbeeld. In de figuur zien we dat er achter de App API, 2 Command APIs en 1 Query API schuilgaan. Daarnaast zien we een door meerdere zaken gebruikte Event Bus, waarvan alle events ook in een centrale event store terecht komen. Sommige backend microservices communiceren rechtsreeks met de bus en spelen dus kort op de bal; daarnaast is er een service die vooral gebruik maakt van de event store en die dus meer zaken kan doen met historische events (b.v. <a href="/big-data-analytics-whats-in-a-name/">analytics</a>). Verder zien we dat er een legacy systeem communiceert via het event kanaal en dat een aantal services APIs aanbieden, sommige zelfs rechstreeks aan externe systemen. Er is een kort scenario uitgewerkt in de tekening:</p>
<ol>
<li style="text-align: justify;">Een update wordt gevraagd, wat zich vertaalt in een reeks van events die door een aantal services verwerkt worden. Het event komt uiteraard in de event store terecht.</li>
<li style="text-align: justify;">Een andere update zorgt er uiteindelijk voor dat er events ontstaan die aanpassingen doen gebeuren aan een database van afgeleide informatie, behorende tot een bepaalde microservice.</li>
<li style="text-align: justify;">Een query vraagt informatie op via API, en uiteindelijk wordt een API van de microservice van stap 2 aangeroepen; deze zal dus van de geüpdate informatie uit de database van stap 2 gebruik maken.</li>
<li style="text-align: justify;">Een andere query doet een iets diepgaandere vraag. Via verschillende calls tussen deelnemende services, wordt er uiteindelijk informatie opgevraagd uit de event store.</li>
</ol>
<p><figure id="attachment_12194" aria-describedby="caption-attachment-12194" style="width: 206px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/09/GoodClientUpdate.png"><img loading="lazy" decoding="async" class="wp-image-12194" src="/wp-content/uploads/2018/09/GoodClientUpdate-171x300.png" alt="" width="206" height="362" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/09/GoodClientUpdate-171x300.png 171w, https://www.smalsresearch.be/wp-content/uploads/2018/09/GoodClientUpdate.png 486w" sizes="auto, (max-width: 206px) 100vw, 206px" /></a><figcaption id="caption-attachment-12194" class="wp-caption-text">Fig. 4: Een goed gebouwde client van het systeem kan worden geüpdated bij binnenkomende events aan de serverkant.</figcaption></figure></p>
<p style="text-align: justify;">Dit verhaal is, vanwege het gebruik van Events, voor een deel asynchroon. Sommige cliënts zullen echter zo synchroon mogelijk moeten worden geüpdated. Hoe kunnen zij vlot op de hoogte worden gebracht van de meest recente informatie? Ter herinnering: in een volledig synchrone wereld zal een cliënt als antwoord op een commando ook onmiddellijk de nieuwe toestand meekrijgen. Met de nieuwe architectuur moet de cliënt echter &#8220;gissen&#8221; na hoeveel tijd hij een query naar de server moet sturen, om er zeker van te zijn dat het effect van zijn laatste commando in rekening is gebracht. Dit giswerk kan men echter vermijden. Sowieso is het niet zo efficiënt om ervan uit te gaan dat het altijd de cliënt is die alle communicatie moet initiëren. We zullen er dus voor zorgen dat ook de server dit initiatief kan nemen. Als gevolg van een binnenkomend Event moet ook de server in staat zijn om op dat moment een bericht te sturen naar de client. Er zijn ondertussen verschillende manieren waarop een cliënt aan een server zijn interesse kan laten blijken in het krijgen van callbacks wanneer up-to-date informatie beschikbaar is, en er zijn zelfs al full-duplex communicatiemogelijkheden voor applicaties op het web. (<a href="https://en.wikipedia.org/wiki/WebSocket">WebSocket</a> is een vrij modern voorbeeld).</p>
<p style="text-align: justify;">Indien het niet mogelijk is de client op een manier te bouwen dat deze door de server kan worden gecontacteerd, en het is evenwel belangrijk dat de client zo snel mogelijk up-to-date informatie krijgt, dan is er nog een noodoplossing mogelijk. We kunnen alsnog een API voorzien die toelaat dat men via één enkele request zowel een update doet als de nieuwe informatie meekrijgt in het antwoord. Desalniettemin zullen we het CQRS patroon voor het grootste gedeelte respecteren in de backend. Het volstaat om de API zo te bouwen, dat hij de request zelf opdeelt in een commando en één of meerdere queries. De microservice die achter deze API schuilgaat, zal dan eerst het event lanceren om het commando uit te laten voeren, en zal vervolgens wachten tot er genotificeerd komt via de juiste events, die de afhandeling van dit commando aangeven. Daarna kan de service overgaan tot het lanceren van de queries en dan vervolgens zelf antwoorden op de vraag van de client. Dit patroon zorgt er wel voor dat soms de client wat langer (synchroon) zal moeten wachten op zijn antwoord, omdat het asynchrone gedeelte volledig aan de serverkant moet worden afgehandeld.</p>
<h2>Conclusie</h2>
<p style="text-align: justify;">We zien hoe een moderne architectuur ervoor zorgt dat men een applicatie (of groep applicaties) kan opdelen in zo klein mogelijke microservices, elk met hun eigen verantwoordelijkheid. Deze zijn efficient te onderhouden en ook vervangbaar, wat het gehele systeem een ongeziene flexibiliteit geeft om zich aan te kunnen passen aan zowel veranderende functionaliteit als aan veranderingen aan de infrastructuur of de benodigde capaciteit. Daarnaast hebben we een gestandaardiseerde manier van communiceren toegelicht, die ervoor zorgt dat de mesh van apps, de &#8220;MASA&#8221;, continu kan veranderen en groeien, doordat men alle onderdelen gemakkelijk via het netwerk met elkaar kan laten communiceren. Ten slotte konden we ook zien hoe CQRS hiervan gebruik maakt om een nette afhandeling van alle mogelijke vragen te voorzien, gebruik makende van Events, die ook de historiek en traceerbaarheid van het systeem garanderen, van client tot backend.</p>
<p style="text-align: justify;">
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Architecturale Evoluties, deel 1</title>
		<link>https://www.smalsresearch.be/architecturale-evoluties-deel-1/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 21 Mar 2018 13:35:54 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11434</guid>

					<description><![CDATA[Vroeger was het simpel: je had front end, back end, en database. En toch is dit verre van optimaal. Hoe ziet een architectuur eruit die gebruik maakt van moderne principes en technologieën? Er zijn heel wat mogelijkheden te overwegen wanneer men de architectuur van een applicatie bepaalt. Dit is nog eens extra het geval wanneer [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><a href="/wp-content/uploads/2018/03/architecture.png"><img loading="lazy" decoding="async" class="alignleft size-full wp-image-11480" src="/wp-content/uploads/2018/03/architecture.png" alt="" width="146" height="141" /></a>Vroeger was het simpel: je had front end, back end, en database. En toch is dit verre van optimaal. Hoe ziet een architectuur eruit die gebruik maakt van moderne principes en technologieën?</p>
<p><span id="more-11434"></span></p>
<p style="text-align: justify;">Er zijn heel wat mogelijkheden te overwegen wanneer men de architectuur van een applicatie bepaalt. Dit is nog eens extra het geval wanneer het een applicatie betreft die niet alleen staat, maar op allerlei manieren zal moeten integreren met andere applicaties en diensten, zowel binnen als buiten de eigen organisatie. In een tweedelige blogreeks bespreken we een aantal mogelijkheden die ons worden geboden door een aantal architecturale principes en technologieën, die ik reeds eerder samenvatte als de &#8220;<a href="/de-vortex-van-enablers/">Vortex van Enablers</a>&#8220;.</p>
<p style="text-align: justify;">In dit eerste deel bespreken we de bovenste regionen van de moderne applicatie architectuur. Alles wat met de interactie met de buitenwereld te maken heeft, zoals clients en 3rd party systemen (die vaak gewoon ook als clients kunnen worden beschouwd). In de volgende blog zal het dan gaan over de meer interne systemen. We beginnen hier met een terugblik op de traditionele 3-tier architectuur.</p>
<h1>De 3-tier Architectuur</h1>
<p><figure id="attachment_11442" aria-describedby="caption-attachment-11442" style="width: 129px" class="wp-caption alignleft"><a href="/wp-content/uploads/2018/03/3-tier-arch-highlevel.png"><img loading="lazy" decoding="async" class="wp-image-11442 size-medium" src="/wp-content/uploads/2018/03/3-tier-arch-highlevel-129x300.png" alt="" width="129" height="300" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-arch-highlevel-129x300.png 129w, https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-arch-highlevel.png 285w" sizes="auto, (max-width: 129px) 100vw, 129px" /></a><figcaption id="caption-attachment-11442" class="wp-caption-text">Fig. 1: De 3-tier Architectuur</figcaption></figure></p>
<p style="text-align: justify;">De 3-tier architectuur kennen we ondertussen stilaan. De verschillende &#8220;tiers&#8221; die er kunnen bestaan, en de geschiedenis ervan, werden reeds uitvoerig beschreven in de blog <a href="/van-n-tier-naar-microservices/">Van N-tier naar Microservices</a>.</p>
<p style="text-align: justify;">Deze stilaan verouderde architectuur kent een aantal problemen, niet in het minst qua herbruikbaarheid en integratiemogelijkheden. Zo komt men vaak in de problemen wanneer men nieuwe manieren van interactie wil toevoegen, zoals een <a href="/de-mobiele-burger-zowel-consument-als-leverancier-van-data-apps/">mobiele app</a>, of, waarom niet, een <a href="/conversationele-interfaces/">conversational interface</a>. Een ander euvel is integratie: wanneer de <a href="/data-centric-it-met-rest/">data</a> nodig is voor andere toepassingen, blijkt de op zichzelf ontworpen 3-tier applicatie vaak te incompatibel, en is men gedwongen de integratie via de data te doen. Dit door ofwel de database te koppelen aan meerdere applicaties via opengestelde fluxen, of d.m.v. het creëren van een duplicaat van de data, dat men dan om de zoveel tijd zal moeten updaten via één of ander <a href="https://en.wikipedia.org/wiki/Extract,_transform,_load">ETL </a>mechanisme. Een groot probleem is daarbij ook vaak dat de data semantisch sterk is gekoppeld aan de specifieke applicatiecontext.</p>
<p><figure id="attachment_11446" aria-describedby="caption-attachment-11446" style="width: 150px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/03/3-tier-api.png"><img loading="lazy" decoding="async" class="wp-image-11446" src="/wp-content/uploads/2018/03/3-tier-api-230x300.png" alt="" width="150" height="195" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-api-230x300.png 230w, https://www.smalsresearch.be/wp-content/uploads/2018/03/3-tier-api.png 271w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a><figcaption id="caption-attachment-11446" class="wp-caption-text">Fig. 2: 3-tier Front End, ontsloten door API.</figcaption></figure></p>
<p style="text-align: justify;">Verderop in deze blogreeks gaan we bekijken hoe het beter kan, met een modernere architectuur. Uiteraard is dit echter geen zwart-wit verhaal. De beschreven voorbeeldoplossing zal op een behoorlijk verregaande manier verschillen van de traditionele oplossing, maar er zijn uiteraard ook allerlei tussenoplossingen en middenweg-scenario&#8217;s te bedenken. Een zeer eenvoudig voorbeeld is bijvoorbeeld het koppelen van de verschillende tiers binnen zo&#8217;n verouderde architectuur via RESTful APIs (zie Fig. 2). Dit is een vaak broodnodige upgrade, die nu reeds op veel plaatsen wordt toegepast. Het is een goed begin, maar meestal nog onvoldoende om de flexibiliteit en herbruikbaarheid te bereiken die we beogen met een echte modernisering.</p>
<h1 style="text-align: justify;">De Moderne Architectuur, Deel 1</h1>
<p style="text-align: justify;">De moderne architectuur bestaat uit de culminatie van een aantal belangrijke architecturale principes, zoals <a href="/data-centric-it-met-rest/">Restful API</a>&#8216;s, <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a> (<a href="/geavanceerd-event-driven-engineering/">EDA</a>) en MicroServices, waarover ik reeds meerdere blogs heb geproduceerd (Al deze technologieën maken ook deel uit van de <a href="/de-vortex-van-enablers/">Vortex van Enablers</a>). In de laatste, over <a href="/services-in-alle-maten-van-macro-naar-nano/">Services in alle Maten</a>, gaf ik reeds een uitgebreid, zei het vaag blijvend, voorbeeld over hoe een API (een op clients gericht product&nbsp;!) kan worden geïmplementeerd door een combinatie van (interne) microservices, die met elkaar kunnen communiceren via REST en EDA.</p>
<p style="text-align: justify;">Laten we nu iets concreter ingaan op hoe een modern gebouwde applicatie kan worden gebouwd gebruik makende van deze technologieën. Een dergelijke applicatie staat echter nooit alleen, dus we beschouwen deze samen met zijn onmiddellijke omgeving, bestaande uit clients, maar ook andere applicaties en diensten.</p>
<ul>
<li style="padding-left: 30px;">
<h2>Front-Facing API Ecosystem</h2>
<div style="margin: -60px 0px 0px 0px;">
<p><figure id="attachment_11449" aria-describedby="caption-attachment-11449" style="width: 150px" class="wp-caption alignright"><a href="/wp-content/uploads/2018/03/ui-api.png"><img loading="lazy" decoding="async" class="wp-image-11449" src="/wp-content/uploads/2018/03/ui-api-300x134.png" alt="" width="150" height="67" srcset="https://www.smalsresearch.be/wp-content/uploads/2018/03/ui-api-300x134.png 300w, https://www.smalsresearch.be/wp-content/uploads/2018/03/ui-api.png 386w" sizes="auto, (max-width: 150px) 100vw, 150px" /></a><figcaption id="caption-attachment-11449" class="wp-caption-text">Fig. 3: Symbolisch: De Front End APIs</figcaption></figure></p>
</div>
<p>&nbsp;</p>
<p style="text-align: justify;">We beginnen ons verhaal bij de Front End. Dit betekent dat we de modernisering van de eigenlijke client en gebruikers-interface (UI) in deze blog buiten beschouwing laten. Dit betekent echter niet dat daar geen evoluties zouden zijn, of dat de architectuur van een &#8220;app&#8221; zelf geen modernisering zou behoeven.</p>
<p style="text-align: justify;">Naar de clients en de buitenwereld toe, zijn APIs de belangrijkste evolutie van de voorbije jaren. Meer en meer zal men APIs zélf gaan aanbieden als product naar derde partijen toe, en eveneens naar andere applicaties en diensten binnen de eigen onderneming. Daarbovenop komt nog dat er een proliferatie is geweest aan verschillende kanalen via dewelke een applicatie kan worden gebruikt. Dit zorgt ervoor dat de front end meer en meer een product op zich wordt, dat zich vooral moet bezighouden met het aanbieden van de nodige faciliteiten voor alle mogelijke vormen van interactie met de buitenwereld, en vooral niet met enige andere zaken, zoals de business logica zelf.</p>
<p style="text-align: justify;">Omdat het een goed principe is om alles zo modulair mogelijk te maken (hoe kleiner de aparte componenten, hoe makkelijker men ze afzonderlijk kan aanpassen, of zelfs vervangen via het <a href="https://www.cio.com/article/3006635/leadership-management/why-rip-and-replace-it-projects-are-worth-the-effort.html">rip-and-replace</a> principe), bekomt men zo uiteindelijk een volledig ecosysteem van gerelateerde APIs, elk bevoegd voor het afhandelen van een bepaald type interactie met de buitenwereld. De API die achter de traditionele web app staat, zal aldus verschillen van de API die gebruikt wordt voor 3rd party clients. Afhankelijk van hoe sterk de verschillen zijn, kan men er al dan niet voor opteren om achter al deze APIs nog een verenigende API te plaatsen, die zaken zal bevatten die door alle extern gerichte APIs kunnen worden (her-)gebruikt. Een uitgebreid voorbeeld zien we in Figuur 4 (vele andere voorbeelden zijn mogelijk; zo zou de mobiele app ook met de webserver kunnen communiceren).</p>
<p><figure id="attachment_11460" aria-describedby="caption-attachment-11460" style="width: 850px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2018/03/ui-api-complex.png"><img loading="lazy" decoding="async" class="size-full wp-image-11460" src="/wp-content/uploads/2018/03/ui-api-complex.png" alt="" width="850" height="578" /></a><figcaption id="caption-attachment-11460" class="wp-caption-text">Fig. 4: Een uitgebreid voorbeeld van de &#8220;voorkant&#8221; van een applicatie. Hier is gekozen om één algemene API te voorzien voor alle aanvragen die vanaf de buitenwereld op de applicatie afkomen, ondersteund door een aantal andere componenten, die zich specialiseren in het afhandelen van verkeer, specifiek afkomstig van: externe partijen die via RESTful API contact willen leggen; een desktop applicatie, die rechtstreeks met de algemene API communiceert; een mobiele app, die via een mobile backend API werkt; en een web-applicatie, waarvan de webserver met de algemene API communiceert. Al deze API&#8217;s of applicaties worden geïmplementeerd door één of meerdere microservices. Gele pijlen stellen RESTful communicatie voor, de oranje pijlen zijn specifieke communicatie tussen webserver en -client.</figcaption></figure></li>
</ul>
<h2>Beschouwingen</h2>
<p style="text-align: justify;">Wanneer men het voorbeeld bekijkt, zou men kunnen zeggen dat het er ingewikkelder uitziet dan vroeger, toen dit nog gewoon &#8220;de bovenste tier&#8221; was. Schijn bedriegt echter: de APIs worden nu gedragen door gespecialiseerde microservices die met elkaar samenwerken. Dit gedistribueerd systeem heeft uiteraard zijn eigen complexiteit, maar de oorspronkelijke tier had die ook in zekere mate: alleen was ze daar geïnternaliseerd binnen één monolithische component.</p>
<p style="text-align: justify;">Verder zijn er heel wat voordelen verbonden aan de nieuwe architectuur: microservices, die via APIs communiceren, kan men veel sneller aanpassen of zelfs herontwikkelen. Hierdoor kan men sneller reageren op veranderende noden van de business. Daarenboven heeft het ook technische voordelen: de communicatie is nu gestandaardiseerd over http, waardoor (soms onverwachte) integraties een stuk soepeler kunnen worden geïmplementeerd. Bovendien kan men microservices apart schalen, en kan het systeem als geheel zich dus veel elastischer gedragen, afhankelijk van de belasting die het ondervindt. Ten slotte zijn microservices het ideale complement van containers: de basis bouwsteen van een moderne Cloud infrastructuur. Typisch zal men één microservice op één container uitrollen.</p>
<p style="text-align: justify;"><a href="/architecturale-evoluties-deel-2/">In het vervolg</a> zullen we zien hoe commando&#8217;s (zaken die de toestand van de applicatie kunnen veranderen) en query&#8217;s (zaken die informatie opvragen uit applicaties) uit deze bovenste regionen naar de verder liggende backends worden gestuurd en daar worden behandeld. Daar zal ook de kracht van <a href="/blockchain-vs-event-driven-architecture/">Event Driven Architecture</a> tot zijn recht komen.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Services in alle Maten: van Macro naar Nano</title>
		<link>https://www.smalsresearch.be/services-in-alle-maten-van-macro-naar-nano/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Mon, 27 Nov 2017 10:33:40 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=11111</guid>

					<description><![CDATA[Eén van de grote hypes in de wereld van de software architectuur, is het gebruik van MicroServices. Vaak is het &#8220;micro&#8221; aspect echter een beetje overkill, en maakt men eerder &#8220;MiniServices&#8221;. Deze blog werpt een blik op welke maten en gewichten van services er zoal bestaan. We zullen het daarbij hebben over een aantal categorieën [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2016/06/logomicro.png"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-9733" src="/wp-content/uploads/2016/06/logomicro-150x150.png" alt="" width="150" height="150" /></a>Eén van de grote hypes in de wereld van de software architectuur, is het gebruik van MicroServices. Vaak is het &#8220;micro&#8221; aspect echter een beetje overkill, en maakt men eerder &#8220;MiniServices&#8221;. Deze blog werpt een blik op welke maten en gewichten van services er zoal bestaan.</p>
<p style="text-align: justify;"><span id="more-11111"></span></p>
<p style="text-align: justify;">We zullen het daarbij hebben over een aantal categorieën of grootteordes van services: <a href="/van-n-tier-naar-microservices/">microservices</a>, miniservices en macroservices. En dan zetten we er ook nog zogenaamde nanoservices langs, die eigenlijk (nog?) geen officiële definitie hebben&#8230; Al deze architecturele paradigma&#8217;s zijn in zekere mate geïnspireerd door de reeds langs gekende <a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Service-Oriented Architecture</a> (SOA).</p>
<p style="text-align: justify;">We kunnen nu wel al iedereen gerust stellen: er bestaat geen &#8220;one size fits all&#8221;; alle groottes van services zullen nuttig zijn in de portfolio van applicaties, diensten en componenten die een IT-bedrijf zal ondersteunen. Deze heterogeniteit wordt ook vooropgesteld door Gartner en ze noemen dit de MultiGrained <a href="https://apifriends.com/2017/06/05/what-is-masa/">Mesh App and Service Architecture</a> (MG-MASA). Het belangrijkste daarbij is dat alle componenten hierin zo onafhankelijk mogelijk ontwikkelbaar zijn, terwijl ze toch vlot met elkaar kunnen communiceren en integreren.</p>
<p style="text-align: justify;">Met uitzondering van de dubieuze term &#8220;nanoservices&#8221;, zullen we van klein naar groot gaan: we zullen eerst grondig definiëren wat microservices nu eigenlijk zijn, alvorens de &#8220;grotere&#8221; services te bespreken.</p>
<h1 style="text-align: justify;">MicroServices: van Startup tot Web Scale speler</h1>
<p style="text-align: justify;">Microservices zijn onafhankelijke diensten met een sterk beperkte scope. Ze volgen rigoureus een aantal architecturale principes waardoor ze extreem wendbaar ( <strong><em>agile </em></strong>) zijn en ook heel flexibel schaalbaar. Ze zijn zo ontkoppeld mogelijk van andere applicaties en diensten, doch communiceren er ook mee. Deze schijnbare tegenstrijdigheid wordt doorgaans opgevangen door een <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a>, dewelke losgekoppelde communicatie in gedistribueerde systemen ondersteunt.</p>
<div style="width: 300px; display: block; align: right; vertical-align: top; float: right; border: 1px solid #ddd; margin: 4px 0 5px 10px; padding: 5px 5px 0px 5px; background-color: #eee;">
<p><strong><em>Definitie: MicroService</em></strong></p>
<p style="text-align: justify;">Microservices zijn sterk ingekapselde, losgekoppelde, onafhankelijk ontplooibare en schaalbare applicatiecomponenten met een sterk beperkte scope. De microservices architectuur is gebaseerd op een combinatie van SOA en DDD en heeft drie belangrijke objectieven: wendbaarheid bij de ontwik-keling, flexibiliteit bij de uitrol en precieze schaalbaarheid.</p>
</div>
<p style="text-align: justify;">De beperkte scope en bijgevolg doorgaans kleinere codebase is ook voor een stuk wat een microservice zo wendbaar maakt: ze kunnen door een klein devops team worden ontwikkeld en onderhouden en meermaals daags opnieuw uitgerold worden met veranderende features. Een grote applicatie die aldus ondersteund wordt door een groep van microservices, zal constant online blijven maar continu kleine veranderingen ondergaan en dus voortdurend evolueren. Op deze manier zorgt de microservices architectuur dus voor extreem door-gedreven <a href="https://en.wikipedia.org/wiki/Continuous_delivery">Continuous Delivery</a>. Andere aspecten van deze architectuur zijn het principe van &#8220;single responsability&#8221; (wat op hetzelfde neerkomt als de beperkte scope), extreme schaalbaarheid en &#8211; indien de microservice gepersisteerde data beheert, exclusieve toegang (= &#8220;eigenaarschap&#8221; of <em>ownership</em>) tot zijn database (of andere persistentie-oplossing), in het kader van de loskoppeling.</p>
<p style="text-align: justify;">Microservices zijn op de kaart gezet door toepassing bij een aantal grote en bekende bedrijven als <span class="fontstyle0">Twitter, </span><span class="fontstyle0">Airbnb, Disney, Dropbox, GE, Goldman Sachs, en uiteraard ook grote Cloud spelers  zoals Amazon en Google. M</span><span style="font-weight: 300; text-align: justify;">icroservices, volgens de strikte definitie, zijn echter bij veel middelgrote bedrijven nog zeldzaam, al evolueren sommige miniservices (zie verder) na een tijdje wel tot een groepje microservices, doordat aparte functionaliteiten worden afgesplitst.</span></p>
<div style="width: 375px; display: block; align: right; vertical-align: top; float: left; border: 1px solid #ddd; margin: 4px 10px 5px 0; padding: 5px 5px 0px 5px; background-color: #eee;">
<p><strong><em>&#8220;Reuse&#8221;: Een anti-patroon&nbsp;?</em></strong></p>
<p style="text-align: justify;">Hergebruik wordt vaak gezien als de heilige graal van ontwikkeling: alles wat we reeds bouwden, zouden we moeten kunnen hergebruiken indien de functionaliteit voorkomt in iets anders dat we gaan bouwen.</p>
<p style="text-align: justify;">We moeten echter goed gaan opletten op welk niveau we gaan hergebruiken, zeker als we met de architectuur richting microservices evolueren. Vermits deze zo onafhankelijk mogelijk van elkaar moeten zijn, kan het <strong>soms contraproductief</strong> zijn <strong>om code te gaan hergebruiken tussen meerdere microservices</strong>. Dergelijk hergebruik creëert afhankelijkheden en verplichtingen die de wendbaarheid van een microservice doen afnemen.</p>
<p style="text-align: justify;">Waar vinden we dan wel nog <strong>herbruikbaarheid</strong>? <strong>Op het niveau van de APIs</strong>. Deze dienen te worden behandeld als een volwaardig eindproduct, dat kan worden gebruikt in tal van andere toepassingen en eventueel zelfs extra-muros.</p>
</div>
<p style="text-align: justify;"><span style="font-weight: 300; text-align: justify;">Ze worden qua aangeboden functionaliteit opzettelijk en strikt beperkt gehouden: normaal gezien wordt er slechts één specifieke feature ondersteund, of één bounded context binnen een domein (voor meer info over deze term, kijk naar </span><a style="font-weight: 300; text-align: justify;" href="https://en.wikipedia.org/wiki/Domain-driven_design">Domain Driven Design</a><span style="font-weight: 300; text-align: justify;"> (DDD)). </span>Doordat ze zo klein zijn en slechts één functionaliteit hebben, en apart uitrolbaar zijn, vormen microservices dus de ultieme vorm van flexibele schaalbaarheid. Een applicatie bestaande uit vele microservices kan optimaal gebruik maken van beschikbare resources: elke component die iets meer gebruikt wordt dan een andere, kan apart opgeschaald worden. Componenten die minder vaak nodig zijn, worden omlaag geschaald.</p>
<p style="text-align: justify;">De onafhankelijkheid van een microservice beperkt zich best niet tot fysiek afzonderlijke deployments. Ook gedeelde libraries kunnen namelijk worden beschouwd als een te grote afhankelijkheid tussen verschillende microservices. Op deze manier wordt hergebruik soms een anti-patroon (&#8220;anti-pattern&#8221;). Het gaat dan natuurlijk wel om de code die het domein implementeert, er is weinig op tegen om utilitaire bibliotheken, zoals een logging raamwerk, te hergebruiken in meerdere microservices.</p>
<p style="text-align: justify;">Microservices vinden we dan ook vooral terug bij bedrijven die op grote schaal (&#8220;web scale&#8221;) actief zijn, en dusdanig grote volumes moeten ondersteunen dat elke uitgespaarde percent benodigde resources een enorme kostenreductie tot gevolg heeft. We denken dan aan grote mediaspelers als Netflix, winkels als Amazon en Zalando, en uiteraard ook de Twitters, Facebooks en Googles van deze tijd.</p>
<div style="width: 475px; display: block; align: right; vertical-align: top; float: center; border: 1px solid #ddd; margin: 0 auto; padding: 5px; background-color: #eee;">
<p><strong><em>MicroServices: een andere &#8220;ph-waarde&#8221;: van ACID naar BASE</em></strong></p>
<p style="text-align: justify;">In de wereld van transacties is het ACID-model reeds lang ingeburgerd. Het stelt voorwaarden waaraan transacties moeten voldoen: A<span class="fontstyle0">tomicity, Consistency, Isolation and Durability. Dit komt erop neer dat de gegevens ten allen tijde overal overeenkomen, correct zijn, goed bewaard worden, nooit verloren kunnen gaan, etc.</span></p>
<p style="text-align: justify;">Voor gedistribueerde systemen is dit echter moeilijk, omdat deze sterke consistentie inhoudt dat men (voor de zelfde prijs) op minstens één van twee andere vlakken zal moeten inbinden: beschikbaarheid of partition tolerance (tolerantie voor netwerkfalen tussen de componenten). Microservices hebben hier per definitie last van, vanwege hun gedistribueerde natuur. Dit principe noemt men het <a href="/99-9-availability-fundamenteel-anders/">CAP-theorema</a>.</p>
<p style="text-align: justify;"><span class="fontstyle0">Bij gebruik van deze architectuur raadt men dan ook een alternatief aan: BASE. Dit wil zeggen: B</span><span class="fontstyle0">asically Available, Soft state, Eventually consistent. In dit model geeft men een stuk consistentie op om het geheel beschikbaarder en schaalbaarder te kunnen maken.</span></p>
<p style="text-align: justify;"><span class="fontstyle0">Puur technisch is het echt niet altijd gemakkelijk om met eventual consistency om te gaan; men zal dit model eerder moeten doortrekken op business niveau. Een aanpak gebaseerd op (business) Events zal doorgaans nauwer aansluiten bij dit model.</span></p>
</div>
<p style="text-align: justify;">Maar doordat het een nieuwe, moderne manier van ontwikkelen is, zijn microservices ook enorm populair bij startups. Deze hebben vaak het voordeel dat ze van nul kunnen beginnen met hun technologie, zonder enige legacy, en dat ze met kleine teams en een frisse bedrijfscultuur werken. <strong>Een Devops en Agile cultuur zijn namelijk sterke vereisten om microservices te kunnen ontwikkelen</strong>; hun architectuur verschuift namelijk de complexiteit weg van de binnenkant van een monoliet, maar recht naar de onderlinge interacties tussen vele (gedistribueerde) applicatiecomponten. Het voordeel  van microservices voor de startups is weliswaar dat ze op technologisch vlak een stuk robuuster zijn bij eventuele plotse groei, en ze de wendbaarheid ook goed kunnen gebruiken om snel in te spelen op marktopportuniteiten (er zijn reducties in ontwikkelingstijd tot 75% geschat).</p>
<h2 style="padding-left: 30px;"><em>APIs en Microservices</em></h2>
<p style="text-align: justify;">Microservices worden vaak beschouwd als de ideale manier om een <a href="/data-centric-it-met-rest/">API</a> te implementeren. Dit is inderdaad een goede werkwijze, maar dan met één hele belangrijke caveat: de onafhankelijkheid van de microservice moet gewaarborgd blijven. Het scheiden van een<span class="fontstyle0"> API en zijn implementatie is een fundamenteel principe bij SOA, dat nog belangrijker wordt in de context van de extreme vereisten die aan een microservices architectuur worden gesteld.</span></p>
<p style="text-align: justify;">Een API moet behandeld worden als een product. Geregeld worden APIs namelijk naar buiten toe opengesteld (en soms zelfs effectief gemonetariseerd), en op zijn minst dienen ze als interface naar andere software componenten (en dus andere ontwikkelteams) toe. Ze hebben dus nood aan een rigoureus change management.</p>
<p><figure id="attachment_11196" aria-describedby="caption-attachment-11196" style="width: 938px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2017/11/MSA-example.png"><img loading="lazy" decoding="async" class="size-full wp-image-11196" src="/wp-content/uploads/2017/11/MSA-example.png" alt="" width="938" height="558" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example.png 938w, https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example-300x178.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/11/MSA-example-768x457.png 768w" sizes="auto, (max-width: 938px) 100vw, 938px" /></a><figcaption id="caption-attachment-11196" class="wp-caption-text">Een voorbeeld van een Microservices architectuur, waarbij een API wordt aangeboden aan de buitenwereld.</figcaption></figure></p>
<p style="text-align: justify;">De microservices daarentegen moeten snel kunnen evolueren en aangepast kunnen worden. Soms worden ze zelfs volledig vervangen (ze zijn <em>disposable</em>: het verlies blijft beperkt doordat ze kleiner zijn). Sowieso zal één microservice ook nooit een volledige API implementeren (tenzij als het echt om een miniscuul klein product zou gaan): achter de API bevindt zich doorgaans een hele batterij van componenten, waarbij verschillende microservices de effectieve business logica zullen uitvoeren. Andere componenten zijn bijvoorbeeld een Event bus, maar ook en vooral een API bemiddelingstool (&#8220;mediation&#8221;), die ervoor zal zorgen dat de calls naar de API bij de correcte afhandeling terecht komen, en op die manier de microservice loskoppelen van de ondersteunde API. Deze tools zijn doorgaans vervat binnen de context van een API Gateway of API Management suite.</p>
<h1 style="text-align: justify;">De Pragmatische Aanpak: MiniServices</h1>
<p style="text-align: justify;">De term &#8220;microservice&#8221; wordt vaak misbruikt om eender welke kleine en herbruikbare dienst te benoemen. Maar zoals we hierboven zagen, voldoet dit nog lang niet aan de eigenlijke definitie, en is het ook zo dat een microservice zijn eigen API best niet zelf publiceert.</p>
<p style="text-align: justify;">De categorie die dan ook door vele &#8220;enterprise niveau&#8221; bedrijven het vaakst wordt toegepast, is eigenlijk de <em>miniservice</em>, ook al zijn deze bedrijven snel om te zeggen dat ze een &#8220;microservices architectuur&#8221; gebruiken. De architecturen lijken dan ook wel enigszins op elkaar en enkel de grootte en scope (en het uiteindelijke doel) verschillen hier nog.</p>
<p style="text-align: justify;">Miniservices implementeren geen volledige applicatie, en zullen normaal gezien ook slechts een stukje van een extern gerichte API invullen. Ze focussen zich op de functionaliteiten verband houdende met een bepaald subdomein in de applicatie. Wanneer we de principes van Domain Driven Design (DDD) volgen: een miniservice kan een volledig domein implementeren, maar eventueel ook een niet al te kleine &#8220;bounded context&#8221;, of alles wat ertussen ligt.</p>
<p style="text-align: justify;">Miniservices zijn onafhankelijk van elkaar te ontwikkelen en uit te rollen, waardoor er een flexibiliteit ontstaat: doordat men werkt met kleinere componenten die losjes gekoppeld zijn en die men daardoor apart kan ontwikkelen en laten evolueren, kan men iets sneller de functionaliteiten veranderen via een meer agile ontwikkelingsmethode, en men kan dus sneller op de bal spelen. Hierdoor kan men beter ten dienste staan van de business, die sneller zijn product kan laten aanpassen aan veranderende marktomstandigheden. Dit komt dus neer op een afgezwakte versie van de vereisten voor microservices.</p>
<p style="text-align: justify;">Wat data betreft, heeft men opties: in sommige gevallen kan men ervoor opteren om de database die onder een miniservice staat, nog bruikbaar te houden voor andere applicaties en diensten; soms is dit gewoon gemakkelijker en efficiënter dan de data via de API bloot te stellen, of op een moderne gedistribueerde manier te verspreiden zoals dit bij microservices gebeurt. Men moet hier echter mee oppassen en het beperken, want hierdoor creëert men quasi onherroepelijk afhankelijkheden. Beter is het om wat de data betreft toch eerder richting microservices architectuur te evolueren en de miniservice exclusieve toegang tot zijn data te geven.</p>
<p style="text-align: justify;">Volgens een schatting van <a href="https://www.gartner.com/doc/3615120/innovation-insight-miniservices">Gartner</a> zal tegen 2019 90% van de organisaties het microservices paradigma te disruptief vinden en eerder gebruik maken van miniservices.</p>
<p style="text-align: justify;">Er zijn, ten slotte, nog een aantal andere alternatieven voor een microservices aanpak, naast miniservices. Zo bestaan er <a href="/as-a-service-een-waaier-aan-mogelijkheden/">PaaS platformen</a> waarbij er sterk visueel kan worden ontwikkeld (met zogenaamde &#8220;zero coding&#8221;) en men op die manier de productiviteit kan laten stijgen. En voor het implementeren van business processen kan men nog gebruik maken van <a href="/case-management-oude-software-in-een-nieuwe-verpakking/">BPMS suites</a>, die ook hier vaak een sterke automatisatie toelaten op een meer grafische manier.</p>
<h1 style="text-align: justify;">Old School: de MacroService</h1>
<p style="text-align: justify;">Macroservices representeren de traditionele SOA aanpak, die nu sterk in vraag wordt gesteld door de IT industrie. Via een macroservice brengt men een volledige applicatie of dienst online, in één grote deployment; deze ondersteunt dan een typische request/response API. Het woord service kan dan in hoofdzaak worden aangewend doordat men de applicatie of dienst heeft ge-&#8220;service enabled&#8221;. Er wordt m.a.w. een SOAP of (beter!) een REST API aangeboden aan de buitenwereld om met de macroservice te interageren. Vaak is het ook zo dat deze applicatie bovenop een database gebouwd wordt, via dewelke nog wordt geïntegreerd met andere toepassingen.</p>
<p style="text-align: justify;">Momenteel is het sterk afgeraden om op deze manier een nieuwe applicatie op te bouwen, maar deze systemen hebben echter wel nog af en toe hun nut! Vele bedrijven hebben namelijk een bepaald arsenaal aan zogenaamde &#8220;legacy&#8221; toepassingen, die vaak nog belangrijke taken verrichten, en die te groot en te complex (en dus te duur) zijn geworden om ze volledig te vervangen door een moderne variant die dezelfde kernfunctionaliteit encapsuleert. Wat men dan op z&#8217;n minst kan doen om deze applicaties beter te kunnen integreren met de nieuwere generatie componenten, is ze te &#8220;service enablen&#8221;. Dit betekent dat men er een laag rond bouwt die een moderne (REST) API zal aanbieden waarmee andere toepassingen dan gemakkelijker verbinding kunnen maken. De laag zal ervoor zorgen dat de buitenwereld niets hoeft te merken van de soms rare zaken die met de legacy toepassing kunnen misgaan, of van de esoterische programmeertalen en protocols die erin worden gebruikt.</p>
<p style="text-align: justify;">Let wel dat er steeds moet worden afgewogen om zulke applicaties toch niet te re-engineeren. Wanneer het echt om de core business van een bedrijf gaat, en men wil kunnen inspelen op b.v. een veranderende markt (m.a.w. wanneer men wendbaarder, meer <em>agile</em>, wil zijn), kan het op langere termijn soms voordeliger zijn om ze te vervangen door een meer op microservices geïnspireerde architectuur. Het gebruik van MacroServices is eerder geschikt voor applicaties die minder vaak veranderingen dienen te ondergaan, maar die wel via een API moeten kunnen worden aangesproken. Soms kan het ook gaan om aangekochte software, die dus inherent niet onder de eigen controle zit en niet kan ge-reëngineered worden.</p>
<p><a href="/wp-content/uploads/2017/11/granulariteit.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-11195" src="/wp-content/uploads/2017/11/granulariteit.png" alt="" width="913" height="439" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit.png 913w, https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit-300x144.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/11/granulariteit-768x369.png 768w" sizes="auto, (max-width: 913px) 100vw, 913px" /></a></p>
<h1 style="text-align: justify;">De Toekomst is hier: NanoServices</h1>
<p style="text-align: justify;">NanoServices kan twee zaken betekenen. Enerzijds is het een door sommige mensen aangewende term om op een anti-patroon bij het bouwen van microservices te duiden: namelijk een <a href="https://dzone.com/articles/soa-anti-pattern-nanoservices">te sterke beperking van de scope</a>, op een manier die zinloos is. Het komt er dus op neer dat men goed moet nadenken over de bounded context en het te verwachten aparte gebruik van de diensten die deel uitmaken van een applicatie.</p>
<p style="text-align: justify;">Anderzijds kan men de term ook officieus gebruiken als bijnaam voor de zogenaamde Serverless diensten, of nog <a href="https://en.wikipedia.org/wiki/Function_as_a_service">Function Platform as a Service</a> (FPaaS). Via deze platformen kan men hele kleine stukjes code uitrollen zonder zich iets te moeten aantrekken van onderliggende infrastructuur, en deze aan te bieden via een kleine API. De granulariteit van de manier van ontplooien zorgt er daarbij voor dat men vaak nog kleiner kan gaan dan bij microservices. Uiteraard moet men erover blijven waken dat het zin blijft hebben om de functionaliteit zodanig in stukjes te kappen, wil men niet in het gelijknamig benoemde anti-pattern terechtkomen.</p>
<p style="text-align: justify;"><a href="https://martinfowler.com/articles/serverless.html">Serverless Architecture</a> maakt momenteel grote furore in de public cloud en er zijn ook al enkele open source oplossingen om een dergelijk platform in het eigen datacenter op te zetten.</p>
<h1 style="text-align: justify;">Besluit: Wat moeten we nu Bouwen?</h1>
<p style="text-align: justify;"><strong><em>De microservices architectuur is een zeer goede blauwdruk voor software ontwikkeling</em></strong>. De voordelen van wendbaarheid en flexibiliteit zijn een must voor bedrijven die goed willen kunnen inspelen op de markt en de klant, en een robuuste portfolio aan herbruikbare services willen uitbouwen.</p>
<p style="text-align: justify;">De vereisten om aan échte microservices ontwikkeling te doen zijn echter erg hoog, en het is niet altijd noodzakelijk om zulke extreme flexibiliteit en schaalbaarheid te behalen. Vaak is het voldoende om de microservices architectuur eerder benaderend na te streven via het bouwen van zogenaamde <strong><em>miniservices. In de meeste gevallen is dit dan ook de aangewezen manier van werken</em></strong>.</p>
<p style="text-align: justify;">Wanneer legacy toepassingen moeten worden ontsloten en er geen grote nood is aan het wendbaarder maken van deze applicaties, maar wel een ontsluiting via een goede API, dan kan het voldoende zijn om een services laag rond deze applicaties te bouwen en er op die manier een zogenaamde macroservice van te maken, die vanaf dan vlot mee kan integreren met de rest van de portfolio. Denk echter goed na of toekomstige wendbaarheid en flexibiliteit echt wel van minder belang zijn, alvorens dergelijke technische schuld (technical debt) te betonneren.</p>
<p style="text-align: justify;">NanoServices, ten slotte, indien het niet om het anti-patroon gaat, zijn zeker iets waar men mee mag beginnen experimenteren. Het voordeel om zich niets meer van infrastructuur te hoeven aan te trekken en de beschikbaarheid en schaalbaarheid op een quasi magische manier cadeau te krijgen, is niet te onderschatten. In een toekomstige blog wordt er zeker nog teruggekomen op deze Serverless Architectures.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Het eGovernment als Horizontale Dienstverlener?</title>
		<link>https://www.smalsresearch.be/het-egovernment-als-horizontale-dienstverlener/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 24 May 2017 07:53:16 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[cost cutting]]></category>
		<category><![CDATA[data-centric]]></category>
		<category><![CDATA[digital transformation]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[G-Cloud]]></category>
		<category><![CDATA[Managing IT costs]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[vortex]]></category>
		<guid isPermaLink="false">/?p=10290</guid>

					<description><![CDATA[We bevinden ons in een wervelstorm van technologische evoluties, die in vele omgevingen aanleiding geven tot nieuwe business modellen. Ook bij het eGovernment, van oudsher gestructureerd in verticale silo&#8217;s, is er een evolutie begonnen naar meer horizontale synergie. Aan de horizon staan echter nog vele opportuniteiten te wachten! In een vorige blog had ik het reeds [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><img loading="lazy" decoding="async" class="alignleft wp-image-10738" src="/wp-content/uploads/2017/05/be-logo-150x150.png" alt="" width="127" height="127" />We bevinden ons in een <a href="/de-vortex-van-enablers/">wervelstorm van technologische evoluties</a>, die in vele omgevingen aanleiding geven tot nieuwe business modellen. Ook bij het eGovernment, van oudsher gestructureerd in verticale silo&#8217;s, is er een evolutie begonnen naar meer horizontale synergie. Aan de horizon staan echter nog vele opportuniteiten te wachten!</p>
<p><span id="more-10290"></span></p>
<p style="text-align: justify;">In een <a href="/van-chipkaart-naar-smartphone-naar-arm/">vorige blog</a> had ik het reeds over het uitbesteden van gemeenschappelijke zaken, nodig voor meerdere ondernemingen, applicaties &amp; diensten, aan een derde, hierin gespecialiseerde partij. Hetgeen deze laatste partij doet, noemen we &#8220;horizontale dienstverlening&#8221;; men opereert namelijk in een <a href="https://en.wikipedia.org/wiki/Horizontal_market">horizontale markt</a>.</p>
<p style="text-align: justify;">Nu wil ik graag enkele voorbeelden geven van hoe de overheid hetzelfde zou kunnen doen via een <a href="/data-centric-it-met-rest/">data-centric</a> eGovernment (bovenop de vele zaken die ze reeds doet, met b.v. sterke eID authenticatie, de <a href="https://www.gcloud.belgium.be/">G-Cloud</a>, en het eHealth platform).</p>
<h3>Een aantal voorbeelden:</h3>
<ol style="list-style-type: decimal;">
<li>
<h2>Chipkaarten</h2>
<p style="text-align: justify;">In diezelfde <a href="/van-chipkaart-naar-smartphone-naar-arm/">vorige blog</a> vernoemde ik de voordelen die er zouden ontstaan indien we het beheer van chipkaarten zouden afzonderen bij één horizontale chipkaartenbeheerder, en alle gebruikers van deze kaarten dan hiervan gebruik zouden kunnen maken. In een vergevorderd sta<img loading="lazy" decoding="async" class="alignright wp-image-6684" src="/wp-content/uploads/2014/01/export-300x294.png" alt="" width="215" height="211" srcset="https://www.smalsresearch.be/wp-content/uploads/2014/01/export-300x294.png 300w, https://www.smalsresearch.be/wp-content/uploads/2014/01/export.png 376w" sizes="auto, (max-width: 215px) 100vw, 215px" />dium zou het zo in principe zelfs mogelijk worden dat we via één enkele chipkaart van allerlei diensten, aangeboden door verschillende bedrijven (overheid of privé) gebruik kunnen maken, en we dus niet met een <a href="/help-mijn-portefeuille-is-te-dik/">veelheid van de plastieken ondingen in onze portefeuille zouden moeten rondlopen</a>. Dergelijke dienstverlener zou zelfs via een SaaS platform ook aan kleine ondernemingen een paar opties kunnen geven om b.v. aan een bestaande QR code op de chipkaart van een persoon, een klantenkaart te koppelen. Kortom, &#8220;<a href="/one-card-to-rule-them-all/">one card to rule them all</a>&#8220;. Misschien zou de overheid dit kunnen aanbieden via de eID?</p>
</li>
<li>
<h2>&#8220;Waar-woon-ik-as-a-Service&#8221;</h2>
<p style="text-align: justify;">Een eenvoudig, maar krachtig voorbeeld van nuttige en toch min of meer private data, zijn <strong>adressen en adreswijzigingen</strong>. Wat als elke adreswijziging die iemand onderging, onmiddellijk door alle (overheids-)diensten, door de post, door koeriers, en eventueel door een resem andere belanghebbenden was geweten? Dit scenario werkt als volgt:</p>
<ol style="list-style-type: decimal;">
<li>De burger verhuist, en de nodige (fysieke) controles gebeuren.</li>
<li style="text-align: justify;">De gemeenteambtenaar voert dit gegeven in (Dit gegeven valt trouwens onder de noemer &#8220;<a href="https://gcn.com/articles/2016/05/24/civic-moments.aspx">civic moment</a>&#8220;: een belangrijke gebeurtenis in de levensloop van een burger (of bedrijf), die een aantal administratieve gevolgen kan triggeren).</li>
<li style="text-align: justify;">Vanaf dan zijn deze gegevens (zowel het nieuwe adres als de adres<em>verandering</em>) automatisch beschikbaar voor alle overheidsdiensten die er sowieso recht op hebben. Dit is mogelijk via het opvragen van de gegevens (b.v. via <a href="/data-centric-it-met-rest/">REST</a> APIs), maar evenzeer kunnen sommige applicaties onmiddellijk op de hoogte worden gebracht (via <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Events</a>). Bijgevolg kunnen deze diensten dus automatisch eventuele veranderde rechten en plichten van de burger die van zijn adres afhangen, aanpassen, en uiteraard ook hun briefwisseling naar het nieuwe adres richten.
<p><figure id="attachment_9582" aria-describedby="caption-attachment-9582" style="width: 391px" class="wp-caption aligncenter"><img loading="lazy" decoding="async" class="wp-image-9582" src="/wp-content/uploads/2016/03/eda-rest-e1458906104781.png" alt="" width="391" height="216" /><figcaption id="caption-attachment-9582" class="wp-caption-text">Een microservices architectuur, waarin losgekoppelde applicaties op verschillende manieren kunnen communiceren.</figcaption></figure></li>
<li style="text-align: justify;">Daarnaast kan de overheid, als <em>data custodian </em>(zo noemen we de horizontale dienst van het databeheer), ook een applicatie aanbieden aan de burger zelf, waar deze de mogelijkheid krijgt om applicaties van andere bedrijven toegang te geven tot deze gegevens. Dit zou een beetje kunnen werken zoals een Google of Facebook account: ook tot deze accounts kan men (beperkte en specifieke) <a href="/rest-iam-part-2-oauth/">toegang verlenen</a> aan andere applicaties. De burger zou dus b.v. op die manier aan Bpost de toestemming kunnen geven om deze gegevens automatisch te ontvangen. Vanaf dan zou de post automatisch naar het nieuwe adres kunnen worden doorgestuurd. Sterker nog: men zou het zo kunnen regelen, dat men brieven kan versturen op naam (en/of eventueel een unieke identifier die een burger voor zichzelf kan genereren in de toepassing), en dat de post deze dan vanzelf aan het juiste adres levert. Op die manier zou men niet meer overal zijn échte adres moeten opgeven en verhoogt men dus zelfs de <strong>privacy van de burger</strong>.</li>
<li style="text-align: justify; margin-bottom: 2em;">Ook andere koeriersbedrijven zouden op deze dienst kunnen intekenen en door de burger geauthenticeerd kunnen worden om gebruik te maken van diens door de service gekende adres. Ik wacht trouwens nog steeds op de mogelijkheid om een account te creëren bij een koeriersbedrijf en daarna niet meer mijn adres te moeten geven in elke aparte webshop die ik gebruik, maar gewoon te kunnen aanvinken dat mijn gekozen koerier mijn adres reeds kent!</li>
</ol>
<p style="text-align: justify;">In het voorbeeld maakte ik abstractie van een eventueel apart correspondentie-adres, of het gebruik van meerdere adressen, maar deze zou men even goed door de burger zelf kunnen laten beheren in een centraal aangeboden toepassing.</p>
</li>
<li>
<h2>Civiele &#8220;Half-Open&#8221; Data</h2>
<p style="text-align: justify;">Naast het adres heeft de overheid nog een schat van andere informatie over haar burgers en bedrijven. We moeten uiteraard rekening houden met de privacy van dergelijke data, maar desalniettemin kan deze functie van <em>Data Custodian</em> worden uitgebreid met heel wat interessante mogelijkheden. (Ik verwees in de chipkaartenblog reeds naar het gescheiden beheer van gegevensnetwerken versus de applicaties die ervan gebruik maken. De <a href="/de-vortex-van-enablers/">vortex van enablers</a> maakt dit reeds perfect mogelijk.)</p>
<p style="text-align: justify;">Men zou bijvoorbeeld automatisch rechten kunnen afleiden uit bepaalde situaties die burgers ondergaan (verlies van werk, fysiek letsel, &#8230;) indien deze gebeurtenissen (dit zijn Civic Moments en <a href="/geavanceerd-event-driven-engineering/">Events</a>!) en hun corresponderende nieuwe gegevens snel en automatisch door alle nodige diensten werden opgevangen.</p>
<p style="text-align: justify;">In het voorbeeld van het fysiek letsel zou de burger aan een dokter de toestemming kunnen geven om gegevens i.v.m. langdurige werkonbekwaamheid automatisch door te sturen naar instanties die hiervoor uitkeringen betalen. Een gelijktijdig gevolg, met communicatie naar de Fod SZ, zou kunnen zijn dat de burger automatisch een parkeerkaart voor personen met een handicap zou krijgen toegestuurd.</p>
<p>Deze, en nog vele andere mogelijkheden die ontstaan door de juiste data op het juiste moment op de juiste plaats te krijgen, tonen nogmaals aan dat <a href="/data-centric-it-met-rest/">data-centric IT</a> meer dan ooit van belang is (en &#8211; niet te vergeten &#8211; <a href="/data-centric-security-model/">data-centric security</a>).</li>
</ol>
<h3><a id="digi_trans"></a>Digitale transformatie</h3>
<p style="padding-left: 30px; text-align: justify;">Het eGovernment heeft onlangs reeds een fenomenale stap vooruit gezet als horizontale dienstverlener via de G-Cloud, die ervoor zorgt dat men op infrastructuur- en middlewarevlak synergieën kon creëren. Nu is stilaan het moment aangebroken om verder te beginnen denken: ook bovenop de infrastructuur, binnen en tussen applicaties en vooral door hergebruik van gegevens, ligt er nog een goudmijn van mogelijkheden op ons te wachten. In dergelijke context praat men momenteel dan ook graag over &#8220;Digital Transformation&#8221; (een evolutie die eigenlijk <a href="https://en.wikipedia.org/wiki/Digital_transformation">al heel lang gaande</a> is).</p>
<p style="padding-left: 30px; text-align: justify;">Tot nu toe focuste deze trend zich <img loading="lazy" decoding="async" class="alignright wp-image-10751" src="/wp-content/uploads/2017/05/belgdigital-300x243.png" alt="" width="371" height="302" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/05/belgdigital-300x243.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/05/belgdigital-1024x830.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2017/05/belgdigital.png 1101w" sizes="auto, (max-width: 371px) 100vw, 371px" />binnen de overheid daarbij vooral op <strong>kostenbesparingen</strong>: hoe hetzelfde doen, maar dan op een efficiëntere manier? Dit is uiteraard nuttig, maar Digitale Transformatie gaat veel verder dan dat (ook volgens de <a href="https://www.infoworld.com/article/3152507/it-strategy/the-5-myths-of-digital-transformation.html">blogosphere</a>, en ook wanneer het specifiek over <a href="https://www.govtech.com/featured/Cloud-Is-More-Than-Cost-Savings.html">Cloud</a> gaat). De ware kracht van deze trend mag niet verloren gaan in oeverloze discussies over hoe alles goedkoper kan, of hoe de bestaande zaken met de nieuwe technologie efficiënter kunnen worden gemaakt.</p>
<p style="padding-left: 30px; text-align: justify;">Ik durf hierbij zelfs <a href="https://www.infoworld.com/author/Bob-Lewis/">Bob Lewis</a> bij te treden: IT plannen moeten niet gedreven worden door de noden van de business, maar <strong>de business strategie moet gedreven worden door de nieuw beschikbare technologische mogelijkheden!</strong></p>
<p style="padding-left: 30px; text-align: justify;">Welnu: de technologieën die een grote evolutie mogelijk maken, zijn gearriveerd. Laten we onze inspiratie de vrije teugels geven, en bedenken wat voor interessante diensten we nog kunnen bieden, aan zowel de ambtenaren van ons land, als aan zijn burgers en bedrijven.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>De &#8216;Vortex&#8217; van Enablers</title>
		<link>https://www.smalsresearch.be/de-vortex-van-enablers/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 21 Feb 2017 08:14:01 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[vortex]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<guid isPermaLink="false">/?p=10419</guid>

					<description><![CDATA[In de software engineering wereld zijn de voorbije jaren, en nu nog altijd, een aantal indrukwekkende evoluties aan de gang. Verschillende technologieën samen bieden nu nieuwe perspectieven en kunnen de business transformeren. In deze blog een korte opsomming van een aantal van deze ontwikkelingen. Later kunnen we inzoomen op de impact ervan op de business. [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;">In de software engineering wereld zijn de voorbije jaren, en nu nog altijd, een aantal indrukwekkende evoluties aan de gang. Verschillende technologieën samen bieden nu nieuwe perspectieven en kunnen de business transformeren. In deze blog een korte opsomming van een aantal van deze ontwikkelingen. Later kunnen we inzoomen op de impact ervan op de business.</p>
<p style="text-align: justify;"><span id="more-10419"></span></p>
<h1 style="text-align: justify;">&#8220;Digitale Transformatie&#8221;</h1>
<p style="text-align: justify;">Wanneer men het tegenwoordig heeft over <a href="https://www.infoworld.com/article/3152507/it-strategy/the-5-myths-of-digital-transformation.html">bovenstaand buzzword</a>, zal men steevast een aantal technologische evoluties opsommen die een verregaande impact op onze wereld hebben, en bijgevolg ook op de business, (in het bijzonder de IT business). We denken dan <a href="/analytics-behind-the-scenes-humans-and-computers-versus-big-data/">Big Data + Analytics</a>, <a href="/ce-quun-reseau-social-peut-nous-apprendre/">Sociale Media</a>, <a href="/cloud-metaforen-elektriciteit-goud/">Cloud</a> en <a href="/van-chipkaart-naar-smartphone-naar-arm/">Mobile</a>; de zogenaamde &#8220;<a href="https://www.gartner.com/technology/research/nexus-of-forces/">Nexus of Forces</a>&#8220;.</p>
<p style="text-align: justify;">Het is wel waar dat deze <em>nexus</em> nogal wat furore maakt, maar die kan dat, doordat er, onderliggend, een aantal andere technologische evoluties spelen, die het de software engineering wereld mogelijk maken om al deze krachten voldoende te ondersteunen. Evoluties die, als het ware, ervoor zorgen dat de software die deze nexus draaiende houdt, kan worden gebouwd en ontplooid op een beheersbare manier, zonder dat ontwikkelaars ten onder gaan aan de groeiende complexiteit. Een aantal van die evoluties vatten we hier nu samen onder de noemer <em><strong>&#8220;Vortex of Enablers&#8221;</strong></em>. (Over vele van deze technologieën hadden we het reeds eerder &#8211; volg de links voor meer informatie.)</p>
<h1 style="text-align: justify;">Enablers 1 en 2: Verregaande Virtualisatie met Cloud &amp; Containers</h1>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="alignleft wp-image-10540" src="/wp-content/uploads/2017/02/containers-300x225.png" alt="" width="184" height="140" />De <a href="/de-stille-cloud-machtsgreep/">Cloud</a> is niet meer weg te denken, maar welke technologie gaat er precies achter schuil? Oorspronkelijk werden er enorme sprongen voorwaarts gemaakt door het virtualiseren van machines, en infrastructuur in het algemeen (<a href="/as-a-service-een-waaier-aan-mogelijkheden/">IaaS</a>). Maar nu zien we de platformen pas echt ook voor ontwikkelaars tot wasdom komen. <a href="/productiviteitsverhoging-met-paas/">PaaS</a> platformen zijn, dankzij de verschroeiend harde introductie van Container technologie, uitgegroeid tot de <a href="https://www.docker.com/"><img loading="lazy" decoding="async" class="alignright size-medium wp-image-10538" src="/wp-content/uploads/2017/01/moby-300x192.png" alt="" width="300" height="192" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/01/moby-300x192.png 300w, https://www.smalsresearch.be/wp-content/uploads/2017/01/moby.png 525w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a>virtualisatiekeuze bij uitstek. Het worden nu zelfs vaker en vaker in de eerste plaats &#8220;<a href="/disruptie-in-de-cloud-stack-caas/">Container Platformen</a>&#8220;. Momenteel zijn Containers niet meer weg te denken uit Software Engineering, en ze zijn ook een belangrijke enabler voor <a href="https://en.wikipedia.org/wiki/DevOps">DevOps</a>. Maar het verhaal zal hier nog niet eindigen. Aan de horizon duikt reeds een nog hoger niveau van virtualisatie op: het zogenaamde <a href="https://en.wikipedia.org/wiki/Serverless_computing">Serverless Computing</a> (zie ook onze <a href="/radar/approaches-radar-2017/">research radar</a>).</p>
<h1 style="text-align: justify;">Enabler 3: MicroServices</h1>
<p style="text-align: justify;"><a href="/van-n-tier-naar-microservices/"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-9733" src="/wp-content/uploads/2016/06/logomicro-150x150.png" alt="" width="150" height="150" />MicroServices</a> zijn de manier bij uitstek waarmee we complexe IT systemen kunnen opdelen in vele kleinere en makkelijker onderhoudbare componenten. Ze zorgen ervoor dat we een verzameling van toepassingen kunnen bouwen die allemaal potentieel klant zijn van elkaar en elk hun stukje van het geheel uitvoeren. Daarnaast zijn ze typisch klein en onafhankelijk, waardoor ze ideaal zijn om uitgerold te worden via een container platform.</p>
<h1 style="text-align: justify;">Enabler 4: Event Driven Software Engineering</h1>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-9123" src="/wp-content/uploads/2015/10/event-150x150.png" alt="" width="150" height="150" />Over Events hadden we het al uitgebreid in <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">vorige blogs</a>. In het algemeen merken we dat dit mechanisme aan populariteit wint om een dynamisch en snel veranderende wereld, die continu nieuwe data genereert, te kunnen vatten in IT.</p>
<p style="text-align: justify;">Events lenen zich dan ook heel goed voor het capteren van data: alles wat in een computersysteem binnenkomt, kan namelijk worden gezien als een Event, en het gebruik hiervan als <a href="/geavanceerd-event-driven-engineering/">primaire databron</a> is soms handiger dan wanneer men de ervan afgeleide data zou gaan bewaren. In een overheidscontext zien we bijvoorbeeld de notie van <a href="https://gcn.com/articles/2016/05/24/civic-moments.aspx">civic moments</a> aan belang winnen, hetgeen eigenlijk niet minder dan business Events zijn voor overheidstoepassingen.</p>
<h1 style="text-align: justify;">Enabler 5: Steeds Betere Web Raamwerken</h1>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="alignleft wp-image-7833" src="/wp-content/uploads/2014/12/html5_javascript_js-300x175.png" alt="" width="220" height="132" />Het venster dat de klant krijgt op een IT-toepassing, is de client. Het is dan ook enorm belangrijk dat deze goed is gebouwd en vooral handig is in gebruik. De meeste client toepassingen zijn momenteel webgebaseerd of mobiel, en ook in deze laatste categorie wint webtechnologie gestaag aan belang. Het trio <a href="/html-5-een-rijke-ervaring-zonder-plugins/">Html, Css en Javascript</a> blijft dan ook de manier bij uitstek om een eindgebruikerstoepassing te bouwen, en elk jaar zien we wel een <a href="/de-frameworks-blob/">nieuw raamwerk populair worden</a> in deze wereld; raamwerken die het makkelijker maken om sneller grotere, complexere en mooiere toepassingen te bouwen. Daarnaast wordt deze technologie ook steeds beter ondersteund door de technologie die er aan server-zijde bij komt: we krijgen haast onbeperkte schaalbaarheid en robuustheid wanneer we toestandsloze webtoepassingen gaan hosten op container platformen, gebruik makende van microservices als backend, op hun beurt ontsloten door (vaak <a href="/data-centric-it-met-rest/">RESTful</a>) API&#8217;s (en, waarom niet, werkend via <a href="/javascript-altijd-en-overal/">node.js</a>).</p>
<h1 style="text-align: justify;">Enabler 6: API&#8217;s</h1>
<p style="text-align: justify;"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-10541" src="/wp-content/uploads/2017/02/api-150x150.png" alt="" width="150" height="150" />Het aanbieden van een degelijke API is de ideale manier om de functionaliteiten van een IT systeem beschikbaar te stellen aan andere. API&#8217;s hebben reeds een hele evolutie achter de rug: eerst waren er vooral (taal-specifieke) programmatorische API&#8217;s, daarna werden componenten steeds beter interoperationeel dankzij eerst SOAP-, en daarna REST-gebaseerde API&#8217;s. Momenteel zijn er heuse API Management platformen, die, naast beheer van API&#8217;s, ook voor de interoperabiliteit van heel wat communicatieprotocollen kunnen zorgen.</p>
<p style="text-align: justify;">Via API&#8217;s kan men een sterk hergebruik van data bekomen: gegevens die reeds verwerkt zijn door één toepassing, worden op die manier beschikbaar voor een hele resem andere; vaak zijn dit dan microservices, maar ook frequent client-toepassingen op het web. De API&#8217;s worden bovendien vaak ook aangeboden aan derde partijen en daarbij soms ook gemonetariseerd. Uiteindelijk <a href="/data-centric-it-met-rest/">ontstaat er een hele &#8220;API Economy&#8221;</a>: meer en meer toepassingen ontstaan eenvoudigweg doordat de data die ze nodig hebben, reeds beschikbaar is, en makkelijk consumeerbaar via zo&#8217;n API.</p>
<h1 style="text-align: justify;">De Vortex</h1>
<p style="text-align: justify;">De relaties tussen de verschillende opgesomde technologische evoluties hier beschreven, zijn duidelijk waar te nemen: dit blijkt reeds uit de tekst. Op dit moment hebben we dan ook een unieke smeltkroes: de effecten van deze <em>enablers</em> op software engineering versterken elkaar, en vormen zo het fundament van de vele zaken die er bovenop worden gebouwd: de digitale economie.</p>
<p style="text-align: justify;"><a href="/wp-content/uploads/2017/02/vortex.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-10542" src="/wp-content/uploads/2017/02/vortex.png" alt="" width="762" height="608" srcset="https://www.smalsresearch.be/wp-content/uploads/2017/02/vortex.png 762w, https://www.smalsresearch.be/wp-content/uploads/2017/02/vortex-300x239.png 300w" sizes="auto, (max-width: 762px) 100vw, 762px" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Van Chipkaart naar Smartphone naar&#8230; Arm?</title>
		<link>https://www.smalsresearch.be/van-chipkaart-naar-smartphone-naar-arm/</link>
					<comments>https://www.smalsresearch.be/van-chipkaart-naar-smartphone-naar-arm/#comments</comments>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 20 Sep 2016 08:01:01 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Data Integration]]></category>
		<category><![CDATA[egov]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[onlyonce]]></category>
		<category><![CDATA[open data]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[smartcard]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<guid isPermaLink="false">/?p=9881</guid>

					<description><![CDATA[Er was eens&#8230; een metrorit. En voor metroritten heb je tegenwoordig een MOBIB-kaart nodig. Dit deed me terugdenken aan het verhaal van de smartcards, en hoe we er veel te veel nodig hebben&#8230; Bij deze dan het lang&#160;beloofde&#160;derde deel van dat verhaal. Over Metro- en Treinkaarten Onlangs moest ik na lange tijd nog eens de [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignleft"><a href="/wp-content/uploads/2016/09/evolution.jpg"><img loading="lazy" decoding="async" width="150" height="150" src="/wp-content/uploads/2016/09/evolution-150x150.jpg" alt="evolution" class="wp-image-9993"/></a></figure>



<p>Er was eens&#8230; een metrorit. En voor metroritten heb je tegenwoordig een MOBIB-kaart nodig. Dit deed me terugdenken aan het verhaal van de smartcards, en hoe we er veel te veel nodig hebben&#8230; Bij deze dan het lang&nbsp;beloofde&nbsp;derde deel van dat verhaal.</p>



<span id="more-9881"></span>



<h2 class="wp-block-heading">Over Metro- en Treinkaarten</h2>



<p>Onlangs moest ik na lange tijd nog eens de metro nemen. Ik wist dat mijn papieren kaartje met magneetstrip ondertussen niet meer geldig zou zijn: de overschakeling naar <a href="https://www.stib-mivb.be/mobib.html?l=en">MOBIB</a>&nbsp;is nu volledig doorgevoerd. De MOBIB-kaart is RFID technologie, waardoor je ze kan gebruiken door ze gewoon tegen een kaartlezer tegen te houden (je hoeft ze nergens in te steken). Meer over deze technologie kan je terugvinden in één van onze techno&#8217;s: <a href="/publications/document/?docid=86">Het ABC van RFID</a>.</p>



<p>Nu, ik heb reeds een treinabonnement, en ook dit staat op een MOBIB-kaart&#8230; van de NMBS. Ik moest er dus achter zien te komen of ik deze ook voor de metro kon gebruiken. Na wat zoekwerk, zag ik dat ik online een <a href="https://www.stib-mivb.be/mystib/Account/Register?l=en">account kon aanmaken bij de MIVB</a> en dat ik een bestaande MOBIB-kaart kon koppelen aan mijn account. Wanneer ik dit echter probeerde, wist het systeem mij te vertellen dat mijn kaart niet gekend was, maar dat dit wel het geval zou zijn indien ik deze eerst kon opladen via één van de <a href="https://www.stib-mivb.be/points-de-vente-verkooppunten.html?l=en&amp;news_rid=/STIB-MIVB/INTERNET/ACTUS/2007-06/WEB_Article_1181575177670.xml">GO-machines</a> in de metrostations.</p>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2016/09/kaarttoevoegen.png"><img loading="lazy" decoding="async" width="905" height="399" src="/wp-content/uploads/2016/09/kaarttoevoegen.png" alt="kaarttoevoegen" class="wp-image-9985" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoevoegen.png 905w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoevoegen-300x132.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoevoegen-768x339.png 768w" sizes="auto, (max-width: 905px) 100vw, 905px" /></a></figure>



<p></p>



<p>Zo gezegd zo gedaan, en &#8211; wonder boven wonder? &#8211; dit werkte inderdaad zoals aangegeven: ik kon mijn NMBS-kaart gebruiken als houder voor het saldo van mijn metroritten, en ik kon deze kaart daarna ook effectief koppelen aan mijn online profiel bij MIVB. (Eén mankement: het resterend saldo aan ritten is niet zichtbaar; maar misschien is dit ook voor de eigen kaarten van MIVB geen feature? &#8211; graag een comment indien iemand dit weet!)</p>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2016/09/kaarttoegevoegd1.png"><img loading="lazy" decoding="async" width="776" height="501" src="/wp-content/uploads/2016/09/kaarttoegevoegd1.png" alt="kaarttoegevoegd1" class="wp-image-9991" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoegevoegd1.png 776w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoegevoegd1-300x194.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/09/kaarttoegevoegd1-768x496.png 768w" sizes="auto, (max-width: 776px) 100vw, 776px" /></a></figure>



<p></p>



<p>Wat leren we nu uit dit verhaal?</p>



<ul class="wp-block-list">
<li>Ten eerste, de technologische mogelijkheden om het probleem van het <a href="/help-mijn-portefeuille-is-te-dik/">teveel aan kaarten in mijn portefeuille</a> op te lossen, zijn reeds duidelijk aanwezig, maar, gezien het aantal kaarten dat ik nog nodig heb, is er nog geen verregaande implementatie gebeurd (zo is mijn abonnement bij De Lijn, verkregen via NMBS, nog steeds een stukje papier, en een koppeling met bijvoorbeeld de <a href="https://eid.belgium.be/en">Belgische eID</a> is nog steeds beperkt tot de occasionele <a href="https://www.belgianrail.be/en/customer-service/where-to-buy-my-tickets/buy-ticket-mobile.aspx">online aankoop</a> van een treinticket). Conclusie: nog steeds geen <a href="/one-card-to-rule-them-all/">one card to rule them all&#8230;</a></li>



<li>Ten tweede: de netwerken van MIVB en NMBS zijn voorlopig nog onvoldoende geïntegreerd om reeds bij de aanmaak van een nieuwe kaart bij één firma, rechtstreeks ook de nodige gegevens te versturen aan de andere. Op zich is dit soort integratie misschien nogal veeleisend, maar in deze nieuwe wereld van de IT, met zijn <a href="/disruptie-in-de-cloud-stack-caas/">Cloud</a>, zijn <a href="/van-n-tier-naar-microservices/">microservices</a>, en vooral, zijn <a href="/data-centric-it-met-rest/">API economy</a>, zijn er toch wel een aantal <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">architecturen</a> te bedenken waarin dit geen probleem zou mogen zijn. Het &#8220;<a href="https://joinup.ec.europa.eu/event/egovernment-and-reduction-administrative-burden-applying-%C3%A2%E2%82%AC%CB%9Conce-only%C3%A2%E2%82%AC%E2%84%A2-principle">only once principe</a>&#8221; is echter vaak meer een verhaal van politiek en economie, dan van technologie.</li>
</ul>



<h2 class="wp-block-heading">&#8220;Card Management as a Service&#8221;</h2>



<figure class="wp-block-image alignright"><a href="/wp-content/uploads/2016/09/wernervoegls.jpg"><img loading="lazy" decoding="async" width="300" height="225" src="/wp-content/uploads/2016/09/wernervoegls-300x225.jpg" alt="wernervoegls" class="wp-image-9986" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/09/wernervoegls-300x225.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2016/09/wernervoegls.jpg 638w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<p>Ik zou hier graag reeds even vooruitblikken op een toekomstige blog, waarin ik de voordelen van een gescheiden beheer van gegevensnetwerken versus er van gebruik makende&nbsp;toepassingen wil toelichten: Stel dat we één instelling hadden die het beheer van de kaarten en de&nbsp;ermee gepaard gaande gegevens, netwerken en basisdiensten op zich nam, en dat de andere bedrijven, zoals de vervoersmaatschappijen in kwestie, van deze diensten gebruik maakten. Dit zou ervoor zorgen dat alles wat met kaarten te maken had, efficiënter zou kunnen worden gemaakt wegens schaalvoordelen, én dat de vervoersmaatschappijen zelf deze verantwoordelijkheid niet meer hoefden te dragen. Dit is eigenlijk precies één van de belangrijke verwezenlijkingen van <a href="/cloud-metaforen-elektriciteit-goud/">Cloud</a>, en, meer in het bijzonder, het &#8220;<a href="/as-a-service-een-waaier-aan-mogelijkheden/">as a Service</a>&#8221; verhaal, maar dan toegepast op <a href="/escroqueries-carte-bancaire/">chipkaarten</a>. Daarnaast kan men het ook bekijken in een microservices en API context (&#8220;you build it, you run&nbsp;it&#8221;).</p>



<p>Hierover dus later meer.&nbsp;Waar ik het nu verder over wil hebben is de toekomst&#8230;</p>



<h2 class="wp-block-heading">De Nabije Toekomst?</h2>



<p>Vandaag is het reeds mogelijk om met je <a href="/een-smartphone-of-tablet-als-eindejaarscadeau/">smartphone</a> vervoersbewijzen aan te kopen, betalingen te doen, ja, zelfs jezelf te <a href="/kan-ik-met-csam-mobiel-authenticeren/">identificeren voor gebruik van overheidstoepassingen</a>. Een toekomst waarin we geen kaarten meer nodig hebben, maar waarin deze volledig zijn vervangen door de smartphone, is dus zeker technisch realiseerbaar, en op lange termijn misschien zelfs realistisch. Het belangrijkste probleem hierbij is er één dat slechts langzaamaan kan worden opgelost: de logistiek van het on-boarden van alles en iedereen die nu nog met kaarten werkt, en van alles en iedereen die nu nog geen smartphone heeft. In een nog verdere toekomst zullen we misschien zelfs de portefeuille in zijn geheel kunnen afschaffen, indien we dit ook met <a href="https://deredactie.be/cm/vrtnieuws/economie/1.2558162">het systeem van cash geld</a> zouden doen!</p>



<h2 class="wp-block-heading">Science Fiction</h2>



<p>Wat als we dan nog eens een paar decennia verder in de toekomst kijken? We zien reeds nu zaken opduiken als <a href="/biometrie-eindelijk-gedaan-met-paswoorden-onthouden/">bio-authentication</a>, waarbij we onze vingerafdrukken, stem, gezicht, of zelfs <a href="/gedragsbiometrie-als-basis-voor-impliciete-authenticatie/">context</a> gebruiken om te authenticeren. Daarnaast doet men ook gericht onderzoek naar nanotechnologie, robotica, <a href="/watson-revisited/">artificiële intelligentie</a>, <a href="/er-zit-een-hacker-in-mijn-diepvries/">Internet of Things</a>, &#8230; Allemaal zaken die ervoor zorgen dat technologie en ons lichaam steeds dichter bij elkaar komen en uiteindelijk zelfs kunnen worden&nbsp;<a href="https://en.wikipedia.org/wiki/Biomechatronics">samengevoegd</a>.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="The Cicret Bracelet (Concept video)" width="500" height="281" src="https://www.youtube.com/embed/9J7GpVQCfms?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p>Uiteindelijk zou het dan mogelijk worden dat de smartphone wordt vervangen door een scherm op de huid van onze <strong><em>arm </em></strong><em>(zie filmpje hierboven voor wat binnenkort al kan!)</em>, met alle nodige technologie netjes verborgen aan de binnenkant van ons lichaam! Sterker nog: het scherm zou evengoed virtueel voor onze ogen kunnen worden getoverd, dankzij technologie rechtstreeks in onze ogen of hersenen. Op die manier hebben we niets meer nodig: al het nodige dragen we steeds met ons mee, zoals we dat met ons lichaam doen. En onszelf identificeren om ons vervoersbewijs te <a href="https://1.bp.blogspot.com/-fZhj_ikcrdE/Tg99qyIMheI/AAAAAAAADN4/vNgts2y1qfc/s1600/These%2BArent%2BThe%2BDroids%2BYoure%2BLooking%2BFor%2B006.jpg">legitimiseren, doen we door eens te wuiven</a>.</p>



<p>Op zich een groot gemak, maar uiteraard is hier ook een duistere zijde aan verbonden: het zou wel eens heel moeilijk kunnen worden om &#8220;off-the-grid&#8221;, of &#8220;offline&#8221; te gaan, of om zonder al deze technologische snufjes te kunnen. Sterker nog: we zouden Big Brother scenario&#8217;s kunnen krijgen, of een regelrecht doembeeld, zoals in de film &#8220;<a href="https://www.imdb.com/title/tt1637688/">In Time</a>&#8220;.&nbsp;Maar goed: wat er met een technologie gedaan wordt, staat los van de technologie zelf (ook met een eenvoudige hamer kan je zowel bouwen als verwonden).</p>



<h2 class="wp-block-heading">Besluit</h2>



<p>Er staan ons nog een aantal wonderlijke technologische evoluties&nbsp;te wachten, maar er blijft vooral nog veel werk aan de winkel wat betreft het vereenvoudigen van het leven van de gewone burger, met al zijn chipkaarten, zijn smartphone en zijn muntjes van twee eurocent, en van alle administratie die daarbij komt kijken. Samenwerking, integratie, en het zo breed mogelijk invoeren van het <em>only once principe</em>&nbsp;zijn de boodschap.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/van-chipkaart-naar-smartphone-naar-arm/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Van N-tier naar MicroServices</title>
		<link>https://www.smalsresearch.be/van-n-tier-naar-microservices/</link>
					<comments>https://www.smalsresearch.be/van-n-tier-naar-microservices/#comments</comments>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Wed, 08 Jun 2016 07:00:37 +0000</pubDate>
				<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[methodology]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[N-tier]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Software architectures]]></category>
		<category><![CDATA[software design]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">/?p=9702</guid>

					<description><![CDATA[Het opdelen van een applicatie in apart uitrolbare componenten is reeds lang een kwestie van relatief grote &#8220;tiers&#8221;. Van zuiver monolithische applicaties zijn we gedurende de voorbije decennia langzaamaan geëvolueerd, via 2-tier en 3-tier applicaties, naar N-tier. Tegenwoordig neemt deze evolutie extremere vormen aan: applicaties bestaan uit steeds meer en steeds kleinere componenten, die uiteindelijk [&#8230;]]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><a href="/wp-content/uploads/2016/06/logomicro.png" rel="attachment wp-att-9733"><img loading="lazy" decoding="async" class="alignleft size-thumbnail wp-image-9733" src="/wp-content/uploads/2016/06/logomicro-150x150.png" alt="logomicro" width="150" height="150" /></a>Het opdelen van een applicatie in apart uitrolbare componenten is reeds lang een kwestie van relatief grote &#8220;tiers&#8221;. Van zuiver monolithische applicaties zijn we gedurende de voorbije decennia langzaamaan geëvolueerd, via 2-tier en 3-tier applicaties, naar N-tier. Tegenwoordig neemt deze evolutie extremere vormen aan: applicaties bestaan uit steeds meer en steeds kleinere componenten, die uiteindelijk tot <em>microservices</em> evolueren.</p>
<p style="text-align: justify;"><span id="more-9702"></span>Op termijn kan <a href="https://searchsoa.techtarget.com/answer/Microservices-architecture-101-What-the-heck-is-it">deze architecturale stijl</a> de grenzen tussen verschillende applicaties gaan vervagen, om ze te transformeren tot een applicatie-ecosysteem bestaande uit vele herbruikbare, onafhankelijk uitrolbare en afzonderlijk schaalbare componenten.</p>
<h2 style="text-align: justify;">De Geschiedenis van &#8220;Tiers&#8221;</h2>
<p style="text-align: justify;">De meest traditionele applicaties zijn <a href="https://en.wikipedia.org/wiki/Monolithic_application">monolithisch</a>: één programma dat al zijn functies vervult zonder afhankelijk te zijn van externe hulpmiddelen. Lang geleden werden de meeste applicaties op deze manier gebouwd, en vandaag zijn heel wat desktop applicaties hier nog steeds voorbeelden van. Met de opkomst van netwerken en Database Management Systemen (DBMS), werd echter voor vele applicaties een meer component-gebaseerde uitrol nodig. Voor een gedistribueerde applicatie werd het b.v. nodig om een &#8220;client&#8221; en een &#8220;server&#8221; of &#8220;backend&#8221; te hebben, om op die manier een gebruiker toe te laten de applicatie op een andere plaats (op een andere machine) te gebruiken dan de plaats waar de kern van de applicaties zich bevindt (meestal ook met het doel om meerdere gebruikers gelijktijdig van de applicatie gebruik te kunnen laten maken). Dit wordt de &#8220;<a href="https://en.wikipedia.org/wiki/Client%E2%80%93server_model">client-server</a>&#8221; of &#8220;2-tier&#8221; architectuur genoemd. Voor applicaties, die aan geavanceerde I/O doen, werd het daarnaast ook noodzakelijk om de verantwoordelijkheid hiervoor bij een DBMS te leggen. Dit systeem wordt dan de &#8220;data tier&#8221; van de applicatie.</p>
<p style="text-align: justify;">Uiteraard leidden deze twee architecturen reeds snel tot de zogenaamde &#8220;<a href="https://en.wikipedia.org/wiki/Multitier_architecture">3-tier</a>&#8221; architectuur, met een client tier en een backend die werd gesplitst in een tier voor de business logic en een data tier. Tegenwoordig zijn er vaak nog meer opsplitsingen mogelijk. In de context van web-applicaties zal men b.v. de client tier nog in twee delen splitsen: de eigenlijke client in de browser, en een &#8220;web tier&#8221; om de client via het web te kunnen aanbieden. Men zou deze laatste zelfs nog kunnen opdelen in aparte servers voor het statische en dynamische gedeelte van de applicatie. Ook wordt het mogelijk dat een applicatie meerdere verschillende databronnen gebruikt, of dat haar business logica verdeeld geraakt over meerdere tiers (b.v. <a href="https://programmers.stackexchange.com/questions/140999/application-layer-vs-domain-layer">application logic vs domain logic</a>). Langzaamaan verdwijnt dan ook de notie van tiers (waarbij men een min of meer hiërarchische en lineaire relatie verwacht tussen de componenten), om plaats te maken voor een flexibeler systeem, waarbij de communicatie flexibeler vormen kan aannemen&#8230;</p>
<p><figure id="attachment_9723" aria-describedby="caption-attachment-9723" style="width: 896px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2016/06/drietier.png" rel="attachment wp-att-9723"><img loading="lazy" decoding="async" class="size-full wp-image-9723" src="/wp-content/uploads/2016/06/drietier.png" alt="Van links naar rechts: een monolithische applicatie, een 2-tier, en een 3-tier applicatie." width="896" height="485" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/drietier.png 896w, https://www.smalsresearch.be/wp-content/uploads/2016/06/drietier-300x162.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/06/drietier-768x416.png 768w" sizes="auto, (max-width: 896px) 100vw, 896px" /></a><figcaption id="caption-attachment-9723" class="wp-caption-text">Van links naar rechts: een monolithische applicatie, een 2-tier, en een 3-tier applicatie.</figcaption></figure></p>
<h2 style="text-align: justify;">Tiers of Lagen?</h2>
<p style="text-align: justify;">De opdeling in tiers klinkt allicht bekend in de oren voor wie reeds met software architectuur bezig is, en doet ook denken aan de opdeling van een applicatie in lagen (&#8220;layers&#8221;). De beide termen, <a href="https://blogs.msdn.microsoft.com/jmeier/2008/09/05/layers-and-tiers/">tiers en layers</a>, worden soms zelfs als <a href="https://stackoverflow.com/questions/6978991/what-is-the-difference-between-tier-vs-layer-application">synoniemen</a> beschouwd (zuiver taalkundig zijn ze dat ook, en in het Nederlands kunnen we ze beide vertalen als &#8220;<a href="https://stackoverflow.com/questions/120438/whats-the-difference-between-layers-and-tiers">lagen</a>&#8220;). Dit is logisch: er is een grote <a href="https://www.codeproject.com/Tips/277818/Difference-in-layer-and-tier-architecture">similariteit</a> tussen deze beide concepten, en bijgevolg is er dus enige verwarring aanwezig.</p>
<p style="text-align: justify;">Lagen voorzien in een logische scheiding binnen de architectuur van een applicatie, waarbij het zaak is om tussen deze lagen, die functioneel gezien zo coherent mogelijk moeten zijn, een zo groot mogelijke onderlinge onafhankelijkheid te creëren (het zogenaamde &#8220;<a href="https://en.wikipedia.org/wiki/Loose_coupling">loskoppelen</a>&#8220;). Ze hebben eerder als doel om functionele belangen (user interface (UI), applicatielogica, business logica, data access, etc.) gescheiden te houden en de applicatie aldus makkelijker onderhoudbaar te maken op lange termijn, doordat deze belangen apart benaderd kunnen worden. Tiers daarentegen, zijn fysiek gescheiden onderdelen van een applicatie, die apart van elkaar worden ontplooid, waardoor ze niet alleen het aparte onderhoud en de aparte ontwikkeling verder doortrekken, maar ook apart hergebruiken en schalen mogelijk maken.</p>
<p style="text-align: justify;">De verwarring tussen de beide concepten ontstaat allicht omdat de logische layers in de praktijk zeer vaak corresponderen met de fysieke tiers: de UI zit in de client tier, de business logica zit in de logic tier, en de database-laag komt overeen met de data tier. De scheiding in losgekoppelde lagen is daarnaast de ideale manier om ervoor te zorgen dat tiers los van elkaar kunnen worden gedeployed. Daarenboven wordt het onderscheid ook vervaagd in de context van de Cloud: Tiers zijn dan wel fysiek gescheiden, maar door het gebruik van Cloud-technologie (<a href="/kosten-besparen-in-de-cloud/">IaaS</a> of <a href="/productiviteitsverhoging-met-paas/">PaaS</a>) kunnen ze evenwel worden gehost op dezelfde fysieke of zelfs virtuele machine. Ze zouden eenvoudig in verschillende <a href="/disruptie-in-de-cloud-stack-caas/">Containers</a> kunnen worden geplaatst (zij het JEE, Docker of andere containers).</p>
<p style="text-align: justify;">Om te besluiten: layers vormen dus de bouwstenen van een applicatie op een logische manier, en beïnvloeden sterk de architectuur en het design ervan. Tiers, op hun beurt, definiëren de opdeling van een applicatie in onafhankelijk uitrolbare componenten. Ze hebben ook een sterke impact op de architectuur, maar eerder op het niveau van de interacties tussen de applicatie en andere systemen binnen een groter geheel, en op het niveau van de infrastructuur. Tiers kunnen moeilijk zonder layers: het loskoppelen van delen van de applicatie is nodig om ze apart te kunnen uitrollen. Beide zijn onontbeerlijk om de complexiteit van een applicatie in beheersbare blokken op te delen.</p>
<h2 style="text-align: justify;">Richting Microservices</h2>
<p style="text-align: justify;">Over de interessante evoluties binnen applicatie-architectuur en lagen, kunnen we in de toekomst nog een blog schrijven. Vandaag ligt de focus op tiers, en hoe het opsplitsen van een applicatie in componenten en diensten verregaande gevolgen kunnen hebben voor applicatie-ecosystemen.</p>
<hr />
<p style="padding-left: 60px; text-align: justify;">Ik heb het reeds in <a href="/data-centric-it-met-rest/">verscheidene</a> <a href="/html-5-een-rijke-ervaring-zonder-plugins/">blogs</a> over <strong>applicatie-ecosystemen</strong> gehad, maar nagelaten het concept eenduidig te definiëren. Bij deze dan een poging tot definitie:</p>
<blockquote>
<p style="padding-left: 60px; text-align: justify;">Een ecosysteem van applicaties is een groep applicaties (en gerelateerde IT entiteiten) die werken rond een gelijkaardig business domein, of die toebehoren aan eenzelfde organizatie (of beide). Soms betreft het zelfs groepen van applicaties die rond verschillende maar gerelateerde business domeinen werken. Typisch verwerken ze dezelfde of sterk gerelateerde gegevens, en vrij vaak interageren ze ook met elkaar, en/of worden ze gebruikt door dezelfde groep van eindgebruikers.</p>
</blockquote>
<p style="padding-left: 60px; text-align: justify;">Hieruit volgt dat binnen een applicatie-ecosysteem er een groot potentieel (!) bestaat voor hergebruik. Of dit potentieel effectief wordt gehaald, hangt sterk af van gemaakte keuzes betreffende <a href="https://searchsoa.techtarget.com/tip/Designing-a-modern-enterprise-architecture">enterprise</a>, <a href="https://martinfowler.com/articles/microservices.html">applicatie</a> en systeem-architectuur.</p>
<hr />
<p style="text-align: justify;">Een kritiek die is komen te ontstaan op de N-tier architectuur, is dat een applicatie nog steeds te geïsoleerd en self-contained is: alle business-logica zit vaak in één tier, alle persistentie-logica in een andere, etc. Men zou zelfs kunnen zeggen dat we de monolithische applicatie hebben vervangen door monolithische tiers! En dit terwijl applicaties steeds complexer worden en verregaandere behoeften hebben, zoals de integratie van business rules, taakbeheer en workflows; allemaal zaken die zo complex zijn, dat ze al een toepassing op zichzelf kunnen vormen.</p>
<p style="text-align: justify;"><a href="https://en.wikipedia.org/wiki/Service-oriented_architecture">Service Oriented Architecture</a> (SOA) is een stap in de goede richting, maar historisch gezien richt deze methodiek zich op interacties tussen verschillende applicaties, binnen het ruimere opzicht van enterprise architectuur. Microservices nemen de ideeën van N-tier en SOA samen, en drijven ze naar een nieuw summum: elke aparte applicatie wordt nu beschouwd als zijn eigen mini-ecosysteem van onafhankelijk uitrolbare diensten, zich elk focussend op een verschillende business capabiliteit, zo klein gemaakt als maar kan (vandaar &#8220;micro&#8221;), en met zo min mogelijk gecentraliseerde orchestratie. Meestal heeft elke microservice &#8211; indien deze nood heeft aan persistentie &#8211; ook zijn eigen database (of een ander soort persistentiesysteem), die enkel en alleen voor deze microservice wordt ingeschakeld.</p>
<p style="text-align: justify;">Deze stijl <a href="https://searchcloudapplications.techtarget.com/feature/How-microservices-bring-agility-to-SOA">verhoogt sterk de Agility van SOA</a>: de kleinere services kunnen meer cohesief op zichzelf staan, en intern zijn ze meestal ook eenvoudiger dan volledige applicaties typisch zijn. Daarnaast kunnen onderhoud en evolutie van alle microservices apart van elkaar worden beheerd. Dit alles maakt dat deze aparte microservices makkelijker te bouwen en onderhouden zijn dan de volledige applicatie (uiteraard kruipt er wel enig werk in het op een goede manier opdelen van de applicatie in verschillende microservices). Men kan zelfs zo ver gaan als volledige microservices te vervangen door nieuwere en betere: indien ze klein genoeg zijn, kan de kost gerechtvaardigd zijn om een dergelijk stuk software &#8211; huiver &#8211; weg te gooien.</p>
<p style="text-align: justify;">Daarnaast wordt het voor ontwikkelteams ook mogelijk om flexibeler te kiezen welke technologie, welke talen en welke raamwerken ze zullen gebruiken om hun specifieke microservice zo optimaal mogelijk te implementeren. Ze zouden Java, Node.js, of eender welke andere technologie kunnen kiezen, zo lang ze maar overeenkomen over een gestandaardiseerd communicatiekanaal. Dit kanaal, op zijn beurt, zien we meer en meer evolueren richting <a href="/data-centric-it-met-rest/">RESTful APIs</a>: een robuuste de facto standaard.</p>
<p style="text-align: justify;">Deze evolutie wordt verder nog <a href="https://www.slideshare.net/dberkholz/how-microservices-are-redefining-modern-application-architecture">versterkt door de opkomst van Container technologie</a>: deze zijn de infrastructuurplatformen van de toekomst (of zelfs al van vandaag), en zijn &#8220;lichter&#8221; en makkelijker inzetbaar dan virtuele machines, waardoor het kosten-effectief wordt om een groter aantal kleinere services te hosten i.p.v. een klein aantal zwaardere applicatie(s)(-tiers). De beide technologische evoluties werken op die manier hand in hand om de schaalbaarheid van applicaties te verbeteren op een fijnmazig niveau: elke microservice kan onafhankelijk van de andere worden geschaald, en via <a href="https://en.wikipedia.org/wiki/Operating-system-level_virtualization">containers </a>kan er voor worden gezorgd dat de eronder liggende infrastructuur, gebruikt door het geheel aan services, een betere match vormt met het evoluerend verbruikspatroon.</p>
<p><figure id="attachment_9977" aria-describedby="caption-attachment-9977" style="width: 380px" class="wp-caption alignright"><a href="/wp-content/uploads/2016/06/ntiercorrected.png" rel="attachment wp-att-9727"><img loading="lazy" decoding="async" class="wp-image-9977" src="/wp-content/uploads/2016/06/ntiercorrected.png" width="380" height="447" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/ntiercorrected.png 597w, https://www.smalsresearch.be/wp-content/uploads/2016/06/ntiercorrected-255x300.png 255w" sizes="auto, (max-width: 380px) 100vw, 380px" /></a><figcaption id="caption-attachment-9977" class="wp-caption-text">Een N-tier applicatie die evolueert richting microservices: de applicatielogica zit in een aparte &#8220;tier&#8221;, of nog: de applicatielogica wordt aan de client aangeboden als een aparte service. Deze maakt op zijn beurt gebruik van een business logic tier, of nog: van business logic services. Onderaan staan dan de tiers of diensten die de entiteiten van de business (het domein) ondersteunen en persisteren.</figcaption></figure></p>
<p style="text-align: justify;">Microservices maken het <a href="https://bit.ly/1O7vbWA">mogelijk voor een organizatie om meer Agile te werken</a> en cross-functionele teams te bouwen, gefocust op business capabiliteiten, i.p.v. teams gefocusd op specifieke IT functies (UI specialisten, middleware specialisten, DBA&#8217;s, &#8230;). Wanneer een applicatie monolithisch wordt gebouwd, is er vaak veel heen-en-weer &#8220;gedoe'&#8221; tussen verschillende teams nodig om cross-functionele zaken te implementeren, met het gevaar dat business logica doorsijpelt op plaatsen waar deze niet hoort te zitten (b.v. in de UI of de data laag). Een meer expliciete scheiding van de applicatie in service componenten maakt de grenzen duidelijker, zowel tussen de microservices als tussen de teams die ze implementeren, waardoor er meer onafhankelijkheid in het implementatieproces kan worden gestopt. Een meer <a href="https://www.infoworld.com/article/3044726/application-development/succeeding-in-the-continuous-enterprise-with-microservices.html">servicegericht model van samenwerking</a> wordt op deze manier mogelijk: teams worden klant van elkaar omdat hun producten klant zijn van elkaar.</p>
<h2 style="text-align: justify;">Ecosystemen van Services</h2>
<p style="text-align: justify;">Binnen een applicatie-ecosysteem van enige omvang, is er <a href="https://www.ibm.com/developerworks/websphere/library/techarticles/1503_clark/1305_clark.html">altijd al op vele niveau&#8217;s de nood geweest aan integraties</a>. Met een beetje geluk waren deze integraties gekend wanneer een applicatie werd gebouwd, maar vaak is het echter zo dat de nood aan integratie achteraf ontstaat, wanneer een applicatie reeds enige tijd in productie is. Integraties komen ook voor op het UI niveau, waar ze leiden tot portaal technologie en integration-at-the-glass. Of ze komen voor op het niveau van de data, wat vaak tot gevolg heeft dat een database wordt gedeeld tussen verschillende applicaties. Er zijn reeds verdienstelijke pogingen gedaan om al deze integraties op te vangen via middleware, maar zelfs de alomtegenwoordige <a href="https://en.wikipedia.org/wiki/Enterprise_service_bus">Enterprise Service Bus</a> (ESB) is geen panacee.</p>
<p style="text-align: justify;">We kunnen nooit vrij zijn van de onverwachtheid van sommige integratie-behoeftes, maar microservices kunnen een aantal van de moeilijkheden helpen verminderen. Enerzijds komt dit door de standaardisatie van de communicatie tussen microservices. Anderzijds doordat business capabiliteiten dankzij deze architectuur worden opgedeeld in kleinere stukken, wordt het makkelijker om een component te gaan hergebruiken in een andere applicatie, en deze apart te schalen indien hij daardoor zwaarder belast wordt. Bovendien kunnen we applicaties op zo&#8217;n manier opsplitsen, dat hergebruik wordt aangemoedigd: er zullen enerzijds applicatiespecifieke microservices deel uitmaken van een applicatie, maar anderzijds zullen er ook microservices zijn die een bepaalde business problematiek of capabiliteit ondersteunen, die onafhankelijk is van applicatielogica; deze laatste zijn vaak in meerdere toepassingen nuttig. Verder kunnen we ook nog microservices hebben die verantwoordelijk zijn voor een bepaald deel van de persistentie-behoeften van de applicatie. Services zo klein dat ze data betreffen die ook door andere applicaties gebruikt wordt. Deze &#8220;data services&#8221; zullen de poortwachters zijn van de data: zij encapsuleren de databases (of maken deel uit van een algemenere <a href="https://en.wikipedia.org/wiki/Data_as_a_service">Data as a Service</a> aanpak) en hebben meerdere applicaties als klant.</p>
<p style="text-align: justify;">Uiteindelijk leidt deze opdeling in services tot een heel ander ecosysteem: niet één van monolithische of tiered applicaties, maar één van intergeconnecteerde microservices. En deze grote groep microservices kan dan &#8220;ten dienste&#8221; staan van specifieke &#8220;client&#8221;-componenten die een UI bevatten en dus de gebruikers toelaten dit ecosysteem te gebruiken op verschillende manieren. Dezelfde achterliggende dienst kan bijvoorbeeld een rol spelen binnen een web-toepassing, maar ook in een mobiele toepassing.</p>
<p><figure id="attachment_9728" aria-describedby="caption-attachment-9728" style="width: 1010px" class="wp-caption aligncenter"><a href="/wp-content/uploads/2016/06/microservices.png" rel="attachment wp-att-9728"><img loading="lazy" decoding="async" class="size-full wp-image-9728" src="/wp-content/uploads/2016/06/microservices.png" alt="captie" width="1010" height="746" srcset="https://www.smalsresearch.be/wp-content/uploads/2016/06/microservices.png 1010w, https://www.smalsresearch.be/wp-content/uploads/2016/06/microservices-300x222.png 300w, https://www.smalsresearch.be/wp-content/uploads/2016/06/microservices-768x567.png 768w" sizes="auto, (max-width: 1010px) 100vw, 1010px" /></a><figcaption id="caption-attachment-9728" class="wp-caption-text">Een fictief voorbeeld van een microservice applicatie-ecosysteem, conceptueel voorgesteld. Bovenaan zijn er meerdere eindgebruikers-componenten, die een UI bevatten (de clients). Deze maken gebruik van onderliggende microservices die bepaalde functionaliteiten (b.v. &#8220;plaats een product in een winkelmandje&#8221;) ondersteunen en zo samen de applicatielogica van een applicatie vormen. Op hun beurt maken deze diensten gebruik van allerlei services die de business capabiliteiten, onafhankelijk van applicaties, ondersteunen (b.v. &#8220;plaats een bestelling&#8221;). Deze laatste maken dan weer gebruik van business diensten van een lager niveau: diensten die het beheer op zich nemen van de specifieke business entiteiten (zoals &#8220;klant&#8221;, &#8220;bestelling&#8221;, &#8220;factuur&#8221;). Op het laagste niveau krijgen we een eerder technische dienstverlening (b.v. &#8220;database voor klantgegevens&#8221;). Het komt in deze tekening niet veel voor, maar het is niet verboden dat diensten in een bepaalde laag gebruik maken van diensten die zich niet in de laag er direct onder bevinden. Deze opdeling in lagen is in principe ook slechts een voorbeeld; er zijn mogelijk nog andere manieren om de microservices te klassificeren. (In de tekening is met gekleurde bolletjes aangeduid welke microservices uiteindelijk deel uitmaken van welke applicatie.)</figcaption></figure></p>
<p style="text-align: justify;">Eén probleem is dat deze sterke interconnectiviteit tussen een steeds groter wordende groep microservices kan gaan lijken op een onbeheersbaar kluwen (zogenaamde point-to-point integraties). Er zijn echter een paar zaken die dit effect tegengaan:</p>
<ul style="text-align: justify;">
<li>Enerzijds is de point-to-point integratie slechts een integratie op conceptueel niveau. Op technisch vlak zal dit worden opgevangen door middleware-technologie, zoals de ESB. Zolang een dienst een logisch en leesbaar adres heeft, kan deze op die manier worden aangesproken. De werkelijke localisering en verbinding is de verantwoordelijkheid van een onderliggend platform.</li>
<li>Daarnaast kan men ook twee reeds eerder besproken principes toepassen: die van <a href="/data-centric-it-met-rest/">Data-Centric IT</a>, en die van <a href="/het-event-als-leidend-voorwerp-in-software-engineering/">Event-Driven Architecture</a>. Deze zijn compatibel met elkaar en met Microservices, en zorgen samen voor een beheersbaar &#8220;inter-service&#8221; communicatiemodel: samen kunnen deze methodieken er namelijk voor zorgen dat een dienst enkel moet weten welke data en events er nodig zijn en hoe deze kunnen worden geadresseerd. Er zijn uiteraard nog externe zaken nodig die geen data of Event zijn, maar dit zijn dan meestal generieke en nuttige diensten, zoals het genereren van pdf&#8217;s of het aanroepen van eerder technische capabiliteiten, zoals authenticatie of logging.</li>
<li>Ten slotte komen er specifiek voor deze problematiek ook oplossingen te voorschijn onder de noemer van <a href="https://techcrunch.com/2012/11/11/5-rules-for-api-management/">API management</a>. De publieke interface van een microservice kan namelijk gezien worden als een API (<a href="https://en.wikipedia.org/wiki/Application_programming_interface">Application Programming Interface</a>). Naast het beheer van een veelvoud aan APIs, richten deze platformen zich ook vaak op het beheer van de levenscyclus van de erachterliggende diensten.</li>
</ul>
<h2 style="text-align: justify;">Besluit</h2>
<p style="text-align: justify;">Microservices zijn als deployment architectuur een perfecte match voor Agile software ontwikkeling, en verankeren de goede principes van Service Oriented Architecture. Ze maken het mogelijk software op een flexibeler manier te ontwikkelen, met vele kleine componenten, waardoor er sneller kan worden ingespeeld op veranderende behoeften. Ze laten herbruikbaarheid toe op een fijnmazige manier, en verhogen de efficiëntie in het gebruik van resources. Ook met de huidige ontwikkelingen op vlak van infrastructuur: Containers, gaan ze heel goed samen. Samen daarmee, en met EDA en REST, vormen ze een blauwdruk om een applicatie-ecosysteem future-proof op te bouwen.</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.smalsresearch.be/van-n-tier-naar-microservices/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
