+ All Categories
Home > Documents > going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java)...

going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java)...

Date post: 05-Jan-2020
Category:
Upload: others
View: 8 times
Download: 0 times
Share this document with a friend
41
JavaLand Kristian Kottke Going Reactive Reactive Microservices based on Vert.x
Transcript
Page 1: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

JavaLand

Kristian Kottke

Going ReactiveReactive Microservices

based on Vert.x

Page 2: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

Whoami

Kristian Kottke

› Lead Software Engineer -> iteratec

Interests

› Software Architecture

› Big Data Technologies

[email protected]

@_kkottke

github.com/kkottke

xing.to/kkottke

speakerdeck.com/kkottke

Page 3: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Page 4: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Photo by Markus Spiske on Unsplash

Page 5: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Microservice

cloud native

fau

lt t

ole

ran

ce

highly responsive

scalable

resilienthigh a

vailabili

ty

multi core

asynchronousflexibleloosely coupled

elastic

Reactive System

Page 6: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Reactive Systems

Page 7: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Reactive Manifesto

Responsive

ResilientElastic

Message Driven

Page 8: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Reactive Programming

!=

Reactive Systems

Page 9: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Page 10: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

...a toolkit for building reactive, non-blocking, asynchronous applications

on the JVM

(based on netty with additional modules)

Page 11: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

!=

Page 12: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

==

Page 13: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

!=

Page 14: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Page 15: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Event Bus

Host

JVM

Vert.x Instance

Verticle

(Java)

Verticle

(Java)

Verticle

(JS)

Verticle

(Kotlin)

JVM

Vert.x Instance

Verticle

(Java)

Verticle

(Java)

Verticle

(JS)

Verticle

(Kotlin)

Page 16: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Event Bus

Host

JVM

Vert.x Instance

Verticle

(Java)

Verticle

(Java)

Verticle

(JS)

Verticle

(Kotlin)

Host

JVM

Vert.x Instance

Verticle

(Java)

Verticle

(Java)

Verticle

(JS)

Verticle

(Kotlin)

Page 17: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Event Bus

Host

JVM

Vert.x Instance

Verticle

(Java)

Verticle

(Java)

Verticle

(JS)

Verticle

(Kotlin)Event Bus Bridge

Page 18: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Reactor Pattern

Event Queue

Event LoopHandler

Handler

Handler

Page 19: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Multi-Reactor Pattern

...

Page 20: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Code

Page 21: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Messa

ge

Traders

Generator

Service

Portfolio

Messa

ge

AuditElasticSearch

Kibana

Message

REST

Page 22: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

public static void main(String[] args) {

Vertx vertx = new Vertx();

vertx.deployVerticle(new RestApiVerticle());

}

Verticle

Page 23: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

public void start(Future<Void> future) {

HttpServer server = vertx.createHttpServer()

.requestHandler(req -> req.response().end(„hello“));

server.listen(8080, res -> {

if (res.succeeded()) {

future.complete();

} else {

future.fail(res.cause());

}});

}

RestApiVerticle

Page 24: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

Don’t call us, we’ll call you!

› Synchronous (blocking)

compute(1, 2);

› Asynchronous (non-blocking)

compute(1, 2, res -> {…});

› Everything is an event → Handler → Callback Hell → RX

Page 25: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

Digression: ReactiveX

› API for async programming with observable streams

› Observable

› Evolution of Callback, Promise, Future

› Subscribe: next, error, complete

› Completable, Single, Maybe, Flowable

› Reactive Operators

Observable

Observable

Subcriber

onNext

Produce

Page 26: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

public Completable rxStart() {

return vertx.createHttpServer()

.requestHandler(req -> req.response().end(„hello“))

.rxListen(8080)

.ignoreElement();

}

RestApiVerticle (rxified)

Page 27: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

public Completable rxStart() {

return OpenAPI3RouterFactory.rxCreate(vertx, „api.yml“)

.map(factory -> {

factory.addHandlerByOperationId(„op“, this:op);

return factory.getRouter();

})

.flatMap(router -> vertx.createHttpServer()

.requestHandler(router)

.rxListen(8080))

.ignoreElement();

}

Web API Contract

Page 28: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

public void publish(Message mes) {

vertx.eventBus().publish(„addr“, Json.encode(mes));

vertx.eventBus().rxSend(„addr“, Json.encode(mes));

}

public void handle() {

vertx.eventBus().<String>consumer(„addr“, m -> {

Message mes = Json.decodeValue(m.body(), Message.class);

....

}

}

Event Bus

Page 29: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Messa

ge

Traders

Generator

Service

Portfolio

Messa

ge

AuditElasticSearch

Kibana

Message

REST

Page 30: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

@ProxyGen

@VertxGen

public interface TradingService {

@Fluent

TradingService buy(int amount, JsonObject json,

Handler<AsyncResult<Portfolio>> handler);

}

Service Proxy (RPC)

Page 31: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

public void publish() {

ServiceDiscovery sd = ServiceDiscovery.create(vertx);

Record http = HttpEndpoint.createRecord(...);

Record message = MessageSource.createRecord(...);

Record service = EventBusService.createRecord(...);

sd.rxPublish(http);

}

Service Discovery

Page 32: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

public void consume() {

ServiceDiscovery sd = ServiceDiscovery.create(vertx);

client = HttpEndpoint.rxGetWebClient(sd, json);

consumer = MessageSource.rxGetConsumer(sd, json);

proxy = EventBusService.getServiceProxy(sd, ...);

}

Service Discovery

Page 33: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

Failure Handling

› Error Handler

› subscribe(success, error)

› Error Operator

› doOnError, onErrorReturn, ...

› Timeout Operator

› timeout

› Retry Operator

› retry, retryWhen

› Circuit Breaker

› breaker.execute(...)

Page 34: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

Are we reactive now?

› Reactive Programming

› Asynchronous, non-blocking

› Event-Driven

› Reactive System

› Responsive

› Resilient

› Elastic

› Message-Driven

Page 35: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Page 36: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

Modules

› Config

› Health Check

› Web (SockJS)

› Unit / Junit 5

› Web API Service

› gRPC

› Sync

Page 37: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

When/Why Vert.x?

› Small Services

› Reactive Application

› Scalability

› Cloud Environment

› Polyglot

Page 38: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

Demo

Page 39: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©it

era

tec

Wrap Up

› Toolkit for building reactive, non-blocking applications

› Multi-Reactor Pattern & Event Bus

› Asynchronous

› Event-Driven

› Performance & Scalability

Page 40: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

©iteratec

[email protected]

@_kkottke

github.com/kkottke

xing.to/kkottke

speakerdeck.com/kkottke

https://github.com/kkottke/stock-trading.git

Page 41: going reactive - DOAG Deutsche ORACLE-Anwendergruppe e.V. · Vert.x Instance Verticle (Java) Verticle (Java) Verticle (JS) Verticle (Kotlin) Event Bus ©iteratec Host JVM Vert.x Instance

www.iteratec.de

Contact

Kristian Kottke

[email protected]

@_kkottke

github.com/kkottke

xing.to/kkottke

speakerdeck.com/kkottke


Recommended