Opracowanie: Mateusz Nowak (ZycieNaKodach.pl)
Szkolenie głównie skupione na technikach takich jak Event Storming, Event Modeling i Domain-Driven Design. Sam brałem nie raz udział w takich szkoleniach, ale żadne nie było jeszcze tak kompleksowe, aby prowadziło od fazy designu i karteczek na ścianie (teraz Miro) aż do działającego kodu. Kod startowy będzie dostępny w C# (.NET Core) / Kotlin (Spring) / TypeScript (Express). Wszystko zintegrowane poprzez EventStoreDB.
UWAGA! Kod ma najmniej abstrakcji jak tylko to możliwe, co nie jest najlepszą praktyką programistczyną w kontekście rozszerzalności. Jednakże ułatwi to zrozumienie co się dzieje, już w trakcie warsztatów.
W trakcie szkolenia dowiesz się wielu rzeczy i zastosujesz je w praktyce:
- Zobaczysz co to Bounded Context i jak stosować zasady SOLID na poziomie architektury
- Odkryjesz działanie omawianej domeny za pomocą Event Stormingu
- Wykonasz design systemu z użyciem Event Modelingu (na jakiej zasadzie wyznaczać mikroserwisy czy modularny monolit)
- Zobaczysz jak te praktyki pomagają zaplanować pracę i podzielić zadania
- Zaplanujesz rozszerzalną architekturę systemu i zobaczysz zależności między komponentami
- Wykonasz części systemu z wykorzystaniem Event Sourcingu i zastosujesz EventStore (zobaczysz jakie to proste z Event Modelingiem)
- Otrzymasz materiały do dalszego własnego rozwoju poznanych umiejętności
Techniki Domain-Driven Design naturalnie wpasowują się w EventModeling. Nie będziemy się skupiać na DDD, które przyjdzie naturalnie.
git clone https://github.com/nowakprojects/EventModelingGitHubClone.git
###Lokalnie UWAGA! Dużo osób zgłaszało problemy z uruchominiem poprzez docker-compose, więc zalecana jest ta instrukcja z uruchomieniem lokalnym.
Do wykonania ćwiczeń praktycznych, jeśli dysponujesz odpowiednim środowiskiem - najlepiej uruchomić:
- (WYMAGANE) EventStore (Docker). W głównym katalogu wykonaj:
docker-compose -f docker-compose.eventstore.yaml up
- (WYMAGANE) Frontend.
- W katalogu
frontend
na początek zależnie od tego, w jakim środowisku chcesz wykonywać zadania zmień nazwę pliku env z odpowiednim postfixem naenv.local
. - W katalogu
frontend
wykonaj kolejno:npm install
npm run start
- W katalogu
- (WYMAGANE) Backend NodeJS.
- Uruchom wg. swojego ulubionego sposobu LUB:
- W katalogu
backend-nodejs
wykonaj kolejno:npm install
npm run start:dev
- (OPCJONALNE - wybierz jedno) Backend .NET Core.
- Uruchom wg. swojego ulubionego sposobu LUB:
- W katalogu
backend-dotnet/EventModelingGitHubCloneDotNet/EventModelingGitHubCloneDotNet
wykonaj kolejno:dotnet restore
dotnet run
- (OPCJONALNE - wybierz jedno) Backend Kotlin
- Uruchom wg. swojego ulubionego sposobu LUB:
- W katalogu
backend-kotlin
wykonaj kolejno:./gradlew build
./gradlew bootRun
- W katalogu
- Uruchom wg. swojego ulubionego sposobu LUB:
Repozytorium zostało przygotowane w taki sposób, abyś mógł uruchomić projekty i wprowadzać zmiany bez posiadania zainstalowanych środowisk dla wszystkich języków programowania.
To, co jest wymagane to Docker Compose. Jedynie zmiany bibliotek niosą za sobą potrzebę przebudowania aplikacji:
docker-compose -f docker-compose.dev.yaml build
Później już wystarczy uruchamiać tylko poprzez:
docker-compose -f docker-compose.dev.yaml up
W tym przypadku wszelkie zmiany kodu czy nawet zmiennych środowiskowych wymagają przebudowania docker-compose. Odkomentuj z pliku docker-compose.build.yaml serwisy, na których będziesz chciał pracować i uruchom je lokalnie.
docker-compose -f docker-compose.build.yaml build
Później już wystarczy uruchamiać tylko poprzez:
docker-compose -f docker-compose.build.yaml up
Aplikacje uruchomione poprzez docker-compose, nie różnią się niczym od uruchomienia poszczególnych serwisów lokalnie.
Więc jeśli chcesz uruchomić coś lokalnie dla lepszego developer experience, to po prostu zakomentuj odpowiedni serwis w docker-compose.yaml
Po uruchomieniu będą dostępne następujące serwisy:
- Frontend: http://localhost:3000/ZycieNaKodach/EventModelingRepo/pulls
- Backend NodeJS: http://localhost:4000/swagger/
- Backend .NET: http://localhost:5000/swagger/index.html
- Backend Kotlin: http://localhost:7000/swagger-ui/
- EventStore: http://localhost:2113/ (user: admin password: changeit)
Upewnij się, że każdy z tych adresów odpowiada. Zależnie od tego czy wybrałeś .NET czy Kotlina.
Jeśli chcesz pisać w NodeJS wystarczy Ci sam Node.
Najdłużej trwa uruchomienie serwisu w Koltinie. W logach docker-compose powinieneś zobaczyć:
eventmodeling-backend-kotlin | 2021-04-01 09:29:39.922 INFO 447 --- [ restartedMain] p.z.e.g.GitHubCloneApplicationKt : Started GitHubCloneApplicationKt in 12.168 seconds (JVM running for 12.987)
Kod poszczególnych wersji backendu nie realizuje dokładnie tego samego, dlaczego tak jest, dowiesz się w trakcie szkolenia.
Aby skorzystać jak najwięcej ze szkolenia, musimy zbudować wspólne zrozumienie niektórych koncepcji. Przed szkoleniem dobrze zapoznać się z linkami poniżej.
-
I część - projektowanie / modelowanie (3 godziny)
- What is Event Modeling | https://eventmodeling.org/posts/what-is-event-modeling/
- EVENTSTORMING i 4 poziomy zdarzeń | https://www.youtube.com/watch?v=31PNdWaUrTY&feature=youtu.be
-
II część - implementacja (kolejne 3 godziny)
- A Functional Foundation for CQRS/ES | https://verraes.net/2014/05/functional-foundation-for-cqrs-event-sourcing/
- Zobacz co to EventSourcing:
- Zapoznaj się krótko z EventStoreDB:
Komunikacja w trakcie warsztatów:
- Wszyscy: Kanał Slack
- Głównie spotkanie: VBC
- Zespół 1: Google Meet
- Zespół 2: Google Meet
- 5 min. | Przywitanie i zapoznanie z MIRO Board
- 15 min. | Wstęp do Bounded Contextu i EventStormingu.
- Przykłady kodu
- Porównania przedstawiające sens stosowania BC
- Inne metody modelowania jak UML
- Szybkie ćwiczenie na EventStorming.
- 15 min. | EventStorming w MIRO - wprowadzenie
- Omówienie notacji
- Przykład modelowania
- 5 min. | Podział na zespoły
- 20 min. | Praca w zespołach nad domeną GitHub (cz. 1)
- 10 min. | Spotkanie wszystkich - pytania / wątpliwości
- 20 min. | Praca w zespołach nad domeną GitHub (cz. 2 - kontynuacja)
-
20 min. | EventModeling - wprowadzenie do praktyki
- Różnica między EventStormingiem
- Przykład modelowania na MIRO
- Przejście z ES do EM
- Wyznaczanie SLICE - dlaczego to takie ważne
-
5 min. | Rozejście się do zespołów
-
20 min. | Praca w zespołach nad EventModelingiem
-
15 min. | Spotkanie wszystkich - pytania / wątpliwości
-
30 min. | Kontynuacja pracy nad EventModelingiem
Dobrze w tym czasie upewnić się, że każdemu działa środowisko do implementacji.
- 45 min. | Od karteczek do implementacji - EventModeling
- Przejście przez przygotowany kod
- Dopisanie nowego kawałka
- Jak dzielić na slice i zadania
- Co to jest EventSourcing. Dlaczego to pomaga?
- Jak działa EventStore i dlaczego właśnie ta technologia?
- Przejście przez przygotowany kod
- 45 min. | Programowanie w zespołach
- 15 min. | CatchUp - problemy / pytania
- 45 min. | Programowanie w zespołach
- 15 min. | Zakończenie i materiały do dalszego rozwoju
KONIEC
-
EventModeling a Bakery https://www.youtube.com/watch?v=DhZBQWO34Pw
-
EventModelingTimeTrackingSystemMeetUp https://www.youtube.com/watch?v=DwC0rRzSVww&t=705s
-
EventModeling Slack: https://join.slack.com/t/eventmodeling/shared_invite/zt-94a7pu2e-ZWg~uPFGxB5I0GB~be664w
-
Event Modeling with Adam Dymitruk https://www.youtube.com/watch?v=jhybUa0_2eI
-
Event Modeling Deep Dive with Vaughn Vernon and Adam Dymitruk https://www.youtube.com/watch?v=ufKgwjsD1l8
-
EventDriven Podcast (Episode 5 - Vaughn Vernon on DDD/CQRS/ES) https://www.youtube.com/watch?v=PCgbeb8qPys
Examples:
- https://github.com/fraktalio/restaurant-demo
- https://github.com/fraktalio/order-demo
- https://github.com/fraktalio/courier-demo
MIRO BOARDS: https://miro.com/app/board/o9J_ktrevAQ=/ https://miro.com/app/board/o9J_kwc8qR0=/
Workshop - Cinema: https://miro.com/app/board/o9J_ktTXNi0=/ https://miro.com/app/board/o9J_krOfkGM=/ https://miro.com/app/board/o9J_krimJVY=/
Examples: https://github.com/eventmodeling/eventdriventhinking