63
LAGOM DIE RICHTIGE DOSIS MICROSERVICE Dr. Stefan Schlott und Armin Bauer ( ) BeOne Stuttgart GmbH

LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

LAGOMDIE RICHTIGE DOSIS MICROSERVICE

Dr. Stefan Schlott und Armin Bauer ( )BeOne Stuttgart GmbH

Page 2: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ABOUT.TXTStefan Schlott, BeOne Stuttgart GmbH

Advisory Consultant, Architekt, Java-Entwickler, Scala-Enthusiast, Linux-Jünger

Begeistert für Skalierbarkeit, Security, Privacy - undandere skurile Techniken ;-)

Page 3: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ABOUT.TXTArmin Bauer, BeOne Stuttgart GmbH

Senior Consultant, Architekt, Java-Entwickler, OpenSource - Fan, …

Begeistert für Technologie, MaschinelleSprachverarbeitung und Software Engineering

Page 4: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WIR WOLLENMICROSERVICES!(UND ANDERE MODERNE

TECHNOLOGIEN)

Page 5: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ZUR ERINNERUNG: WELCHEERWARTUNGEN STELLEN WIR AN DIE

EIGENSCHAFTEN VONMICROSERVICES?

Page 6: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

EIGENSCHAFTEN: GRÖSSE... sollte von einem Team gut zu bearbeiten sein... sollte als ganzes neu implementiert werden... sollte für neue Entwickler leicht zu verstehen sein

■■■

Page 7: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

EIGENSCHAFTEN: DOMÄNEJeder Microservice bearbeitet einen abgetrennten Teil der DomäneJeder Microservice hat eine eigene Datenstruktur die er verwaltetDie Microservices kommunizieren um miteinander zumInformationsaustausch

■■■

Page 8: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

UND WIE WAR DAS MIT REACTIVE?!

Page 9: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

EIGENSCHAFTEN: REACTIVE SYSTEMSScalable

Resilient

Responsive

Message Driven

(siehe )Reactive Manifesto

Page 10: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WEITERE BUZZWORDSCQRSEvent SourcingAsynchronous

■■■

Page 11: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

FÜR ALLES GIBT ES EINE LÖSUNG…

Page 12: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

FERTIG, ODER?

Page 13: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WILLKOMMEN IM ZOO!

Page 14: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DER TECHNOLOGIE-ZOOWie reden die Systeme miteinander?

Austauschbarkeit?

Muss ich das jetzt alles ansprechen?

Was muss ich jetzt händisch machen?

Wie bringe ich das auf meiner Entwicklermaschine zum laufen?

Setupzeit für neue Teammember?

Wer administriert das denn jetzt alles?

Page 15: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WAS IST LAGOM UND WASWILL ES IN MEINEM TEAM?

Page 16: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WORTHERKUNFT

Schwedisch: Genau die richtige Menge

Page 17: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WAS BRINGT LAGOM MIT?Gemeinsamer Deckel und API über die Tools und TechnologienGeschmackvolle Vorauswahl an Technologien„Opinionated“ FrameworkGemeinsamer Start aller ServicesHot Code Reload

■■■■■

Page 18: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

FÜR WEN IST LAGOM?Neue Microservice ProjekteRefactoring Tool für MonolithenJava API (und seit Lagom 1.3 auch eine Scala API)

■■■

Page 19: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

BEISPIELPROJEKT:GESCHENKE-DOODLE

Page 20: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

BESCHREIBUNGEs soll eine Software entwickelt werden, mit der mehrere Leute ein

gemeinsames Geschenk kaufen können

Der Initiator legt das Geschenk webbasiert anDie Mit-schenker können einen Betrag zum Geschenk dazugebenWenn das Ziel erreicht ist, erhält der Initiator eine Mail und weissnun, dass er das Geschenk kaufen kann

■■■

Page 21: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DOMÄNENMODELL UND ARCHITEKTUROrganize-Service: Verwaltung und Status der Geschenke

Contribute-Service: Entgegennehmen der einzelnen Beiträge

Mail-Service: Versand der Info-Mails

Page 22: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

NA DANN MAL LOS.

Page 23: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DIE IMPLEMENTIERUNG DESGESCHENK-DOODLE

Page 24: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DEFINITION VON SERVICES

Page 25: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WAS GEHÖRT ZURSERVICEDEFINITION?

Definition der Methoden die der Service anbietetDefinition der Datenstruktur für Request und Response für denService

■■

Page 26: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

BEISPIEL-SERVICEEin Java - Interface definiert die Methoden die der Service anbietet.

public interface OrganizeService extends Service { ServiceCall<NotUsed, PresentBaseInformation> getBaseInfo(String id); ServiceCall<PresentCreateRequest, PresentCreateResponse> organizePresent(); ServiceCall<NotUsed, PresentAdminInfo> getAdminInfo(String id);

@Override default Descriptor descriptor() { return Service.named("organizeservice").withCalls( Service.pathCall("/api/organize/create-present", this::organizePresent), Service.pathCall("/api/organize/admin/:id", this::getAdminInfo), Service.pathCall("/api/organize/get/:id", this::getBaseInfo) ).withAutoAcl(true); }}

Page 27: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WAS IST EIGENTLICH...Service.pathCall ... Mapping von Pfadelementen auf Methodenparametergenerics von ServiceCall ... Mapping von RequestBody auf ResponseBody TypNotUsed ... Bedeutet das es keinen Requestbody gibt.

Die verwendeten Typen sind einfache JSON-serialisierbare Objekte

Page 28: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ANGENEHM:Die gewählte Art von Abstraktion ist sehr weit von

HTTP als Transportschicht entfernt

Page 29: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DATENSTRUKTURAm gewohntesten als Beans mit Gettern und Settern, aber eleganter

wenn man es Immutable macht

@Immutable@JsonDeserializepublic class PresentAdminInfo { public final String organisator; public final String description; public final LocalDate deadline;

@JsonCreator public PresentAdminInfo(String orga, String description, LocalDate deadline) { this.organisator = orga; this.description = description; this.deadline = deadline; }}

Page 30: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

IMPLEMENTIERUNG VONSERVICES

Page 31: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

INTERFACEIMPLEMENTIEREN

Der Service implementiert zunächst das Interface

public class OrganizeServiceImpl implements OrganizeService { … @Override public ServiceCall<NotUsed, PresentBaseInformation> getBaseInfo(final String id) { return request -> persistentEntityRegistry.refFor(Present.class, id) .ask(GetPresentData.INSTANCE) .thenApplyAsync(PresentBaseInformation::of); } …}

Page 32: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DEPENDENCY INJECTIONMit Guice als Constructor Injection

public class OrganizeServiceImpl implements OrganizeService { private final PersistentEntityRegistry persistentEntityRegistry;

@Inject public OrganizeServiceImpl(PersistentEntityRegistry per) { persistentEntityRegistry = per; persistentEntityRegistry.register(Present.class); } …}

Page 33: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

SERVICE REGISTRIERENpublic class OrganizeServiceModule extends AbstractModule implements ServiceGuiceSupport { @Override protected void configure() { bindServices(serviceBinding(OrganizeService.class, OrganizeServiceImpl.class)); }}

Page 34: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

KONSUMIEREN VONSERVICES

Page 35: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

BINDEN DES INTERFACESpublic class FrontendModule extends AbstractModule implements ServiceClientGuiceSupport { @Override protected void configure() { bindClient(OrganizeService.class); … }}

Page 36: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

NUTZUNG DES INTERFACESAls Client: Interface per Injection anfordern

Lagom sorgt für Implementierung für Service-Zugriff

…inclusive „Service“ wie Circuit Breaker, etc.

Page 37: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

CQRS IN A NUTSHELL

Page 38: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WAS IST EVENT SOURCINGDie alte Welt:

Es gibt eine Datenbank mit dem aktuellen Zustand, ein Objektmodellmit dem aktuellen Zustand und ein ORM, das die beiden abgleicht

Die neue Welt: Speichere nicht den Zustand der Objekte sondern Events, die

diesen Zustand verändern

Page 39: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt
Page 40: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WOZU?Es ist nachvollziehbar, durch welche Änderungen der aktuelle

Zustand zustande gekommen ist.

Es können inkrementelle Snapshots der Events erzeugt werden.

Zustandsänderungen sind leicht zwischen Instanzen zu syncen.

Sehr gute Performance-Charakteristik.

Page 41: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

WIE IST ES IN LAGOMUMGESETZT?

Zu jeder Entity gibt es einen World-State.

Sendet man ein Command an eine Entity, so löst dieser einen Eventaus, der den World State verändert.

Die Events werden persistent gespeichert.

Der World State kann zu jedem Zeitpunkt rekonstruiert werden.

Page 42: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

EINE PERSISTENT ENTITYDEFINIEREN

Entity besteht immer aus Commands, Events und einem World-State

public class Present extends PersistentEntity< PresentCommand, PresentEvent, PresentWorldState> {

@Override public Behavior initialBehavior( final Optional<PresentWorldState> snapshotState) { final BehaviorBuilder builder = newBehaviorBuilder( snapshotState .orElse(new PresentWorldState(null, null, null, null, null))); // Command Handler: … // Event Handler: … // Readonly Commands: … return builder.build(); }}

Page 43: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

REAGIEREN AUF READONLY-COMMANDS

Ein Readonly Command ändert den Worldstate nicht

// Readonly Commands: get Present Databuilder.setReadOnlyCommandHandler(GetPresentData.class, (cmd, ctx) -> ctx.reply(state()));

state() ... gibt den aktuellen World-State des Objekts zurück

Page 44: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

REAGIEREN AUF ANDERECOMMANDS

Ein Command ändert den Worldstate durch Aufrufen eines Events:

// Command Handler: Neues Geschenk erzeugenbuilder.setCommandHandler(CreatePresent.class, (cmd, ctx) -> { final PresentCreatedEvent event = new PresentCreatedEvent(cmd.id, cmd.organisatorName, cmd.organisatorMail, cmd.deadline, cmd.description); return ctx.thenPersist(event, evt -> ctx.reply(state()));});

Auch hier stünde für ändernde Events der World-State mit state()zur Verfügung.

Page 45: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

REAGIEREN AUF EVENTSEin Event ersetzt den World-State durch einen anderen. Der World-

State an sich ist Immutable.

Vorteile: Keine Nebenläufigkeit, nur Zustandsübergänge

builder.setEventHandler( PresentCreatedEvent.class, event -> new PresentWorldState(event.id, event.organisatorName, event.organisatorMail, event.deadline, event.description));

Page 46: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

MESSAGE QUEUE / EVENTS

Page 47: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ABGRENZUNGBisher:

Ein Service der Daten braucht, die einem anderen Service gehörenfragt diesen an. User erlebt die Antwort synchron.

Neu:

Ein Service dem Daten gehören stellt diese einem anderen zurdurch einen Message Broker Verfügung.

(Publish / Subscribe Pattern)

Page 48: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt
Page 49: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ANWENDUNGSBEISPIELContribute-Service: Interessiert an jedem Einzelbeitrag (wer wieviel)

Organize-Service: Interessiert an Gesamtsumme (kommt dasGeschenk zustande?)

→ Entkopplung durch Messages

Page 50: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

RÜCKBLENDE: PUB/SUBPublisher senden Nachrichten an Kanäle (Topics). Topics sind

meistens als Warteschlangen definiert

Subscriber holen die Nachrichten aus den Topics ab, verarbeitensie und schicken ggf. neue Nachrichten oder Antworten

Nachrichten werden aus dem Topic gelöscht, wenn…

…eine vorgegebene Zeit die sie bestehen sollen abgelaufen ist…eine eingestellte Anzahl Subscriber sie entfangen hat…ein Subscriber sie bearbeitet und explizit gelöscht hat

■■■

Page 51: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

EIGENSCHAFTEN: PUB/SUBlose KopplungSkalierbarkeitSemantik nicht flexibelZustellung der Nachricht kann unter Umständen nicht garantiertwerden

■■■■

Page 52: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DEFINITION IM SERVICEDie Definition eines solchen Service-Listeners erfolgt analog zu der

von Web-Aufrufen:

public interface ContributeService extends Service { (…)

@Override default Descriptor descriptor() { return named("contributeservice").withCalls( (…) ).publishing( topic("contributions", this::contributionsTopic) ).withAutoAcl(true); }

Topic contributionsTopic();}

Page 53: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

PUBLISHBeispielsweise auf Events aus dem CQRS hören um zu publishen.

public Topic contributionsTopic() { return TopicProducer.singleStreamWithOffset(offset -> persistentEntityRegistry .eventStream(ContribEvent.EVENT_TAG, offset) .map(this::convertEvent) );}

Page 54: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

SUBSCRIBERegistrieren als Subscriber, sodass wenn eine Nachricht eingeht

eine Aktion ausgeführt wird.

contributeService.contributionsTopic() .subscribe() .atLeastOnce(Flow.fromFunction((contributionEvent) -> { // Handle event return Done.getInstance(); }));

Page 55: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

UNTERSTÜTZTE BROKERLagom schreibt nicht einen Broker vor, unterstützt werden

Beispielsweise:

Google Cloud Pub/SubKafkaRabbitMQ

■■■

Page 56: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DINGE DIE WIRAUSGELASSEN HABEN...

Page 57: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

SERVICE DISCOVERY UNDDEPLOYMENT

Lightbend bietet ConductR an, was sich um scaling und servicediscovery kümmert.

Es gibt ein Plugin für Consul als Service Discovery und der Serviceläuft auch in einem Docker Container.

Page 58: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

DIE ANDEREN ARBEITEN ABER MITFRAMEWORK X...

Der Vorteil von Microservices ist, dass jeder Service mit deroptimalen Technologie arbeiten kann

Daher ist es in Lagom vorgesehen, auch andere Serviceskonsumieren zu können

Page 59: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ICH BRAUCHE DIESE LIBRARY GANZDRINGEND...

Libraries generell integrierbar, zB via Dependency Injection.

Vorsicht: Requests sollten nicht blockieren.

Page 60: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

ICH HAB ABER SCHON EINE SERVICEDISCOVERY...

Prinzipiell steht nichts im Wege eine andere Art von ServiceDiscovery zu benutzen

Page 61: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

UNSER FAZITSehr mächtiges Framework

Deckt mit generischer API quasi alle Aspekte modernerMicroservice-Entwicklung ab

Sehr angenehm: Kurze Setup-Zeit für Entwickler-Maschinen, Code-Reloading

Gefühlt (noch?) etwas schwierig, wenn man vom Standardwegabweichen will (Beispiel: Message Queues)

…aber: Noch jung, da dürfen wir noch mehr erwarten!

Page 63: LAGOM...Lagom sorgt für Implementierung für Service-Zugriff …inclusive „Service“ wie Circuit Breaker, etc. CQRS IN A NUTSHELL WAS IST EVENT SOURCING Die alte Welt: Es gibt

BILDQUELLEN

by Microsoft■ Lagom Wortherkunft■ CQRS pattern