Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reactive Microservices based on Vert.x

Reactive Microservices based on Vert.x

Avatar for Kristian Kottke

Kristian Kottke

March 19, 2019
Tweet

More Decks by Kristian Kottke

Other Decks in Programming

Transcript

  1. ©iteratec 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
  2. ©iteratec Microservice cloud native fault tolerance highly responsive scalable resilient

    high availability multi core asynchronous flexible loosely coupled elastic Reactive System
  3. ©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)
  4. ©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)
  5. ©iteratec Event Bus Host JVM Vert.x Instance Verticle (Java) Verticle

    (Java) Verticle (JS) Verticle (Kotlin) Event Bus Bridge
  6. ©iteratec public static void main(String[] args) { Vertx vertx =

    new Vertx(); vertx.deployVerticle(new RestApiVerticle()); } Verticle
  7. ©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
  8. ©iteratec 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
  9. ©iteratec 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
  10. ©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
  11. ©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
  12. ©iteratec @ProxyGen @VertxGen public interface TradingService { @Fluent TradingService buy(int

    amount, JsonObject json, Handler<AsyncResult<Portfolio>> handler); } Service Proxy (RPC)
  13. ©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
  14. ©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
  15. ©iteratec Failure Handling ›Error Handler › subscribe(success, error) ›Error Operator

    › doOnError, onErrorReturn, ... ›Timeout Operator › timeout ›Retry Operator › retry, retryWhen ›Circuit Breaker › breaker.execute(...)
  16. ©iteratec Are we reactive now? ›Reactive Programming › Asynchronous, non-blocking

    › Event-Driven ›Reactive System › Responsive › Resilient › Elastic › Message-Driven
  17. ©iteratec Wrap Up ›Toolkit for building reactive, non-blocking applications ›Multi-Reactor

    Pattern & Event Bus › Asynchronous › Event-Driven › Performance & Scalability