<?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>Architektura - bdabek.pl</title>
	<atom:link href="https://www.bdabek.pl/tag/architektura/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.bdabek.pl/tag/architektura/</link>
	<description>Bartosz Dąbek</description>
	<lastBuildDate>Sat, 03 Dec 2022 11:09:52 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.bdabek.pl/wp-content/uploads/2020/10/cropped-5986134a-46ba-41ac-9c82-bb4ffb3a7bf3_200x200-1-150x150.png</url>
	<title>Architektura - bdabek.pl</title>
	<link>https://www.bdabek.pl/tag/architektura/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Architektura mikroserwisów</title>
		<link>https://www.bdabek.pl/architektura-mikroserwisow/</link>
					<comments>https://www.bdabek.pl/architektura-mikroserwisow/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 05 Sep 2020 10:00:14 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Architektura]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1635</guid>

					<description><![CDATA[<p>Architektura mikroserwisów w ostatnim czasie zyskała na popularności w branży jako realna alternatywa dla aplikacji monolitycznych i architektur zorientowanych na usługi. Często niestety nie wiemy jak poprawnie zaprojektować aplikację opartą na mikroserwisach. Używamy takiej architektury ze względu na trend a nie wymagania biznesowe. Z drugiej strony wiele firm odnalazło się w mikroserwisach i radzą sobie&#8230;&#160;<a href="https://www.bdabek.pl/architektura-mikroserwisow/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Architektura mikroserwisów</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-mikroserwisow/">Architektura mikroserwisów</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Architektura mikroserwisów w ostatnim czasie zyskała na popularności w branży jako realna alternatywa dla aplikacji monolitycznych i architektur zorientowanych na usługi. Często niestety nie wiemy jak poprawnie zaprojektować aplikację opartą na mikroserwisach. Używamy takiej architektury ze względu na trend a nie wymagania biznesowe. Z drugiej strony wiele firm odnalazło się w mikroserwisach i radzą sobie świetne. Baa.. w internecie można znaleźć dużo cennych artykułów o tym jak im szło lub idzie [<strong><a href="https://netflixtechblog.com/tagged/microservices" target="_blank" rel="noopener noreferrer">1</a></strong>, <strong><a href="https://eng.uber.com/microservice-architecture/" target="_blank" rel="noopener noreferrer">2</a></strong>].</p>
<blockquote>
<p class="mb-0" style="text-align: left;"><em>I&#8217;ll keep saying this &#8230; if people can&#8217;t build monoliths properly, microservices won&#8217;t help.</em></p>
<p><cite>Simon Brown</cite></p></blockquote>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>To jest kolejny artykuł z serii wzorców o architekturach aplikacyjnych. Poprzednie artykuły znajdziesz pod tym linkiem <a href="https://www.bdabek.pl/tag/architektura+seria/"><strong>mini-seria wpisów</strong></a>.</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Czym jest architektura mikroserwisów"><strong>Czym jest architektura mikroserwisów</strong></a></li>
<li><a href="#Topologie mikroserwisów"><strong>Topologie mikroserwisów</strong></a></li>
<li><a href="#Wady i zalety architektury"><strong>Wady i zalety architektury</strong></a></li>
</ul>
<hr id="Czym jest architektura mikroserwisów" />
<h3><strong>Czym jest architektura mikroserwisów</strong></h3>
<p>Mikroserwisy to styl architektoniczny, w którym pojedyncza aplikacja jest tworzona jako zestaw małych usług. Każda usługa działa w ramach własnego procesu i jest &#8211; albo przynajmniej powinna być &#8211; niezależna od innych. Warto podkreślić, że mikroserwis to nie jest zawsze pojedyczny projekt (moduł). W ramach jednego mikroserwisu możemy mieć kilka projektów (modułów), które tworzą jeden niezależny mikroserwis. Całkiem dobrze obrazuje to poniższy rysunek.</p>
<p><a href="https://www.bdabek.pl/architektura-mikroserwisow/microservices/" rel="attachment wp-att-1640"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-1640" src="https://www.bdabek.pl/wp-content/uploads/2020/09/microservices.png" alt="" width="1186" height="728" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/microservices.png 1186w, https://www.bdabek.pl/wp-content/uploads/2020/09/microservices-300x184.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/09/microservices-1024x629.png 1024w, https://www.bdabek.pl/wp-content/uploads/2020/09/microservices-768x471.png 768w" sizes="(max-width: 1186px) 100vw, 1186px" /></a></p>
<p>Wracając do niezależności &#8211; co dokładnie miałem na myśli? Każdy z serwisów powinien móc być wdrażany/testowany całkowicie oddzielnie od pozostałych usług. Tylko wtedy osiągniemy pełnię korzyści z tej architektury!</p>
<p>Mikroserwisy są implementacją wzorca <strong><a href="https://en.wikipedia.org/wiki/Service-oriented_architecture" target="_blank" rel="noopener noreferrer">SOA (Service-Oriented Architecture)</a></strong> z tą różnicą, że usługi mikroserwisowe są rozbijane na mniejsze &#8211; łatwiejsze do ogarnięcia. Zamiast monolitycznej aplikacji otrzymujemy N niezależnych, które mogą być rozwijane niezależnie przez kilka odrębnych zespołów.</p>
<p>Podsumowując, <strong>charakterystykę mikroserwisów</strong> można zamknąć w kilku punktach:</p>
<ul>
<li>jest implementacją wzorca SOA</li>
<li>nie ma punktów centralnych, które orkiestrują powiązaniami pomiędzy serwisami (poszczególne usługi same wiedzą w jaki sposób komunikować się z innymi)</li>
<li>komponenty są luźno powiązane</li>
<li>najlepiej nadaje się do chmury (tam wyciągnie największe korzyści &#8211; skalowalność)</li>
</ul>
<hr id="Topologie mikroserwisów" />
<h3><strong>Topologie mikroserwisów</strong></h3>
<p>Architekturę mikroserwisów można podzielić na 3 główne topologie: <em>API REST</em>, <em>Application REST</em> i <em>centralized messaging</em> topology.</p>
<p><a href="https://www.bdabek.pl/architektura-mikroserwisow/decentralised-data/" rel="attachment wp-att-1658"><img decoding="async" class="aligncenter size-full wp-image-1658" src="https://www.bdabek.pl/wp-content/uploads/2020/09/decentralised-data.png" alt="" width="758" height="444" srcset="https://www.bdabek.pl/wp-content/uploads/2020/09/decentralised-data.png 758w, https://www.bdabek.pl/wp-content/uploads/2020/09/decentralised-data-300x176.png 300w" sizes="(max-width: 758px) 100vw, 758px" /></a></p>
<p><strong>API REST</strong> &#8211; charakteryzuje się 'drobnoziarnistymi&#8217; (<em>fine-grained</em>) mikroserwisami. Oznacza to, że mikroserwisy są małe i wykonują konkretne zadanie biznesowe niezależnie od pozostałych mikroserwisów. Topologia przydatna dla stron internetowych, które udostępniają małe, niezależne, indywidualne usługi za pośrednictwem API.</p>
<p><strong>Application REST</strong> &#8211; topologia typowa dla małych i średnich aplikacji biznesowych o stosunkowo niskim stopniu złożoności. Komponenty (moduły) usług różnią się od tych w topologii opartej na API-REST tym, że zwykle są większe (<em>coarse-grained</em>) i reprezentują niewielką część całej aplikacji biznesowej, a nie drobnoziarnistą, pojedynczą usługę.</p>
<p><strong>Centralized messaging topology</strong> &#8211; jest podobna do Application REST, z tym wyjątkiem, że zamiast używać REST&#8217;a do komunikacji, używa lekkiego scentralizowanego brokera komunikatów (ActiveMQ, RabbitMQ, inna implementacja JMS). Scentralizowana topologia przesyłania wiadomości jest zwykle stosowana w większych aplikacjach biznesowych. Zalety to zaawansowane mechanizmy kolejkowania, asynchroniczne przesyłanie komunikatów, monitorowanie oraz lepszy load balancing i skalowalność.</p>
<hr id="Wady i zalety architektury" />
<h3><strong>Wady i zalety architektury</strong></h3>
<p><strong>Zalety:</strong></p>
<ul>
<li>serwisy są małe i niezależne &#8211; a zatem łatwiejsze w rozwoju i zrozumieniu</li>
<li>łatwiejsza testowalność (<em>mowa tylko o pojedynczym mikroserwisie</em>)</li>
<li>możliwość niezależnego wdrażania (<em>przynajmniej w teorii tak powinno być</em>)</li>
<li>izolacja błędów &#8211; dzięki temu, że serwisy są od siebie niezależne, w przypadku gdy wystąpi błąd (np. wyciek pamięci) w jednym z serwisów nie powinno to wpłynąć na działanie innego</li>
<li>pozwala na użycie dowolnej technologi w nowych serwisach (<em>może to być również wadą</em>)</li>
<li>skalowalność (<em>szczególnie zauważalne w technologiach chmurowych</em>)</li>
</ul>
<p><strong>Wady:</strong></p>
<ul>
<li>dowolność technologiczna może prowadzić do chaosu</li>
<li>testowanie interakcji pomiędzy serwisami jest utrudnione</li>
<li>skomplikowana infrastruktura</li>
<li>utrudniona analiza komunikacji</li>
<li>IDE/narzędzia developerskie wciąż nie wspierają tak dobrze projektów opartych o mikroserwisy jak projektów monolitycznych</li>
</ul>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Decyzja o tym czy nowy projekt powinien iść w stronę mikroserwisów powinna być odraczana możliwie jak najdłużej. Bardzo często zamiast iść w kierunku mikroserwisów (bo są popularne) powinniśmy zacząć od monolitu. Wyjątkiem będzie naprawdę dobrze przemyślana architektura i wizja na przyszłość, gdzie od razu wiemy, że prędzej czy później mikroserwisy faktycznie przyniosą nam korzyści.</p>
<p>Mikroserwisy to fajna architektura. Ale należy pamiętać &#8211; <strong>dobór architektury zawsze powinien być podyktowany problemem biznesowym</strong>. Nasze ego czy też chęć <em>cv-driven-development</em> nie powinno zwyciężać bo może się okazać, że zatopimy projekt.</p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://learning.oreilly.com/library/view/software-architecture-patterns/9781491971437/" target="_blank" rel="noopener noreferrer">Software Architecture Patterns (Mark Richards) – Chapter 4. Microservices Architecture Pattern</a></strong></li>
<li><strong><a href="https://microservices.io/patterns/microservices.html" target="_blank" rel="noopener noreferrer">Pattern: Microservice Architecture</a></strong></li>
<li><a href="https://martinfowler.com/articles/microservices.html" target="_blank" rel="noopener noreferrer"><strong>Microservices</strong></a></li>
<li><a href="https://www.marcobehler.com/guides/java-microservices-a-practical-guide" target="_blank" rel="noopener noreferrer"><strong>Java Microservices: A Practical Guide</strong></a></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Wejdziemy w <strong>świat DDD</strong>. Zaczniemy od poznawania fundamentów <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<div id="wpd-post-rating" class="wpd-not-rated">
<div class="wpd-rating-wrap"></div>
</div>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-mikroserwisow/">Architektura mikroserwisów</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/architektura-mikroserwisow/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Architektura Hexagonalna [Cebula/Porty i Adaptery] 🔥👍</title>
		<link>https://www.bdabek.pl/architektura-hexagonalna/</link>
					<comments>https://www.bdabek.pl/architektura-hexagonalna/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 29 Aug 2020 10:00:50 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Architektura]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1588</guid>

					<description><![CDATA[<p>Architektura Hexagonalna znana też jako Onion Architecture lub Ports &#38; Adapters została wymyślona przez Alistaira Cockburna i opublikowana w 2005 roku. Jej celem jest uniknięcie znanych pułapek strukturalnych w OOP jak np. zależności między wartswami czy też wplatanie kodu odpowiedzialnego za GUI do warstwy logiki biznesowej. Ma ona na celu stworzenie luźno powiązanych komponentów aplikacji, które&#8230;&#160;<a href="https://www.bdabek.pl/architektura-hexagonalna/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Architektura Hexagonalna [Cebula/Porty i Adaptery] 🔥👍</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-hexagonalna/">Architektura Hexagonalna [Cebula/Porty i Adaptery] 🔥👍</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Architektura Hexagonalna znana też jako Onion Architecture lub Ports &amp; Adapters została wymyślona przez <strong><a href="https://alistair.cockburn.us/" target="_blank" rel="noopener noreferrer">Alistaira Cockburna</a> </strong>i opublikowana w 2005 roku. Jej celem jest uniknięcie znanych pułapek strukturalnych w OOP jak np. zależności między wartswami czy też wplatanie kodu odpowiedzialnego za GUI do warstwy logiki biznesowej. Ma ona na celu stworzenie luźno powiązanych komponentów aplikacji, które można łatwo połączyć za pomocą portów i adapterów. To sprawia, że komponenty są wymienialne na każdym poziomie i ułatwia automatyzację testów.</p>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>To jest już trzeci wpis z <strong><a href="https://www.bdabek.pl/tag/architektura+seria/" target="_blank" rel="noopener noreferrer">mini-serii blogów</a></strong> o architekturach aplikacyjnych. W poprzednich wpisach mogłeś przeczytać o</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li><strong><a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/" target="_blank" rel="noopener noreferrer">architekturze warstwowej</a> </strong></li>
<li><strong><a href="https://www.bdabek.pl/architektura-sterowana-zdarzeniami/" target="_blank" rel="noopener noreferrer">architekturze sterowanej zdarzeniami</a></strong></li>
<li><strong><a href="https://www.bdabek.pl/mikrojadro/" target="_blank" rel="noopener noreferrer">architekturze mikrojądra</a></strong></li>
</ul>
</li>
</ul>
<p>W dzisiejszym artykule dowiesz się:</p>
<ul>
<li><a href="#Czym jest architektura hexagonalna"><strong>Czym jest architektura hexagonalna</strong></a></li>
<li><a href="#Struktura hexagonu"><strong>Jak wygląda struktura hexagonu</strong></a></li>
<li><a href="#Wady i zalety"><strong>Wady i zalety architektury</strong></a></li>
</ul>
<hr id="Czym jest architektura hexagonalna" />
<h3><strong>Czym jest architektura hexagonalna</strong></h3>
<p>Celem architektury hexagonalnej jest umożliwienie, aby aplikacja którą rozwijamy była traktowana tak samo przez użytkowników, programy zewnętrzne, testy czy też skrypty. Dodatkowo ma ona umożliwiać rozwój i testowanie aplikacji w oderwaniu od zewnętrznych zależności (baza danych / zewnętrzne API).</p>
<p>Architektura hexagonalna w centrum aplikacji stawia na przypadki użycia i domenę &#8211; to też jest powód dlaczego sprawdza się ona dobrze z DDD. Warto zauważyć, że ten styl architektoniczny jest przeciwny <a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/" target="_blank" rel="noopener noreferrer"><strong>architekturze wartstwowej </strong></a>&#8211; tutaj zależności są kierowane do środka domeny a nie jak w przypadku warstw od góry do dołu.</p>
<p>&nbsp;</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1592" rel="attachment wp-att-1592"><img decoding="async" class="aligncenter size-full wp-image-1592" src="https://www.bdabek.pl/wp-content/uploads/2020/08/hexagonal-architecture.png" alt="" width="956" height="470" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/hexagonal-architecture.png 956w, https://www.bdabek.pl/wp-content/uploads/2020/08/hexagonal-architecture-300x147.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/08/hexagonal-architecture-768x378.png 768w" sizes="(max-width: 956px) 100vw, 956px" /></a></p>
<p>Nazwa architektury wzięła się z efektu wizualnego jaki przedstawia hexagon &#8211; więcej o tym przeczytasz <strong><a href="https://alistair.cockburn.us/hexagonal-architecture/" target="_blank" rel="noopener noreferrer">w </a><a href="https://alistair.cockburn.us/hexagonal-architecture/" target="_blank" rel="noopener noreferrer">artykule </a><a href="https://alistair.cockburn.us/hexagonal-architecture/" target="_blank" rel="noopener noreferrer">Alistair&#8217;a</a><a href="https://alistair.cockburn.us/hexagonal-architecture/" target="_blank" rel="noopener noreferrer"> Cockburn&#8217;a</a></strong>, twórcy architektury:</p>
<blockquote><p><em>The hexagon is not a hexagon because the number six is important, but rather to allow the people doing the drawing to have room to insert ports and adapters as they need, not being constrained by a one-dimensional layered drawing. The term ‘’hexagonal architecture’’ comes from this visual effect.</em></p></blockquote>
<hr id="Struktura hexagonu" />
<h3><strong>Jak wygląda struktura hexagonu</strong></h3>
<p>Hexagon składa się z trzech kluczowych elementów: domeny (core), portów i adapterów. Jeżeli spojrzymy na hexagon zaprezentowany na rysunku powyżej można też zauważyć, że nasz core (domena i przypadki użycia) używają portów &#8211; czyli domena wie na co dany port pozwala, np. zapis użytkownika ale nie wie jak to się stanie. I do tego właśnie służą adaptery. Aplikacja może mieć np. prawdziwą bazę danych, która rzeczywiście zapisze użytkownika w bazie ale może to też być hashmapa, która po restarcie aplikacji nie będzie już niczego pamiętać.</p>
<p>Porty dzielą się na wejściowe i wyjściowe. Wejściowe to te, które sterują naszą logiką np. GUI, gdzie użytkownik wywołuję daną akcję. Wyjściowe są używane (sterowane) przez logikę biznesową. Tutaj najlepszym przykładem są bazy danych i zewnętrzne API. Aplikacja musi porozumieć się z jakimiś zewnętrznymi komponentami i w tym celu używa właśnie portów wyjściowych.</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1597" rel="attachment wp-att-1597"><img decoding="async" class="aligncenter size-full wp-image-1597" src="https://www.bdabek.pl/wp-content/uploads/2020/08/hexagon-simple.png" alt="" width="1024" height="526" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/hexagon-simple.png 1024w, https://www.bdabek.pl/wp-content/uploads/2020/08/hexagon-simple-300x154.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/08/hexagon-simple-768x395.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<h4>Domena</h4>
<p>Są to nasze obiekty domenowe. Ich implementacja powinna być na tyle jasna, żeby nawet ktoś nie techniczny mógł podejść i powiedzieć <em>ok, rozumiem co tu się dzieje</em>. Obiekty domenowe nie powinny mieć żadnych zewnętrznych zależności. <strong>Domena opisuje jak coś zrobić.</strong></p>
<h4>Przypadki użycia</h4>
<p>To klasy, które obsługują konkretne problemy biznesowe. Jest to faktyzcna wartość dla biznesu, która rozwiązuje ich problem. Przypadki użycia mogą zawierać wszystkie niezbędne walidacje i logikę reguł biznesowych, które są specyficzne dla konkretnego przypadku użycia (dlatego też nie mogą być implementowane w obiektach domeny) a następnie delegują pracę do domeny. Use case&#8217;y nie są zależne od zewnętrznych komponentów, natomiast jeżeli potrzebują czegoś z zewnątrz (np. pobranie użytkownika) to tworzą do tego port (albo używają istniejącego). <strong>Przypadki użycia mówią co zrobić.</strong></p>
<h4>Porty wejściowe i wyjściowe</h4>
<p>Porty możesz sobie wyobrażać dokładnie tak jak porty w komputerze, np. USB. Nie jest ważne czy podłączysz urządzenie firmy X czy Y &#8211; oba powinny działać.</p>
<p>W architekturze hexagonalnej komunikacja do i z aplikacji odbywa się przez porty. Port wejściowy będzie zazwyczaj interfejsem, który jest implementowany przez konkretny przypadek użycia. Podobnie jest z portem wyjściowym &#8211; to również będzie interfejs. Tym razem jednak przypadek użycia będzie go używał &#8211; a nie tak jak w przypadku portu wejściowego implementował.</p>
<p>Dzięki portom wejściowym i wyjściowym mamy bardzo wyraźne miejsca, w których dane wchodzą i wychodzą z naszego systemu, ułatwiając rozumowanie na temat architektury.</p>
<h4>Adaptery</h4>
<p>Adaptery tworzą zewnętrzną warstwę architektury hexagonalnej. Nie są częścią rdzenia, ale wchodzą z nim w interakcję. Adaptery również dzielimy na dwie grupy: <strong>wejściowe i wyjściowe</strong>. Wejściowe (lub sterujące) wywołują porty wejściowe, aby coś zrobić w aplikacji &#8211; w końcu wywołują konkretny przypadek użycia. Wyjściowe (sterowane) są natomiast wywoływane przez przypadki użycia.</p>
<p>Adaptery ułatwiają wymianę określonej warstwy aplikacji, np. zmiana bazy danych na inną. Wystarczy napisać tylko nowy adapter.</p>
<hr id="Wady i zalety" />
<h3><strong>Wady i zalety architektury</strong></h3>
<p><strong>Zalety:</strong></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>testowalność</li>
<li>rozwijalność i utrzymanie</li>
<li>wymiana technologii</li>
</ul>
</li>
</ul>
<p><strong>Wady:</strong></p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>trudniejsza nawigacja po kodzie źródłowym &#8211; musimy ogarniać co, gdzie jest używane</li>
<li>wiele adapterów = wiele testów</li>
</ul>
</li>
</ul>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>W tym krótkim wpisie chciałem przedstawić Ci ideę architektury hexagonalnej. Jeżeli czytałeś wcześniejsze artykuły to zapewne już wiesz, że użycie konkretnej architektury zależy od tego czego chce biznes. W przypadku architektury hexagonalnej dobrym wyborem jej zastosowania wydają się być <strong>projekty o zmiennej i złożonej logice biznesowej</strong>. Natomiast zastosowanie jej w CRUD-ach będzie zdecydowanie przesadą i przerostem formy nad treścią. Zamiast uprościć zrozumienie, możesz je tylko niepotrzebnie skomplikować.</p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://alistair.cockburn.us/hexagonal-architecture/" target="_blank" rel="noopener noreferrer">Hexagonal architecture</a></strong></li>
<li><a href="https://reflectoring.io/spring-hexagonal/" target="_blank" rel="noopener noreferrer"><strong>Hexagonal Architecture with Java and Spring</strong></a></li>
<li><strong><a href="https://blog.octo.com/en/hexagonal-architecture-three-principles-and-an-implementation-example/" target="_blank" rel="noopener noreferrer">Hexagonal Architecture: three principles and an implementation example</a></strong></li>
<li><strong><a href="https://www.educative.io/blog/hexagonal-architecture-tutorial" target="_blank" rel="noopener noreferrer">Build Maintainable Systems With Hexagonal Architecture</a></strong></li>
<li><strong><a href="https://allegro.tech/2020/05/hexagonal-architecture-by-example.html" target="_blank" rel="noopener noreferrer">Hexagonal Architecture by example &#8211; a hands-on introduction</a></strong></li>
<li><strong><a href="https://youtu.be/sOaS83Ir8Ck" target="_blank" rel="noopener noreferrer">ITT 2018 &#8211; Jakub Nabrdalik &#8211; Hexagonal Architecture in practice</a></strong></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Moja lista todo robi się coraz dłuższa&#8230; jednak zanim zacznę ją czyścić (może powinienem pisać 2 artykuły tygodniowo) chciałbym dokończyć serię o architekturach aplikacyjnych. Dlatego też za tydzień opiszemy popularną <strong>architekturę mikroserwisów</strong>.</p>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-hexagonalna/">Architektura Hexagonalna [Cebula/Porty i Adaptery] 🔥👍</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/architektura-hexagonalna/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Architektura Mikrojądra 🥥🥝</title>
		<link>https://www.bdabek.pl/mikrojadro/</link>
					<comments>https://www.bdabek.pl/mikrojadro/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 22 Aug 2020 10:00:59 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Architektura]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1512</guid>

					<description><![CDATA[<p>Większość z nas tworzy oprogramowanie z myślą, że będzie ono łatwo rozszerzalne. Ale co jeżeli musisz pozwolić na rozszerzenia zewnętrznemu zespołowi albo komuś całkowicie obcemu spoza organizacji? Jak rozwiązać taki problem? Z pomocą przychodzi gwiazda dzisiejszego wpisu &#8211; architektura mikrojądra! Cześć  Architektura typu mikrojądro to już trzeci wpis z mini-serii blogów o architekturach aplikacyjnych. W&#8230;&#160;<a href="https://www.bdabek.pl/mikrojadro/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Architektura Mikrojądra 🥥🥝</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/mikrojadro/">Architektura Mikrojądra 🥥🥝</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Większość z nas tworzy oprogramowanie z myślą, że będzie <strong>ono łatwo rozszerzalne</strong>. Ale co jeżeli musisz pozwolić na rozszerzenia <strong>zewnętrznemu</strong> zespołowi albo komuś całkowicie obcemu spoza organizacji? Jak rozwiązać taki problem? Z pomocą przychodzi gwiazda dzisiejszego wpisu &#8211; <strong>architektura mikrojądra</strong>!</p>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>Architektura typu mikrojądro to już trzeci wpis z <strong><a href="https://www.bdabek.pl/tag/architektura+seria/" target="_blank" rel="noopener noreferrer">mini-serii blogów</a></strong> o architekturach aplikacyjnych. W poprzednich wpisach mogłeś przeczytać o <strong><a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/" target="_blank" rel="noopener noreferrer">architekturze warstwowej</a> </strong>i <strong><a href="https://www.bdabek.pl/architektura-sterowana-zdarzeniami/" target="_blank" rel="noopener noreferrer">architekturze sterowanej zdarzeniami</a></strong>.</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Czym jest architektura mikrojądra?"><strong>Czym jest architektura mikrojądra?</strong></a></li>
<li><a href="#Przykład"><strong>Przykłady</strong></a></li>
<li><a href="#Wady i zalety architektury"><strong>Wady i zalety architektury</strong></a></li>
</ul>
<hr id="Czym jest architektura mikrojądra?" />
<h3><strong>Czym jest architektura mikrojądra?</strong></h3>
<p>Architektura mikrojądra lub inaczej architektura wtyczek stosowana jest najczęściej kiedy oprogramowanie musi być w stanie dostosować się do zmieniających się wymagań systemowych.</p>
<p>Mikrojądro składa się z dwóch elementów: <strong>jądra</strong> (rdzeń systemu) oraz <strong>wtyczek</strong> (pluginów). Rdzeń w najprostszych słowach jest jakimś podstawowym elementem (czasami podstawową funkcjonalnością) systemu. Zawiera on minimalną ilość kodu jaki jest potrzebny do uruchomienia systemu. Reszta leży na barkach wtyczek. Każda wtyczka to całkowicie oddzielna logika biznesowa. Z założenia, wtyczki nie powinny wiedzieć o sobie nawzajem (nie zawsze się tak dzieje) i być całkowicie niezależne. Każda z wtyczek dostarcza konkretną funkcjonalność biznesową do systemu. Innymi słowy &#8211; rozszerza go.<a href="https://www.bdabek.pl/?attachment_id=1568" rel="attachment wp-att-1568"><img decoding="async" class="aligncenter size-full wp-image-1568" src="https://www.bdabek.pl/wp-content/uploads/2020/08/microkernel-architecture.png" alt="" width="722" height="487" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/microkernel-architecture.png 722w, https://www.bdabek.pl/wp-content/uploads/2020/08/microkernel-architecture-300x202.png 300w" sizes="(max-width: 722px) 100vw, 722px" /></a></p>
<p>Jądro musi w jakiś sposób wiedzieć jakie wtyczki są dostępne oraz jak się do nich dostać. Do tego celu służy <strong>rejestr</strong>. Zawiera on informacje o wtyczkach oraz ich <strong>kontrakt</strong>. Kontrakt to zasadniczo dane wejściowe i wyjściowe &#8211; pozwala on na wymianę danych pomiędzy rdzeniem i wtyczką. Nie zawsze będzie tak, że wtyczka domyślnie wspiera zdefiniowany kontrakt. Stosuje się wtedy wzorzec projektowy <strong>adapter</strong>, który odpowiednio <i>zmapuje </i>funkcjonalność.</p>
<p>Mikrojądro można traktować <em><strong>trochę </strong></em>jak wzorzec metody szablonowej. Mówi ono <strong>co ma się zadziać i w jakiej kolejności, natomiast jak to się zadzieje jest już zależne od użytych wtyczek</strong>.</p>
<hr id="Przykład" />
<h3><strong>Przykłady</strong></h3>
<p>Najlepszymi przykładami (<em>do wytłumaczenia</em>) są: IDE, edytory tekstu i przeglądarki.</p>
<p><strong>IDE</strong>. Zapewnia nam podstawową funkcjonalność &#8211; widzimy strukturę projektu, możemy pisać kod i go uruchamiać. IntelliJ wspiera różne języki JVM&#8217;owe do kompilacji oraz uruchamiania. Jest to właśnie element wtyczki. Jądrem systemu jest kompilacja i uruchomienie, natomiast wtyczką konkretny język. Ich kontraktem wyjściowym jest zapewne byte code. Rejestrem w tym przypadku będzie język jaki wybraliśmy przy tworzeniu projektu.</p>
<p><strong>Przeglądarki</strong>. Jądrem systemu w tym przypadku jest przeglądanie witryn internetowych. A wtyczki? Istenieje duże prawdopodobieństwo, że sam posiadasz zainstalowanych kilka(naście) różnych wtyczek. Wszystko to rozszerza główną funkcjonalność &#8211; przeglądanie witryn internetowych &#8211; uzupełniając ją o dodatkową logikę.</p>
<p><strong>Spring Boot</strong>. Nie jestem w 100% pewny czy jest to trafiony przykład ale powiem jak ja to widzę i rozumiem. <strong>Spring </strong>przy starcie aplikacji czyta wiele plików konfiguracyjnych, rejestruje bean&#8217;y, wykonuje prace zarejestrowane w post processorach i innych. Jeżeli spojrzymy na to z punktu widzenia mikrojądra to można odebrać wrażenie, że jądrem w tym przypadku jest start aplikacji. Wtyczki są to bean&#8217;y, post processory i inne udogodnienia, które się dzieją na starcie. Rejestrem może być plik konfiguracyjny, XML lub adnotacja. Kontraktem jest natomiast interfejs.</p>
<p>Nie jestem w 100% pewny czy ostatni przykład jest dobry. Jeżeli znasz jakieś przykłady z <em>życia</em> wzięte (czytaj framework) to podziel się w komentarzu <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<hr id="Wady i zalety architektury" />
<h3><strong>Wady i zalety architektury</strong></h3>
<p><strong>Zalety</strong>:</p>
<ul>
<li>Testowalność &#8211; osobne, niezależne wtyczki, które można przetestować w izolacji. Samo jądro również jest minimalną częścią systemu, które nie powinno być uciążliwe w testowaniu (<em>+ można wykorzystać mockowanie</em>).</li>
<li>Konfigurowalność &#8211; można na różne sposoby skonfigurować ten sam proces, np. kompilacja projektu przy użyciy Javy, Kotlina, Groovy&#8217;ego czy Scali.</li>
<li>Rozszerzalność &#8211; łatwo dodać nową wtyczkę, która rozszerzy funkcjonalność systemu. Przykład: powstaje nowy język JVM&#8217;owy &#8211; większość dobrych IDE (<em>patrz IntelliJ</em>) nie będzie miała problemu aby go wesprzeć.</li>
</ul>
<p><strong>Wady</strong>:</p>
<ul>
<li>Skalowalność &#8211; mikrojądro pracuje w obrębie jednego modułu. Dokładając kolejne wtyczki może to być wąskie gardło tej architektury w kontekście wydajności.</li>
<li>Złożoność &#8211; jest to skomplikowany styl architektoniczny. Mamy dużo elementów do ogarnięcia &#8211; rejestr, kontrakty, konfiguracja wtyczek &#8211; to wszystko sprowadza się do wysokiego progu wejścia.</li>
</ul>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Architektura mikrojądra z założenia <strong>jest prosta</strong>. <strong>Nie jest</strong> ona natomiast <strong>łatwa</strong>. Przy większych projektach (<em>których produkt ma żyć długo</em>) &#8211; a zazwyczaj właśnie takie projekty powinny z niej korzystać  &#8211; jest ona ciężka do ogarnięcia dla nowej osoby. Jej główną zaletą jest <strong>elastyczność </strong>i to ten driver architektoniczny powinien przemawiać za wyborem tej architektury. <strong>Kluczowe jest</strong> aby przed jakąkolwiek implementacją mieć wizję i plan &#8211; po prostu <strong>trzeba wykonać dokładną analizę projektu</strong>.</p>
<p>W przypadku aplikacji opartych na produktach (IDE, edytory tekstu, przeglądarki, &#8230;) architektura mikrojądra wydaje się być świetnym kandydatem. Pozwala ona na udostępnianie dodatkowych funkcji użytkownikowi w zależności od jego preferencji. Dodatkowo, dzięki kontraktom nie musisz sam wytwarzać każdej nowej wtyczki a zamiast tego <em>użyć community</em> zbudowanego wokół produktu :).</p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://learning.oreilly.com/library/view/software-architecture-patterns/9781491971437/" target="_blank" rel="noopener noreferrer">Software Architecture Patterns (Mark Richards) – Chapter 3. Microkernel Architecture</a></strong></li>
<li><a href="https://searchapparchitecture.techtarget.com/tip/What-is-a-microkernel-architecture-and-is-it-right-for-you" target="_blank" rel="noopener noreferrer"><strong>What is a microkernel architecture, and is it right for you?</strong></a></li>
<li><a href="https://medium.com/@priyalwalpita/software-architecture-patterns-microkernel-architecture-97cee200264e" target="_blank" rel="noopener noreferrer"><strong>Software Architecture Patterns — Microkernel Architecture</strong></a></li>
<li><a href="https://weblogs.asp.net/ralfw/Dynamic-component-binding-made-easier-_2D00_-An-easy-to-use-Microkernel-to-help-reap-Contract_2D00_First_2D00_Design-benefits-in-.NET-programs" target="_blank" rel="noopener noreferrer"><strong>Dynamic component binding made easier &#8211; An easy to use Microkernel to help reap Contract-First-Design benefits in .NET programs</strong></a></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Kontynuujemy serię o archiekturze! Kolejna będzie <strong>architektura Hexagonalna</strong>.</p>
<p>Artykuł <a href="https://www.bdabek.pl/mikrojadro/">Architektura Mikrojądra 🥥🥝</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/mikrojadro/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Architektura Sterowana Zdarzeniami ✨</title>
		<link>https://www.bdabek.pl/architektura-sterowana-zdarzeniami/</link>
					<comments>https://www.bdabek.pl/architektura-sterowana-zdarzeniami/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 08 Aug 2020 10:00:45 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Architektura]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1473</guid>

					<description><![CDATA[<p>Architektura sterowana zdarzeniami to kolejny wpis z mini-serii blogów o architekturach aplikacyjnych. W pierwszym wpisie mogłeś przeczytać o architekturze warstwowej (wpis znajdziesz tutaj) a dziś na tapet bierzemy architekturę sterowaną zdarzeniami. Cześć  O zdarzeniach mówi się sporo. Ostatnimi latami są one popularyzowane a czasami co nieco przekoloryzowane. W architekturze jest tak, że nie ma jednego&#8230;&#160;<a href="https://www.bdabek.pl/architektura-sterowana-zdarzeniami/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Architektura Sterowana Zdarzeniami ✨</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-sterowana-zdarzeniami/">Architektura Sterowana Zdarzeniami ✨</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Architektura sterowana zdarzeniami to kolejny wpis z <strong><a href="https://www.bdabek.pl/tag/architektura+seria/" target="_blank" rel="noopener noreferrer">mini-serii blogów</a></strong> o architekturach aplikacyjnych. W pierwszym wpisie mogłeś przeczytać o architekturze warstwowej (wpis znajdziesz <strong><a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/" target="_blank" rel="noopener noreferrer">tutaj</a></strong>) a dziś na tapet bierzemy architekturę sterowaną zdarzeniami.</p>
<hr />
<h4>Cześć <img decoding="async" class="emoji lazyloaded" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" data-src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" /></h4>
<p>O zdarzeniach mówi się sporo. Ostatnimi latami są one popularyzowane a czasami co nieco przekoloryzowane. W architekturze jest tak, że <strong>nie ma jednego złotego grala</strong> na rozwiązanie wszystkich problemów. Z pewnością architektura sterowana zdarzeniami sprwadza się przy pewnych problemach natomiast wpychana na siłę w każdy projekt jest <strong>drogą do porażki</strong>. Jako odpowiedzialni developerzy nie chcemy uprawiać <em>CV-Driven-Development</em>, zamiast tego świadomie wybieramy to co potrzebne.</p>
<p>Chcę żebyś po przeczytaniu tego artykułu znał zalety i wady podjętej decyzji, zobaczył realny przykład użycia architektury (tak żebyś mógł to sobie lepiej zobrazować) i mógł podjąć świadomą decyzję o wyborze architektury.</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Czym jest architektura sterowana zdarzeniami"><strong>Czym jest architektura sterowana zdarzeniami</strong></a></li>
<li><a href="#Topologia: Mediator vs Broker"><strong>Topologia: Mediator vs Broker</strong></a></li>
<li><a href="#Wady i zalety architektury"><strong>Wady i zalety architektury</strong></a></li>
</ul>
<hr id="Czym jest architektura sterowana zdarzeniami" />
<h3><strong>Czym jest architektura sterowana zdarzeniami</strong></h3>
<p>Aby odpowiedzieć na pytanie czym w ogóle jest architektura sterowana zdarzeniami (<em>Event-Driven Architecture </em>/ <em>EDA</em>) należy zdefiniować pojęcie zdarzenia.</p>
<blockquote>
<p style="padding-left: 40px; text-align: center;">Zdarzenie jest zmianą stanu aplikacji, która już nastąpiła. Zdarzenie jest niezmienne i nie możemy go cofnąć. Zdarzenia mogą być rozumiane jako wiadomości przesyłane pomiędzy różnymi modułami systemu.</p>
</blockquote>
<p>W praktyce zdarzenia są wyzwalaczami (<em>triggerami</em>) pewnych zachowań w systemie. Samo zdarzenie nie jest świadome kto z niego korzysta. Zdarzenia są tworzone przez tzw. <strong>producentów</strong> (<em>normalny serwis tylko produkujący zdarzenia</em>) i przesyłane są do <strong>szyny zdarzeń</strong> (jakiś message broker, np. RabbitMQ czy Apache Kafka). Szyna odpowiednio filtruje i wypuszcza zdarzenia dalej do <strong>konsumentów</strong>. Konsumentem może być każdy. Może to być na przykład jakiś kolejny serwis będący producentem dla innego zdarzenia.</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1490" rel="attachment wp-att-1490"><img decoding="async" class="aligncenter size-full wp-image-1490" src="https://www.bdabek.pl/wp-content/uploads/2020/08/event-driven-architecture.png" alt="" width="700" height="441" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/event-driven-architecture.png 700w, https://www.bdabek.pl/wp-content/uploads/2020/08/event-driven-architecture-300x189.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>&nbsp;</p>
<p>Architektura oparta na zdarzeniach posiada niski coupling (jest luźno powiązana), ponieważ producenci zdarzeń nie są świadomi którzy konsumenci ich nasłuchują (nawet nie wiedzą czy ktokolwiek nasłuchuje), a samo zdarzenie nie wie, jakie są konsekwencje jego wystąpienia. Jest to z pewnością jedna z dużych zalet bo w praktyce oznacza to, że możemy dołączać nowych producentów i konsumentów w optymalny sposób (<em>nie jest to tak trywialne jak by się mogło wydawać</em>).</p>
<p>A więc <strong>w prostych słowach jak można zdefiniować EDA</strong>? Jest to architektura reagująca na zdarzenia w systemie. Zdarzenia mogą być <strong>wewnętrzne</strong> (np. dodano produkt do zamówienia) lub <strong>zewnętrzne</strong> (np. pomiary z czujnika parkowania w samochodzie). Zdarzenia są tworzone przez producentów a ich odbiorcami są konsumenci. Każde zdarzenie przechodzi przez szynę zdarzeń (<em>niektórzy nazywają to również kanałem zdarzeń &#8211; ang. event channel</em>), ta natomiast jest implementowana głównie przy użyciu topologii mediatora lub brokera.</p>
<hr id="Topologia: Mediator vs Broker" />
<h3><strong>Topologia: Mediator vs Broker</strong></h3>
<p><strong>Topologia mediatora</strong> jest używana kiedy zdarzenia składają się z kilku kroków i potrzebują pewnego rodzaju koordynacji do prawidłowego przetworzenia. Najlepiej przedstawić to na przykładzie.</p>
<p>Kupujesz bilet do kina. Wybrałeś seans, miejsce, przekąski i dokonujesz zapłaty. System w tym momencie wysyła na kolejkę zdarzenie: <strong>Kupiono bilet (miejsce: 3A, seans: Straszny film, sala: 6, czasRozpoczęcia: 17:00, itp.)</strong>. Zdarzenie to jest wysyłane na kolejkę, która przekazuje je do mediatora (<em>szyna koordynująca</em>). Mediator następnie wysyła &#8217;<em>nowe</em>&#8217; zdarzenia na poszczególne kanały. W naszym przypadku będą to trzy nowe zdarzenia uruchomione asynchronicznie: <strong>Zarezerwuj bilet,</strong> <strong>Zarezerwuj miejsce na sali</strong> oraz <strong>Zaktualizuj liczbę odwiedzających</strong>. Kiedy zdarzenia się powiodą, mediator wysyła jeszcze jedno zdarzenie: <strong>Wyślij powiadomienie o pomyślnej rezerwacji</strong>.</p>
<p>Każde ze zdarzeń produkowanych przez mediatora jest przetwarzana przez tzw. event processor. Warto zauważyć, że takich procesorów dla konkretnego zdarzenia możemy podpiąć wiele. Jest to duża zaleta dla systemów, które potrzebują wysokiej dostępności.</p>
<h3><a href="https://www.bdabek.pl/?attachment_id=1496" rel="attachment wp-att-1496"><img decoding="async" class="aligncenter size-full wp-image-1496" src="https://www.bdabek.pl/wp-content/uploads/2020/08/mediator.png" alt="" width="1496" height="1152" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/mediator.png 1496w, https://www.bdabek.pl/wp-content/uploads/2020/08/mediator-300x231.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/08/mediator-1024x789.png 1024w, https://www.bdabek.pl/wp-content/uploads/2020/08/mediator-768x591.png 768w" sizes="(max-width: 1496px) 100vw, 1496px" /></a></h3>
<p><strong>Topologię brokera</strong> stosuje się natomiast kiedy produkowane zdarzenie nie jest zbyt skomplikowane i nie wymaga orkiestracji. Tak właściwie to przykład z góry nawet lepiej komponuje się właśnie do topologi brokera.</p>
<p>Wysyłane jest zdarzenie <strong>Kupiono bilet (miejsce: 3A, seans: Straszny film, sala: 6, czasRozpoczęcia: 17:00, itp.</strong>), które trafia na kanał <em>Rezerwacji</em>. Kanał ten produkuje nowe zdarzenie  <strong>Zarezerwuj bilet</strong>. Na zdarzenie rezerwacji biletu nasłuchują dwa kolejne kanały rezerwacja miejsca (<strong>Zarezerwuj miejsce na sali</strong>) oraz aktualizacja odwiedzających (<strong>Zaktualizuj liczbę odwiedzających</strong>). Rezerwacja miejsca wysyła nowe zdarzenie <strong>Zarezerwuj miejsce na sali </strong>które trafia na kanał powiadomień (<strong>Wyślij powiadomienie o pomyślnej rezerwacji</strong>).</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1498" rel="attachment wp-att-1498"><img decoding="async" class="aligncenter size-full wp-image-1498" src="https://www.bdabek.pl/wp-content/uploads/2020/08/broker-topology.png" alt="" width="1231" height="832" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/broker-topology.png 1231w, https://www.bdabek.pl/wp-content/uploads/2020/08/broker-topology-300x203.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/08/broker-topology-1024x692.png 1024w, https://www.bdabek.pl/wp-content/uploads/2020/08/broker-topology-768x519.png 768w" sizes="(max-width: 1231px) 100vw, 1231px" /></a></p>
<p>Jeżeli dalej masz problem ze zrozumieniem bo kiepowato to wytłumaczyłem (<em>to jest prawdopodobne</em>) to zajrzyj do <strong><a href="https://learning.oreilly.com/library/view/software-architecture-patterns/9781491971437/ch02.html#idm46148422094696" target="_blank" rel="noopener noreferrer">tej książki</a> </strong>(dostęp online dzięki oreilly).</p>
<hr id="Wady i zalety architektury" />
<h3><strong>Wady i zalety architektury</strong></h3>
<p>Jak już wiesz (lub właśnie się dowiesz) każda architektura rozwiązuje problemy z pewnych kategorii. Kategorie te są często definiowane przez drivery architektoniczne (<em>np. szybkość developmentu, niezawodność platformy, bezpieczeństwo, itp.</em>). Nie ma rozwiązania uniwersalnego i tak samo jest z architekturą sterowaną zdarzeniami.</p>
<p><strong>Zaletami</strong> architektury sterowanej zdarzeniami są:</p>
<ul>
<li>Skalowalność i niezawodność &#8211; serwisy są świadome istnienia tylko szyny zdarzeń. Oznacza to, że możemy dodawać wiele serwisów i w przypadku awarii jednego z nich, inne będą działać dalej.</li>
<li>Wydajność &#8211; operację mogą być wykonywane asynchronicznie.</li>
<li>Zwinność &#8211; dzięki temu, że komponenty mają luźny coupling można dodawać nowe lub usuwać stare bez <em>większych</em> obaw, że coś się zepsuje.</li>
</ul>
<p>Natomiast do <strong>wad</strong> należą:</p>
<ul>
<li>Development &#8211; należy rozumieć i umieć programować asynchroniczne.</li>
<li>Testowalność &#8211; wymaga specjalnych narzędzi do generowania zdarzeń oraz kontraktów pomiędzy różnymi serwisami. Dodatkowo, natura architektury (asynchroniczność) jest także problematyczna, np. nie zawsze dostajemy zdarzenia w tej samej kolejności.</li>
</ul>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1928902866" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Przy użyciu architektury sterowanej zdarzeniami system może reagować na zmiany w czasie rzeczywistym. Analizując zdarzenia w systemie (<em>które są dostarczane na bieżąco</em>) biznes jest w stanie podejmować decyzje szybciej i dokładniej. Jest to napewno jeden z driverów architektonicznych jakie należy brać pod uwagę wybierając architekturę systemu.</p>
<p>EDA jest skomplikowanym wzorcem architektonicznym dlatego istnieje kilka wzorców projektowych pozwalających osiągnąć taką architekturę, są to m.in: Notification Pattern, Event-Carried State Transfer (ECST),  Event Sourcing (ES), CQRS. Więcej na temat możesz przeczytaj u <strong><a href="https://martinfowler.com/articles/201701-event-driven.html" target="_blank" rel="noopener noreferrer">Martina Fowlera</a> </strong>lub <strong><a href="https://medium.com/faun/four-event-driven-patterns-4b1cad5ac5e3" target="_blank" rel="noopener noreferrer">w tym artykule na medium</a></strong>.</p>
<p>Innym plusem EDA jest to, że pozwala na dostarczanie featerów bez modyfikacji i zajmowania czasu zespołowi, który jest odpowiedzialny za usługę produkującą zdarzenia. Wystarczy raz coś napisać i później wysyłać zdarzenia. Jeżeli ktoś będzie chciał zareagować na to zdarzenie to po prostu dodaje akcję (<em>konsumenta</em>). Nie tracimy wtedy czasu na komunikację i dostosowywanie konkretnych usług &#8211; po prostu mamy wystawiony pewien kontrakt i jak ktoś chce się dostosować to to robi.</p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://youtu.be/STKCRSUsyP0" target="_blank" rel="noopener noreferrer">GOTO 2017 • The Many Meanings of Event-Driven Architecture • Martin Fowler</a></strong></li>
<li><strong><a href="https://learning.oreilly.com/library/view/software-architecture-patterns/9781491971437/" target="_blank" rel="noopener noreferrer">Software Architecture Patterns (Mark Richards) – Chapter 2. Event-Driven Architecture</a></strong></li>
<li><strong><a href="https://pradeeploganathan.com/architecture/event-driven-architecture/" target="_blank" rel="noopener noreferrer">EVENT DRIVEN ARCHITECTURE</a></strong></li>
<li><strong><a href="https://www.redhat.com/en/blog/importance-event-driven-architecture-digital-world" target="_blank" rel="noopener noreferrer">The importance of event-driven architecture in the digital world</a></strong></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Chcę napisać coś osobistego &#8211; całkowicie niezwiązanego z programowaniem. Dawno takiego wpisu nie miałem a czuję że tego potrzebuję. Wpis będzie poświęcony <strong>ustawianiu celów i ich wartości</strong> w życiu.</p>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-sterowana-zdarzeniami/">Architektura Sterowana Zdarzeniami ✨</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/architektura-sterowana-zdarzeniami/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Architektura warstwowa. Zło czy dobro? 🤔</title>
		<link>https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/</link>
					<comments>https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/#respond</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 01 Aug 2020 10:00:39 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Architektura]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1417</guid>

					<description><![CDATA[<p>Architektura warstwowa &#8211; zło konieczne a może optymalne rozwiązanie? Pewne jest jedno &#8211; jest to najpopularniejszy styl architektoniczny wśród developerów. Często (niestety) jedyny jaki znamy. Cześć  Każdy z nas używał architektury warstwowej, czy to przechodząć przez tutorial w sieci czy implementując aplikacje komercyjne lub niekomercyjne. Jest ona na tyle popularna, że aż bardzo często użyta&#8230;&#160;<a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Architektura warstwowa. Zło czy dobro? 🤔</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/">Architektura warstwowa. Zło czy dobro? 🤔</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Architektura warstwowa &#8211; zło konieczne a może optymalne rozwiązanie? Pewne jest jedno &#8211; jest to <strong>najpopularniejszy styl architektoniczny wśród developerów</strong>. Często (<em>niestety</em>) jedyny jaki znamy.</p>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>Każdy z nas używał architektury warstwowej, czy to przechodząć przez tutorial w sieci czy implementując aplikacje komercyjne lub niekomercyjne. Jest ona na tyle popularna, że aż bardzo często użyta tam gdzie wcale nie sprawdza się najlepiej. Niemniej jednak, nie chcę żeby ten artykuł szedł w stronę, że architektura warstwowa jest złem. <strong>Absolutnie nie</strong>! Będąc świadomym programistą powinniśmy umieć dobrać odpowiednią architekturę do problemu jaki jest przed nami (<em>i naszym</em> <em><strong>zespołem</strong></em>!).</p>
<p>W dzisiejszym artykule:</p>
<ul>
<li><a href="#Czym jest architektura warstwowa?"><strong>Czym jest architektura warstwowa?</strong></a></li>
<li><a href="#Rzeczywistość architektury"><strong>Rzeczywistość architektury</strong></a></li>
<li><a href="#Wady i zalety"><strong>Wady i zalety architektury warstwowej</strong></a></li>
</ul>
<hr id="Czym jest architektura warstwowa?" />
<h3><strong>Czym jest architektura warstwowa?</strong></h3>
<p>Na początku musimy zacząć w ogóle od wyjaśnienia czym jest architektura warstwowa. Jeżeli jeteś programistą (<em>a zakładam, że jesteś</em>) to na 100% już się z nią spotkałeś. W teorii zakłada ona <strong>podział strukturalny projektu na kilka warstw</strong>. W wielu przypadkach będą to głównie 3 warstwy: <strong>prezentacji, logiki oraz persystencji</strong>. Aczkolwiek nie ma problemu żeby warstw było 5 lub 2.</p>
<p>Żebyś mógł to sobie lepiej zobrazować to te 3 warstwy przyrównam do typowej aplikacji pisanej w springu:</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>warstwa prezentacji = kontrolery,</li>
<li>warstwa logiki = serwisy,</li>
<li>warstwa persystencji = repozytoria.</li>
</ul>
</li>
</ul>
<p>Architektura warstwowa ma <strong>dwa fundamentalne założenia</strong>:</p>
<ol>
<li style="list-style-type: none;">
<ol>
<li>każda warstwa jest odseparowana od siebie &#8211; wykonuje tylko tą pracę do której została stworzona.</li>
<li>komunikacja jest kierowana od góry do dołu (warstwa prezentacji wykorzystuję logikę a ta persystencję)</li>
</ol>
</li>
</ol>
<figure id="attachment_1435" aria-describedby="caption-attachment-1435" style="width: 1211px" class="wp-caption aligncenter"><a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/zaleznosci-warstw/" rel="attachment wp-att-1435"><img decoding="async" class="wp-image-1435 size-full" src="https://www.bdabek.pl/wp-content/uploads/2020/08/zaleznosci-warstw.png" alt="" width="1211" height="779" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/zaleznosci-warstw.png 1211w, https://www.bdabek.pl/wp-content/uploads/2020/08/zaleznosci-warstw-300x193.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/08/zaleznosci-warstw-1024x659.png 1024w, https://www.bdabek.pl/wp-content/uploads/2020/08/zaleznosci-warstw-768x494.png 768w" sizes="(max-width: 1211px) 100vw, 1211px" /></a><figcaption id="caption-attachment-1435" class="wp-caption-text">Obrazek pochodzi z kursu DNA</figcaption></figure>
<p>Pomimo, że zasada numer dwa, która mówi iż komunikacja jest kierowana od góry do dołu może sugerować wprowadzenie zależności pomiędzy warstwami to takie myślenie nie jest poprawne. <strong>Warstwy są od siebie niezależne</strong>. Są one <em>tylko</em> powiązane (wywołanie warstwy niższej przez warstwę wyższą) ale <strong>nie należy mylić tego z zależnością</strong>. W praktyce oznacza to, że implementacje warstw mogą być łatwo wymienne. Jeżeli chcemy zamienić persystencję z Hiberneta na MyBatis to nie powinno to wpływać jakkolwiek na inne warstwy.</p>
<p>Możemy sobie wyobrazić sytuacje kiedy <strong>piszemy bardzo prostego</strong> CRUD&#8217;a. Nie posiada on logiki biznesowej (lub posiada jej bardzo mało). Czy powinniśmy w takim razie tworzyć warstwę logiki? Są dwie szkoły. Jedna, bardziej restrykcyjna mówiąca, że obligatoryjnie tworzymy wszystkie warstwy wymagane w projekcie a przepływ w naszej aplikacji jest zawsze taki sam. Przy takim podejściu mówi się, że <strong>warstwy są zamknięte</strong>. Natomiast druga szkoła pozwala na rozluźnienie, <strong>warstwy mogą być otwarte</strong>. Które podejście jest lepsze? Oba są prawidłowe. W architekturze jest dużo abstrakcji i stety, niestety wyraz <em><strong>to zależy </strong></em>może być używany bardzo często.</p>
<figure id="attachment_1441" aria-describedby="caption-attachment-1441" style="width: 901px" class="wp-caption aligncenter"><a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/warstwy-otwarte/" rel="attachment wp-att-1441"><img decoding="async" class="wp-image-1441 size-full" src="https://www.bdabek.pl/wp-content/uploads/2020/08/warstwy-otwarte.png" alt="" width="901" height="576" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/warstwy-otwarte.png 901w, https://www.bdabek.pl/wp-content/uploads/2020/08/warstwy-otwarte-300x192.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/08/warstwy-otwarte-768x491.png 768w" sizes="(max-width: 901px) 100vw, 901px" /></a><figcaption id="caption-attachment-1441" class="wp-caption-text">Obrazek pochodzi z kursu DNA</figcaption></figure>
<p>Dlaczego to zależy? Zobacz, moglibyśmy zezwolić na wywołanie warstwy persystencji bezpośrednio przez warstwę prezentacji. Chyba byśmy tym nie zgrzeszyli? Natomiast pozwalając sobie na takie manewry rozluźniamy granice naszej aplikacji. Nie tylko my pozwalamy na rozluźnienie ale jest jeszcze cały zespół. Kiedy komunikacja w zespole nie jest na najlepszym poziomie lub nad modułami pracuje kilka zespołów (jest to uciążliwe zwłaszcza przy dużych projektach) nasza architektura staje się krucha. Nie kontrolujemy, które warstwy mogą być otwarte a które nie. Kod staje się cięższy w testowaniu i utrzymywaniu a zależności między warstwami narastają.</p>
<hr id="Rzeczywistość architektury" />
<h3><strong>Rzeczywistość architektury</strong></h3>
<p>Problem z architekturą warstwową jest taki, że w rzeczywistości wygląda ona nieco inaczej. Mamy moduły naszej aplikacji i przepływ od góry do dołu. Dopóki aplikacja nie jest duża, udaje nam się utrzymać prawidłowy przepływ. Problemem jest moment w którym <strong>aplikacja masowo przyrasta</strong> &#8211; zwiększa się ilość zespołów nad nią pracujących, powstają nowe, szybkie featuer&#8217;y. Biznes chce widzieć efekty jak najszybciej, tworzy presję na developerach a to zazwyczaj prowadzi do tego, że nie myślimy o designie aplikacji jako całości. Skupiamy się wyłącznie na tym co chemy dostarczyć w tym momencie &#8211; jak najszybciej. Końcowo doprowadza to do architektury warstwowej, która już nie wygląda tak pięknie jak była przedstawiana w tutorialach.</p>
<figure id="attachment_1436" aria-describedby="caption-attachment-1436" style="width: 1203px" class="wp-caption aligncenter"><a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/rzeczywistosc-warstw/" rel="attachment wp-att-1436"><img decoding="async" class="wp-image-1436 size-full" src="https://www.bdabek.pl/wp-content/uploads/2020/08/rzeczywistosc-warstw.png" alt="" width="1203" height="745" srcset="https://www.bdabek.pl/wp-content/uploads/2020/08/rzeczywistosc-warstw.png 1203w, https://www.bdabek.pl/wp-content/uploads/2020/08/rzeczywistosc-warstw-300x186.png 300w, https://www.bdabek.pl/wp-content/uploads/2020/08/rzeczywistosc-warstw-1024x634.png 1024w, https://www.bdabek.pl/wp-content/uploads/2020/08/rzeczywistosc-warstw-768x476.png 768w" sizes="(max-width: 1203px) 100vw, 1203px" /></a><figcaption id="caption-attachment-1436" class="wp-caption-text">Obrazek pochodzi z kursu DNA</figcaption></figure>
<p>Istnieje rozwiązanie tego problemu. Wymaga ono jednak zastanowienia się do czego będzie nam służyć dany feature. Czy nie powinien być on osadzony w osobnym module? Dodatkowy podział aplikacji na moduły &#8211; gdzie <strong>każdy z modułów ma swoją implementację architektury</strong> jest złotym środkiem. Wiem, że znajdą się przeciwnicy tego rozwiązania mówiąc, że robi nam się wtedy misz-masz różnych styli architektonicznych. Macie rację :). Trzeba to dopasować odpowiednio do umiejętności zespołu. Co na przykład stoi na przeszkodzie żeby jeden moduł wykorzystywał architekturę trójwarstwową a drugi dwuwarstwową? Moim zdaniem nic. Należy tylko umieć odpowiednio <em>zdiagnozować</em> problem jaki rozwiązujemy. Sprawdzić, czy robimy CRUD&#8217;a czy coś co wymaga bardziej złożonej logiki. No i jeszcze bardzo ważne &#8211; <strong>trzymać się założeń jakie poczyniliśmy</strong>.</p>
<p>(Ot takie moje dumanie..)</p>
<hr id="Wady i zalety" />
<h3><strong>Wady i zalety architektury warstwowej</strong></h3>
<p><strong>Zalety:</strong></p>
<ul>
<li>Powszchechna. Większość ludzi ją zna i nie będzie miało problemu żeby odnaleźć się w projekcie.</li>
<li>Zmniejsza złożoność &#8211; warstwy niskopoziomowe możemy zastąpić warstwami wyższymi. Coś a&#8217;la fasada.</li>
<li>Separuje odpowiedzialność &#8211; pozwala na wymianę implementacji poszczególnej warstwy bez wpływu na inną</li>
</ul>
<p><strong>Wady:</strong></p>
<ul>
<li>Zmiany wymagane w wielu warstwach. Zmieniając warstwę widoku prawdopodobnie będziemy musieli również dotknąć warstwy logiki i persystencji.</li>
<li>Ukryty cel &#8211; patrząc na strukturę projektu nie jesteśmy w stanie powiedzieć jaki problem rozwiązuje. Dopiero spojrzenie w klasy znajdujące się w pakietach coś nam zaczyna podpowiadać.</li>
</ul>
<p>W wielu wpisach na mediach jako zaletę tej architektury wymienia się również testowalność. Nie zgadzam się z tym stwierdzeniem w 100% ale też nie neguję. Owszem, możemy testować wyłącznie jedną warstwę, tylko problem jaki widzę jest taki, że kończy się to na mockowaniu 99 obiektów i testowaniu jednej malutkiej funkcjonalności. To jest złe ale nie jest tragiczne. Tragedia przychodzi kiedy w mockowanych API powstają zmiany i nasz test dalej przechodzi pomimo, że już nie powinien. W taki sposób powstają testy, które zadawalają biznes pokryciem kodu ale w rzeczywistości są do wyrzucenia&#8230; to jest temat na inny wpis.</p>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="1379905354" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail lazyloaded" src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" data-src="https://cdn.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_150,h_150/https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" /></a></p>
<p>Architektura warstwowa to dobre rozwiązanie w wielu przypadkach. Pozwala na szybki rozwój aplikacji w początkowych fazach a dodatkowo dzięki jej zastosowaniu wiemy, że każdy nowy członek zespołu wdroży się w miarę szybko. Jeżeli tworzymy aplikację, która nie jest duża to moim zdaniem architektura warstwowa może spełnić swoje zadanie doskonale.</p>
<p>Czasami mamy inne potrzebny a realia są niestety takie, że większość programistów nie zna stylów architektury. To powoduje, że bez edukacji zespołu nie jesteśmy w stanie wdrożyć <em>czegoś</em> bardziej odpowiedniego. Dlatego ważne jest aby szerzyć wiedzę i uczyć się nowych rzeczy &#8211; również o architekturze <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://dzone.com/articles/layered-architecture-is-good#" target="_blank" rel="noopener noreferrer">Layered Architecture Is Good</a></strong></li>
<li><a href="https://medium.com/@priyalwalpita/software-architecture-patterns-layered-architecture-a3b89b71a057" target="_blank" rel="noopener noreferrer"><strong>Software Architecture Patterns — Layered Architecture</strong></a></li>
<li><strong><a href="https://learning.oreilly.com/library/view/software-architecture-patterns/9781491971437/" target="_blank" rel="noopener noreferrer">Software Architecture Patterns (Mark Richards) &#8211; Chapter 1. Layered Architecture</a></strong></li>
<li><strong><a href="https://martinfowler.com/eaaCatalog/serviceLayer.html" target="_blank" rel="noopener noreferrer">Patterns of Enterprise Application Architecture (Martin Fowler) &#8211; Service Layer</a></strong></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Kolejny wzorzec architektoniczny: <strong>Event-Driven Architecture</strong>. Myślę, że przelecimy przez wszystkie wzorce z książki Mark&#8217;a Richards&#8217;a. Jest to edukujące i ciekawe.</p>
<div id="wpd-post-rating" class="wpd-not-rated">
<div class="wpd-rating-wrap"></div>
</div>
<p>Artykuł <a href="https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/">Architektura warstwowa. Zło czy dobro? 🤔</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/architektura-warstwowa-zlo-czy-dobro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Anemic Domain Model vs Rich Domain Model &#8211; Co to❔❓</title>
		<link>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/</link>
					<comments>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/#comments</comments>
		
		<dc:creator><![CDATA[Bartosz Dąbek]]></dc:creator>
		<pubDate>Sat, 18 Jul 2020 10:00:31 +0000</pubDate>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Architektura]]></category>
		<guid isPermaLink="false">https://www.bdabek.pl/?p=1033</guid>

					<description><![CDATA[<p>Modele danych to podstawa programowania. Jak wyglądałyby nasze programy bez danych? W większości przypadków (o ile nie we wszystkich) nie miałyby one sensu. Rzemiosło dobrego programowania nie jest łatwe &#8211; wymaga dyscypliny, koncentracji i wiedzy. Z tą ostatnią bywa różnie&#8230; Dzisiejszy wpis będzie poświęcony dwom wzorcom modelowania danych &#8211; modelowi anemicznemu i bogatemu. Cześć  Na&#8230;&#160;<a href="https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/" rel="bookmark">Dowiedz się więcej &#187;<span class="screen-reader-text">Anemic Domain Model vs Rich Domain Model &#8211; Co to❔❓</span></a></p>
<p>Artykuł <a href="https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/">Anemic Domain Model vs Rich Domain Model &#8211; Co to❔❓</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Modele danych to podstawa programowania. Jak wyglądałyby nasze programy bez danych? W większości przypadków (o ile nie we wszystkich) nie miałyby one sensu. Rzemiosło <strong>dobrego programowania</strong> <strong>nie jest łatwe</strong> &#8211; wymaga <strong>dyscypliny</strong>, <strong>koncentracji</strong> i <strong>wiedzy</strong>. Z tą ostatnią bywa różnie&#8230; Dzisiejszy wpis będzie poświęcony dwom wzorcom modelowania danych &#8211; modelowi anemicznemu i bogatemu.</p>
<p><a href="https://www.bdabek.pl/?attachment_id=1347" rel="attachment wp-att-1347"><img decoding="async" class="aligncenter size-full wp-image-1347" src="https://www.bdabek.pl/wp-content/uploads/2020/07/Anemic-vs-Rich-Domain-Model.jpg" alt="" width="700" height="494" srcset="https://www.bdabek.pl/wp-content/uploads/2020/07/Anemic-vs-Rich-Domain-Model.jpg 700w, https://www.bdabek.pl/wp-content/uploads/2020/07/Anemic-vs-Rich-Domain-Model-300x212.jpg 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<hr />
<h4>Cześć <img decoding="async" class="emoji" role="img" draggable="false" src="https://s.w.org/images/core/emoji/12.0.0-1/svg/1f642.svg" alt="&#x1f642;" /></h4>
<p>Na przełomie czasów została rozwiązana już masa problemów z wykorzystaniem przeróżnych rozwiązań &#8211; jedne się sprawdziły, inne niekoniecznie. Problemy z jakimi stawiamy się jako programiści w teraźniejszości prawdopodobnie zostały już przepracowane przez kogoś innego. Myślę, że w 90% to co wyróżnia nasze programy to <strong>biznes</strong> i <strong>koncepcja</strong> za nim stojąca. Jednak jeżeli się zastanowimy to może się okazać, że każdy z tych biznesów ma coś wspólnego. Większość z rozwiązywanych problemów u swoich podstaw jest podobna&#8230; <em>Taka mysł na start, która z tym artykułem ma trochę wspólnego ale na ten temat można śmiało poświęcić cały osobny wpis.</em></p>
<p>A teraz nie przedłużając dalej. W dzisiejszym artykule:</p>
<ul>
<li><a href="#Czym jest model anemiczny?"><strong>Czym jest model anemiczny?</strong></a></li>
<li><a href="#Czym jest model bogaty?"><strong>Czym jest model bogaty?</strong></a></li>
<li><strong><a href="#Co jest lepsze?">Co jest lepsze?</a></strong></li>
</ul>
<hr id="Czym jest model anemiczny?" />
<h3>Czym jest model anemiczny?</h3>
<p>Model anemiczny to nic innego jak <b>model</b> <strong>posiadający dane</strong> (pola/atrybuty) oraz <strong>połączenia do innych modeli </strong>(referencje). Taki model będzie też posiadał zestaw <strong>getterów i setterów</strong>. Logika biznesowa takiego modelu jest używana przez różnego rodzaju<strong> serwisy, utilsy i inne manager&#8217;y</strong>. To one definiują zachowania i reguły.</p>
<p>Będąc w projektach komercyjnych od ponad 2 lat spotykałem się głównie z takim podejściem. Mogę przez to wnioskować, że jest ono nadużywane. <strong>Dlaczego tak się dzieje</strong>? Do głowy przychodzą mi trzy powody.</p>
<ul>
<li><strong>Jeden</strong> &#8211; wiele tutoriali zostało napisanych właśnie w taki sposób. Twórcy popularnych frameworków sugerują nam takie rozwiązania, poprzez <strong>przedstawianie nam poradników</strong> jak używać ich frameworków w szybki sposób.</li>
<li><strong>Dwa</strong> &#8211; nie zastanawiamy się nad tym do czego dany model jest potrzebny, jaki problem ma rozwiązywać. PO mówi: <em>feature będzie służył do rezerwacji hoteli, tutaj masz schemat bazy, wiesz jak to będzie wyglądać i <strong>działajmy</strong></em>. I później szybko klepiemy schemat bazy 1:1 z obiektami. A po miesiącu dochodzą nowe funkcjonalności, które &#8211; uwaga &#8211; opędzlowujemy przez nowe serwisy. I tak do momentu aż projekt umiera i piszemy go od nowa. Brzmi znajomo?</li>
<li><strong>Trzy</strong> &#8211; jest prosty w użyciu. Super prezentacja z Confitury z 2013 roku omawiająca ten problem : <strong><a href="https://youtu.be/SxqK8jo7vdY?t=331" target="_blank" rel="noopener noreferrer">Encja na twarz i pchasz</a></strong>.</li>
<li><strong>Cztery</strong> &#8211; nie mamy umiejętności. Powód <em>jeden</em> i <em>dwa</em> bardzo temu sprzyjają. <strong>Nie mamy czasu się nauczyć</strong> programować <em>inaczej</em>. Jeżeli obracamy się w środowisku, gdzie wszyscy pracują w taki sam sposób to być może nigdy nie będziemy mieli tego czasu na naukę. <strong>Smutna prawda</strong>.</li>
</ul>
<p>W roku 2003 <strong><a href="https://www.martinfowler.com/bliki/AnemicDomainModel.html" target="_blank" rel="noopener noreferrer">Martin Fowler</a> </strong>zdefiniował model anemiczny jako anty wzorzec. Zwraca on szczególną uwagę na brak spójności takiego podejścia z programowaniem obiektowym a nawet zarzuca, że jest to proceduralny styl projektowania.</p>
<blockquote>
<p style="text-align: center;"><em>The anemic domain model is really just a procedural style design&#8230;</em></p>
</blockquote>
<p>Jedną z fundamentalnych podstaw programowania obiektowego jest enkapsulacja. Co to oznacza? Nasze dane powinny być ukrywane. A my co robimy?</p><pre class="crayon-plain-tag">public class User {
   private String name;
   private String idNum;

   public String getName() {
      return name;
   }

   public String getIdNum() {
      return idNum;
   }

   public void setName(String newName) {
      name = newName;
   }

   public void setIdNum(String newId) {
      idNum = newId;
   }
}</pre><p>Na początku naszych 'karier&#8217; wmawia się nam, że enkapsulacja to ukrywanie pól i używanie akcesorów do nich. Błąd! <strong>Enkapsulacja polega na ukrywaniu danych</strong>! Tylko jeżeli ukryjesz dane modelu i nie zdefiniujesz w nim zachowań to w jaki sposób chcesz zmieniać jego stan?</p>
<hr id="Czym jest model bogaty?" />
<h3>Czym jest model bogaty?</h3>
<p>Model bogaty, w przeciwieństwie do anemicznego, poza samymi danymi definiuje również logikę domenową. <strong>Dane i zachowania są spójne</strong>. Zachowania są częścią i rezultatem modelu. Logika jest odpowiedzialna za inicjalizację obiektów, walidację i operowanie na modelu.</p>
<p>Dzięki takiemu podejściu klient danej domeny nie musi się martwić którego serwisu musi użyć. Albo czy zmieniając dane w jednym serwisie nie zepsuje logiki w innym. <strong>Wszystkie zmiany danych związane z obiektem są zdefiniowane właśnie w nim</strong>. Pozwala to kontrolować stan obiektu, dzięki czemu unikamy stanu niespójności.</p>
<p>Nie oznacza to, że całkowicie pozbywamy się serwisów. One nadal są &#8211; tylko służą nam do innych celów, np. wysyłanie maili. Cytat z książki <strong><a href="https://www.amazon.com/gp/product/0321125215" target="_blank" rel="noopener noreferrer">DDD</a> </strong>Erica Evans&#8217;a:</p>
<blockquote>
<p style="text-align: center;"><em>This layer is kept thin. It does not contain business rules or knowledge, but only coordinates tasks and delegates work to collaborations of domain objects in the next layer down. It does not have state reflecting the business situation, but it can have state that reflects the progress of a task for the user or the program.</em></p>
</blockquote>
<p>Nie będę w tym artykule się zagłębiał w podejście DDD, czym są agregaty, value objecty, itd. Przedstawię Ci natomiast prosty model subskrypcji, który jest implementacją modelu bogatego. Zachowania są definiowane razem z danymi i są ściśle powiązane z obiektem.</p><pre class="crayon-plain-tag">public class Subscription {
    
    private Status status = Activated;
    private final Clock clock;
    private final SubscriptionId subscriptionId;
    private final Enrollment enrollment;
    
    public static Subscription subscription(int maxSubscribers, int maxOnWaitingList) {
        return new Subscription(systemDefaultZone(), Enrollment.emptyWithCapacities(maxSubscribers, maxOnWaitingList), SubscriptionId.newOne());
    }

    public static Subscription subscription(int maxSubscribers, int maxOnWaitingList, SubscriptionId subscriptionId) {
        return new Subscription(systemDefaultZone(), Enrollment.emptyWithCapacities(maxSubscribers, maxOnWaitingList), subscriptionId);
    }

    Subscription(Clock clock, Enrollment enrollment, SubscriptionId subscriptionId) {
        this.clock = clock;
        this.enrollment = enrollment;
        this.subscriptionId = subscriptionId;
    }

    enum Status {
        Activated, Disabled
    }

    Result activate() {
        this.status = Activated;
        return success(new SubscriptionActivated(subscriptionId, Instant.now(clock)));
    }

    Result disable() {
        this.status = Disabled;
        return Result.success(new SubscriptionDisabled(subscriptionId, Instant.now(clock)));
    }
}</pre><p>Zero niepotrzebnych udostępnień danych. Wszystko wykonywane jest przez <strong>zdefiniowane zachowania</strong>. W tym przypadku klasa subskrypcji ma dwa bardzo proste zachowanie &#8211; może być aktywna lub nieaktywna. I tyle.</p>
<p>Oczywiście nie może być tak kolorowo, musisz zapłacić cenę za to aby Twój design szedł w taką stronę. <strong>Ceną jest czas i umiejętność komunikacji</strong>. My (developerzy) dostarczamy rozwiązania biznesom, które mają na tym zarobić. Oni wiedzą w jaki sposób ma działać ich biznes (ich domena). A my? No już nie koniecznie. Naszym zadaniem jest zdobyć tą wiedzę. Dopytywać, dociekać i dopiero wtedy projektować. Na youtubie możesz obejrzeć świetną <strong><a href="https://youtu.be/u4aFjePJJTM" target="_blank" rel="noopener noreferrer">prezentację Sławka Sobótki</a></strong>, która pokazuje taki proces event stormingu.</p>
<hr id="Co jest lepsze?" />
<h3>Co jest lepsze?</h3>
<p>Trochę 'clickbaitowo&#8217; rzuciłem hasło co jest lepsze. Oczywiście <strong>to zależy</strong>.</p>
<p><strong>Jeżeli piszesz CRUD&#8217;a</strong>, gdzie nie ma żadnej walidacji, żadnej logiki lub jest ale jest jej mało, to nie ma co się rozwodzić. Używasz modelu anemicznego i wykorzystujesz powiedzenie <em>encja na twarz i pchasz</em>.</p>
<p>Natomiast kiedy widzisz, że logika w domenie w jakiej pracujesz <strong>staje się skomplikowana</strong>, użyj modelu bogatego. Co to znaczy skomplikowana? Powstają nowe walidacje, zmieniają się stare reguły, dochodzą nowe &#8211; generalnie &#8211; jest dużo zmienności.</p>
<hr />
<h3>Podsumowanie</h3>
<p><a href="https://www.bdabek.pl/spring-boot-i-logi-ustawienia-logbacka/lightbulb/" rel="attachment wp-att-976" data-slb-active="1" data-slb-asset="528236216" data-slb-internal="976"><img decoding="async" class="aligncenter wp-image-976 size-thumbnail" src="https://www.bdabek.pl/wp-content/uploads/2020/05/Lightbulb-150x150.jpg" alt="" width="150" height="150" /></a></p>
<p><strong>Model anemiczny możesz tłumaczyć jako:</strong></p>
<ul>
<li>posiadający wyłącznie dane, nie posiadający <em>prawie</em> żadnej logiki.</li>
<li>serwisy zarządzają atrubytami takiego modelu poprzez akcesory i to one definiują logikę aplikacji</li>
<li>dane są oddzielone od reguł (zarządzają nimi serwisy)</li>
</ul>
<p><strong>Model bogaty natomiast:</strong></p>
<ul>
<li>logika jest zaimplementowana w obiektach modeli</li>
<li>serwisy stanowią jedynie cienką wartstwę wspomagającą serwisy trzecie (np. zapis do bazy, koordynacja zadań)</li>
<li>dane są dostępne tylko przez reguły (reguły to zachowania domenowe)</li>
</ul>
<p>&nbsp;</p>
<p>Źródła:</p>
<ul>
<li><strong><a href="https://blog.pragmatists.com/domain-driven-design-vs-anemic-model-how-do-they-differ-ffdee9371a86" target="_blank" rel="noopener noreferrer">Domain-Driven Design vs. anemic model. How do they differ?</a></strong></li>
<li><strong><a href="https://www.martinfowler.com/bliki/AnemicDomainModel.html" target="_blank" rel="noopener noreferrer">AnemicDomainModel</a></strong></li>
<li><strong><a href="https://amido.com/blog/anaemic-domain-model-vs-rich-domain-model/" target="_blank" rel="noopener noreferrer">Anaemic Domain Model vs. Rich Domain Model</a></strong></li>
<li><strong><a href="https://blog.inf.ed.ac.uk/sapm/2014/02/04/the-anaemic-domain-model-is-no-anti-pattern-its-a-solid-design/" target="_blank" rel="noopener noreferrer">The Anaemic Domain Model is no Anti-Pattern, it’s a SOLID design</a></strong></li>
<li><strong><a href="https://thevaluable.dev/anemic-domain-model/" target="_blank" rel="noopener noreferrer">Anemic Domain Model vs Rich Domain Model with Examples</a></strong></li>
</ul>
<hr />
<h3>Za tydzień</h3>
<p>Porozmawiamy o czasie w Javie. Co używać, jak używać i jakie są konekwencje.</p>
<p>Artykuł <a href="https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/">Anemic Domain Model vs Rich Domain Model &#8211; Co to❔❓</a> pochodzi z serwisu <a href="https://www.bdabek.pl">bdabek.pl</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.bdabek.pl/anemic-domain-model-vs-rich-domain-model/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
