SlideShare une entreprise Scribd logo
1  sur  217
Reactive & Distributed
Orkhan Gasimov
Digital Transformation Architect @ GlobalLogic
15 years of software engineering;
training & mentorship;
author of trainings about:
Microservices;
Spring Cloud;
Akka;
2Speaker
Concept & Architecture
3Agenda
What is Vert.x?
4Agenda
Why Vert.x is Reactive?
5Agenda
How Vert.x is Distributed?
6Agenda
Evolution
Distributed Application Design
8
Enterprise
Evolution
9
Enterprise
App Server
Evolution
10
Enterprise
App Server
Module
Module
Module
Module
Evolution
11
Enterprise
Evolution
App Server 1
Module
Module
Module
Module
App Server N
Module
Module
Module
Module
…
12
Enterprise
Evolution
App Server 1
Module
Module
Module
Module
App Server N
Module
Module
Module
Module
Admin Server
Deployment & Configuration
13
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Admin Server
Deployment & Configuration
14
Enterprise
Evolution
Admin Server
Deployment & Configuration
App
App
App
App
App
App
App
App
15
Enterprise
Evolution
App
App
App
App
App
App
App
App
Discovery & Configuration
Microservices
16
Enterprise
Evolution
App
App
App
App
App
App
App
App
App
App
App App
App
App
App
App
App
App
App
App
Discovery & Configuration
Microservices
17
Enterprise
Evolution
App
App
App
App
App
App
App
App
App
App
App App
App
App
App
App
App
App
App
App
Server
Discovery & Configuration
Microservices
18
Enterprise
Evolution
App
App
App
App
App
App
App
App
App
App
App App
App
App
App
App
App
App
App
App
Server
Modules
Discovery & Configuration
Microservices
19
Enterprise
Evolution
App
App
App
App
App
App
App
App
App
App
App App
App
App
App
App
App
App
App
App
Server
Modules
JDBC
Discovery & Configuration
Microservices
20
Enterprise
Evolution
App
App
App
App
App
App
App
App
App
App
App App
App
App
App
App
App
App
App
App
Server
Modules
JDBC ?
Discovery & Configuration
Microservices
21
Enterprise
Evolution
App
App
App
App
App
App
App
App
App
App
App App
App
App
App
App
App
App
App
App
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Discovery & Configuration
Microservices
22
Enterprise
Evolution
App
App
App
App
App
App
App
App
App
App
App App
App
App
App
App
App
App
App
App
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Server
Modules
JDBC ?
Discovery & Configuration
Microservices
23
Enterprise
Evolution
App
App
App
App
App
App
App
App
Discovery & Configuration
Microservices
24
Enterprise
Evolution
App
App
App
App
App
App
App
App
Microservices Microservices
Discovery & Configuration
25
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
26
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
27
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
28
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
29
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
30
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
31
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
32
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP
33
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
34
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
Event
Bus
35
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
Event
Bus
36
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
Event
Bus
External
Apps
37
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
Event
Bus
External
Apps
IoT
38
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
Event
Bus
External
Apps
Cloud IoT
39
Enterprise
Evolution
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
MicroservicesMicroservices
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
Event
Bus
External
Apps
Polyglot
Cloud IoT
40Some silly slide
Vert.x
Reactive & Distributed
42What is Vert.x?
43Framework
Framework Your Code
44Library
Library Your Code
45Toolkit
46Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
47Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
48Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
49Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
50Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
51Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
52Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
53Java Example
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
JsonObject mySQLClientConfig = new JsonObject().put("host", "localhost").put("database", "test");
SQLClient sqlClient = MySQLClient.createShared(vertx, mySQLClientConfig);
router.get("/hello/:name").produces("text/plain").handler(routingContext -> {
String name = routingContext.pathParam("name");
HttpServerResponse response = routingContext.response();
sqlClient.updateWithParams("INSERT INTO names (name) VALUES (?)", new JsonArray().add(name), event -> {
if (event.succeeded()) {
response.end("Hello " + name);
} else {
System.out.println("Could not INSERT to database with cause: " + event.cause());
response.setStatusCode(500);
response.end();
}
});
});
HttpServer server = vertx.createHttpServer();
server.requestHandler(router::accept).listen(8080);
Reactor Pattern
54Vert.x Core
Event Loop
(single thread,
non blocking)
Reactor Pattern
55Vert.x Core
Event Loop
(single thread,
non blocking)
Worker
Worker
Worker
delegate long
running jobs & IO
callback
Multi-Reactor
56Vert.x Core
Worker
Worker
Worker
delegate long
running jobs & IO
callback
Event
Loops
Event Bus
57Vert.x Core
Worker
Worker
Worker
delegate long
running jobs & IO
callback
Event
Loops
H
H
H
H
Basic Architecture
58Vert.x Core
Worker
Worker
Worker
delegate long
running jobs & IO
callback
Event
Loops
H
Client
Client
Client
H
H
H
request
response
Deployment Model
Verticles
60Verticle
public class MyVerticle extends AbstractVerticle {
private HttpServer server;
@Override
public void start(Future<Void> startFuture) {
server = vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
});
server.listen(8080, res -> {
if (res.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(res.cause());
}
});
}
@Override
public void stop(Future<Void> stopFuture) {
//...
}
}
61Verticle
public class MyVerticle extends AbstractVerticle {
private HttpServer server;
@Override
public void start(Future<Void> startFuture) {
server = vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
});
server.listen(8080, res -> {
if (res.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(res.cause());
}
});
}
@Override
public void stop(Future<Void> stopFuture) {
//...
}
}
62Verticle
public class MyVerticle extends AbstractVerticle {
private HttpServer server;
@Override
public void start(Future<Void> startFuture) {
server = vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
});
server.listen(8080, res -> {
if (res.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(res.cause());
}
});
}
@Override
public void stop(Future<Void> stopFuture) {
//...
}
}
63Verticle
public class MyVerticle extends AbstractVerticle {
private HttpServer server;
@Override
public void start(Future<Void> startFuture) {
server = vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
});
server.listen(8080, res -> {
if (res.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(res.cause());
}
});
}
@Override
public void stop(Future<Void> stopFuture) {
//...
}
}
64Verticle
public class MyVerticle extends AbstractVerticle {
private HttpServer server;
@Override
public void start(Future<Void> startFuture) {
server = vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
});
server.listen(8080, res -> {
if (res.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(res.cause());
}
});
}
@Override
public void stop(Future<Void> stopFuture) {
//...
}
}
65Verticle
public class MyVerticle extends AbstractVerticle {
private HttpServer server;
@Override
public void start(Future<Void> startFuture) {
server = vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
});
server.listen(8080, res -> {
if (res.succeeded()) {
startFuture.complete();
} else {
startFuture.fail(res.cause());
}
});
}
@Override
public void stop(Future<Void> stopFuture) {
//...
}
}
Standard Verticles
Run on an event loop thread
Verticles 66
Worker Verticles
Run on the worker pool & never executed concurrently
Verticles 67
Worker Verticles
Run on the worker pool & never executed concurrently
Verticles
DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
68
Multi-Threaded Worker Verticles
Run on the worker pool & can be executed concurrently
Verticles 69
70Verticles
Verticle
Handler Handler Handler
Handler Handler Handler
71Verticles
Verticle Verticle Verticle
Verticle Verticle Verticle
Verticle Verticle Verticle
72Event Loops
Verticle Verticle Verticle
Verticle Verticle Verticle
Event
Loop
Event
Loop
Verticle Verticle Verticle
73Event Bus
Verticle
EVENT
BUS
Verticle Verticle
Verticle Verticle Verticle
Event
Loop
Event
Loop
Verticle Verticle Verticle
74Vert.x Runtime
Verticle
EVENT
BUS
Verticle Verticle
Verticle Verticle Verticle
Event
Loop
Event
Loop
Verticle Verticle Verticle
75Vert.x Runtime
Socket 1
…
...
Socket N
Verticle
EVENT
BUS
Verticle Verticle
Verticle Verticle Verticle
Event
Loop
Event
Loop
Verticle Verticle Verticle
76Vert.x Runtime
Socket 1
…
...
Socket N
Verticle
EVENT
BUS
Verticle Verticle
Verticle Verticle Verticle
CPU
Core
CPU
Core
Event
Loop
Event
Loop
Verticle Verticle Verticle
Cluster
High Availability
High Availability 78
High Availability 79
High Availability 80
High Availability 81
High Availability 82
High Availability 83
Regions 84
Availability Zones 85
High Availability 86
High Availability 87
High Availability 88
High Availability 89
Cluster Manager
Vert.x
Instance
Vert.x
Instance
Vert.x
Instance
90
Cluster Manager
Cluster
Manager
Vert.x
Instance
Vert.x
Instance
Vert.x
Instance
91
Default:
Hazelcast
Cluster Manager
Cluster
Manager
Vert.x
Instance
Vert.x
Instance
Vert.x
Instance
92
Default:
Hazelcast
Alternatives:
Infinispan
Ignite
Zookeper
Cluster Manager
Cluster
Manager
Vert.x
Instance
Vert.x
Instance
Vert.x
Instance
93
Default:
Hazelcast
Alternatives:
Infinispan
Ignite
Zookeper
3rd party:
Atomix & etc.
Cluster Manager
Cluster
Manager
Vert.x
Instance
Vert.x
Instance
Vert.x
Instance
94
$ vertx run myVerticle -ha
Fail-Over
Vert.x Instance 1 Vert.x Instance N
...
Verticle
95
$ vertx run myVerticle -ha
Fail-Over
Vert.x Instance 1 Vert.x Instance N
...
Verticle
96
$ vertx run myVerticle -ha
Fail-Over
Vert.x Instance 1 Vert.x Instance N
...
Verticle
97
$ vertx run myVerticle -ha -hagroup group-1
Groups
Group-1
Vert.x Instance 1 Vert.x Instance N
Group-2
Vert.x Instance 1 Vert.x Instance N
...
...
Verticle
Verticle
98
$ vertx run myVerticle -ha -hagroup group-1
Groups
Group 1
Vert.x Instance 1 Vert.x Instance N
Group 2
Vert.x Instance 1 Vert.x Instance N
...
...
Verticle
Verticle
99
$ vertx run myVerticle -ha -hagroup group-1
Groups
Group 1
Vert.x Instance 1 Vert.x Instance N
Group 2
Vert.x Instance 1 Vert.x Instance N
...
...
Verticle
Verticle
100
$ vertx run myVerticle -ha -quorum 3
Quorum
Vert.x Instance 2
Vert.x Instance 3
Verticle
Verticle
Vert.x Instance 1
Verticle
101
$ vertx run myVerticle -ha -quorum 3
Quorum
Vert.x Instance 1 Vert.x Instance 2
Verticle
Vert.x Instance 3
Verticle
Verticle
102
$ vertx run myVerticle -ha -quorum 3
Quorum
Vert.x Instance 1 Vert.x Instance 2
Vert.x Instance 3
103
$ vertx run myVerticle -ha -quorum 3
Quorum
Vert.x Instance 2
Vert.x Instance 3
Vert.x Instance 1
104
$ vertx run myVerticle -ha -quorum 3
Quorum
Vert.x Instance 2
Vert.x Instance 3
Verticle
Verticle
Vert.x Instance 1
Verticle
105
Round-robin by default
Load Balancing
Verticle
Verticle
Verticle
Verticle
VerticleVerticle
1 2
3
106
Shared Data
SharedData sd = vertx.sharedData();
//Local
LocalMap<String, String> localMap = sd.getLocalMap("myLocalMap");
localMap.put("foo", "bar");
String val = localMap.get("foo");
//Async
sd.<String, String>getAsyncMap("myAsyncMap", res -> {
if (res.succeeded()) {
AsyncMap<String, String> asyncMap = res.result();
} else {
//fail
}
});
Maps 108
SharedData sd = vertx.sharedData();
//Local
LocalMap<String, String> localMap = sd.getLocalMap("myLocalMap");
localMap.put("foo", "bar");
String val = localMap.get("foo");
//Async
sd.<String, String>getAsyncMap("myAsyncMap", res -> {
if (res.succeeded()) {
AsyncMap<String, String> asyncMap = res.result();
} else {
//fail
}
});
Maps 109
SharedData sd = vertx.sharedData();
//Local
LocalMap<String, String> localMap = sd.getLocalMap("myLocalMap");
localMap.put("foo", "bar");
String val = localMap.get("foo");
//Async
sd.<String, String>getAsyncMap("myAsyncMap", res -> {
if (res.succeeded()) {
AsyncMap<String, String> asyncMap = res.result();
} else {
//fail
}
});
Maps 110
...
//Async get
asyncMap.put("foo", "bar", resPut -> {
if (resPut.succeeded()) { /*success*/ } else { /*fail*/ }
});
//Async put
asyncMap.get("foo", resGet -> {
if (resGet.succeeded()) {
Object val = resGet.result();
} else {
//fail
}
});
Maps 111
...
//Async get
asyncMap.put("foo", "bar", resPut -> {
if (resPut.succeeded()) { /*success*/ } else { /*fail*/ }
});
//Async put
asyncMap.get("foo", resGet -> {
if (resGet.succeeded()) {
Object val = resGet.result();
} else {
//fail
}
});
Maps 112
sd.getLock("mylock", res -> {
if (res.succeeded()) {
Lock lock = res.result();
// 5 seconds later we release the lock so someone else can get it
vertx.setTimer(5000, tid -> lock.release());
} else {
// Something went wrong
}
});
sd.getLockWithTimeout("mylock", 10000, res -> {
if (res.succeeded()) {
Lock lock = res.result();
} else {
// Failed to get lock
}
});
Locks 113
sd.getLock("mylock", res -> {
if (res.succeeded()) {
Lock lock = res.result();
// 5 seconds later we release the lock so someone else can get it
vertx.setTimer(5000, tid -> lock.release());
} else {
// Something went wrong
}
});
sd.getLockWithTimeout("mylock", 10000, res -> {
if (res.succeeded()) {
Lock lock = res.result();
} else {
// Failed to get lock
}
});
Locks 114
sd.getCounter("mycounter", res -> {
if (res.succeeded()) {
Counter counter = res.result();
} else {
// Something went wrong!
}
});
Counters 115
Other Features
Vert.x Core
• File System
Other Core Features 117
• File System
• TCP Servers & Clients
Other Core Features 118
• File System
• TCP Servers & Clients
• HTTP Servers & Clients
Other Core Features 119
• File System
• TCP Servers & Clients
• HTTP Servers & Clients
• UDP Servers & Clients
Other Core Features 120
• File System
• TCP Servers & Clients
• HTTP Servers & Clients
• UDP Servers & Clients
• DNS Client
Other Core Features 121
• File System
• TCP Servers & Clients
• HTTP Servers & Clients
• UDP Servers & Clients
• DNS Client
• Launcher (fat jars)
Other Core Features 122
Web
Server & Clients
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.post("/entity/:id").handler(routingContext -> {
// This handler will be called for every request
HttpServerResponse response = routingContext.response();
response.putHeader("content-type", "text/plain");
// Write to the response and end it
response.end("Hello World from Vert.x-Web!");
});
server.requestHandler(router::accept).listen(8080);
Web Server 124
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.post("/entity/:id").handler(routingContext -> {
// This handler will be called for every request
HttpServerResponse response = routingContext.response();
response.putHeader("content-type", "text/plain");
// Write to the response and end it
response.end("Hello World from Vert.x-Web!");
});
server.requestHandler(router::accept).listen(8080);
Web Server 125
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.post("/entity/:id").handler(routingContext -> {
// This handler will be called for every request
HttpServerResponse response = routingContext.response();
response.putHeader("content-type", "text/plain");
// Write to the response and end it
response.end("Hello World from Vert.x-Web!");
});
server.requestHandler(router::accept).listen(8080);
Web Server 126
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.post("/entity/:id").handler(routingContext -> {
// This handler will be called for every request
HttpServerResponse response = routingContext.response();
response.putHeader("content-type", "text/plain");
// Write to the response and end it
response.end("Hello World from Vert.x-Web!");
});
server.requestHandler(router::accept).listen(8080);
Web Server 127
WebClient client = WebClient.create(vertx);
client
.get(8080, "myserver.mycompany.com", "/some-uri")
.timeout(5000)
.addQueryParam("param", "param_value")
.send(ar -> {
if (ar.succeeded()) {
// Obtain response
HttpResponse<Buffer> response = ar.result();
System.out.println("Received response with status code" + response.statusCode());
} else {
System.out.println("Something went wrong " + ar.cause().getMessage());
}
});
Web Client 128
WebClient client = WebClient.create(vertx);
client
.get(8080, "myserver.mycompany.com", "/some-uri")
.timeout(5000)
.addQueryParam("param", "param_value")
.send(ar -> {
if (ar.succeeded()) {
// Obtain response
HttpResponse<Buffer> response = ar.result();
System.out.println("Received response with status code" + response.statusCode());
} else {
System.out.println("Something went wrong " + ar.cause().getMessage());
}
});
Web Client 129
WebClient client = WebClient.create(vertx);
client
.get(8080, "myserver.mycompany.com", "/some-uri")
.timeout(5000)
.addQueryParam("param", "param_value")
.send(ar -> {
if (ar.succeeded()) {
// Obtain response
HttpResponse<Buffer> response = ar.result();
System.out.println("Received response with status code" + response.statusCode());
} else {
System.out.println("Something went wrong " + ar.cause().getMessage());
}
});
Web Client 130
WebClient client = WebClient.create(vertx);
client
.get(8080, "myserver.mycompany.com", "/some-uri")
.timeout(5000)
.addQueryParam("param", "param_value")
.send(ar -> {
if (ar.succeeded()) {
// Obtain response
HttpResponse<Buffer> response = ar.result();
System.out.println("Received response with status code" + response.statusCode());
} else {
System.out.println("Something went wrong " + ar.cause().getMessage());
}
});
Web Client 131
WebClient client = WebClient.create(vertx);
client
.get(8080, "myserver.mycompany.com", "/some-uri")
.timeout(5000)
.addQueryParam("param", "param_value")
.send(ar -> {
if (ar.succeeded()) {
// Obtain response
HttpResponse<Buffer> response = ar.result();
System.out.println("Received response with status code" + response.statusCode());
} else {
System.out.println("Something went wrong " + ar.cause().getMessage());
}
});
Web Client 132
WebClient client = WebClient.create(vertx);
client
.get(8080, "myserver.mycompany.com", "/some-uri")
.timeout(5000)
.addQueryParam("param", "param_value")
.send(ar -> {
if (ar.succeeded()) {
// Obtain response
HttpResponse<Buffer> response = ar.result();
System.out.println("Received response with status code" + response.statusCode());
} else {
System.out.println("Something went wrong " + ar.cause().getMessage());
}
});
Web Client 133
client
.post(8080, "myserver.mycompany.com", "/some-uri")
.sendJsonObject(new JsonObject()
.put("firstName", "Dale")
.put("lastName", "Cooper"), ar -> {
if (ar.succeeded()) {
// Ok
}
});
client
.post(8080, "myserver.mycompany.com", "/some-uri")
.sendJson(new User("Dale", "Cooper"), ar -> {
if (ar.succeeded()) {
// Ok
}
});
Web Client 134
client
.post(8080, "myserver.mycompany.com", "/some-uri")
.sendJsonObject(new JsonObject()
.put("firstName", "Dale")
.put("lastName", "Cooper"), ar -> {
if (ar.succeeded()) {
// Ok
}
});
client
.post(8080, "myserver.mycompany.com", "/some-uri")
.sendJson(new User("Dale", "Cooper"), ar -> {
if (ar.succeeded()) {
// Ok
}
});
Web Client 135
HTTP Request Validation
API Contract 136
HTTP Request Validation
OpenAPI 3 Support (with automatic requests validation)
API Contract 137
Auth
Authentication & Authorization
• OAuth 2
• JWT
• Apache Shiro
• JDBC
• MongoDB
• .htdigest
• ... your implementation
Auth Prodivers 139
router.route("/private/somepath").handler(routingContext -> {
User user = routingContext.user();
user.isAuthorised("permission_or_authority", event -> {
//async handler
});
user.isAuthorised("role:role_name", event -> {
//async handler
});
});
Auth 140
router.route("/private/somepath").handler(routingContext -> {
User user = routingContext.user();
user.isAuthorised("permission_or_authority", event -> {
//async handler
});
user.isAuthorised("role:role_name", event -> {
//async handler
});
});
Auth 141
router.route("/private/somepath").handler(routingContext -> {
User user = routingContext.user();
user.isAuthorised("permission_or_authority", event -> {
//async handler
});
user.isAuthorised("role:role_name", event -> {
//async handler
});
});
Auth 142
Microservices
Microservices
Sales
144
Microservices
Sales
Users
145
Microservices
Sales
WarehouseUsers
146
Microservices
Sales
WarehouseUsers
DB
147
Microservices
Sales
Accounting
WarehouseUsers
DB
148
Microservices
Sales
Accounting
WarehouseUsers
StoresDB
149
Microservices
Sales
Accounting
WarehouseUsers
Stores
HTTP
HTTP HTTP
HTTP HTTP
DB
SQL
150
Microservices
Sales
Accounting
WarehouseUsers
Stores
HTTP
DB
SQL
151
Microservices
Sales
Accounting
WarehouseUsers
Stores
HTTP
DB
SQL
152
• Publish & Discover
• HTTP Endpoints
Service Discovery
Sales
Accounting
WarehouseUsers
Stores
HTTP
DB
SQL
153
• Publish & Discover
• HTTP Endpoints
• Data Sources
Service Discovery
Sales
Accounting
WarehouseUsers
Stores
HTTP
DB
SQL
154
• Publish & Discover
• HTTP Endpoints
• Data Sources
• Event Bus Services
Service Discovery
Sales
Accounting
WarehouseUsers
Stores
HTTP
DB
SQL
155
• Publish & Discover
• HTTP Endpoints
• Data Sources
• Event Bus Services
• Anything you can imagine
Service Discovery
Sales
Accounting
WarehouseUsers
Stores
HTTP
DB
SQL
156
Circuit Breaker 157
Closed
Success
Circuit Breaker 158
Closed
Open
Success
Too many fails
Circuit Breaker 159
Closed
Open
Success
Too many fails
Fast Fail
Circuit Breaker 160
Closed
Open
Half-Open
Success
Too many fails
Fast Fail
Try one request
Circuit Breaker 161
Closed
Open
Half-Open
Success
Too many fails
Fast Fail
Try one request
Fail
Circuit Breaker 162
Closed
Open
Half-Open
Success
Too many fails
Fast Fail
Try one request
Fail
Success
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
new CircuitBreakerOptions()
.setMaxFailures(5) // number of failure before opening the circuit
.setTimeout(2000) // consider a failure if the operation does not succeed in time
.setFallbackOnFailure(true) // do we call the fallback on failure
.setResetTimeout(10000) // time spent in open state before attempting to re-try
);
breaker.execute(future -> {
// future.complete(“success")
// future.fail("cause")
}).setHandler(ar -> {
// Get the operation result.
});
Circuit Breaker 163
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
new CircuitBreakerOptions()
.setMaxFailures(5) // number of failure before opening the circuit
.setTimeout(2000) // consider a failure if the operation does not succeed in time
.setFallbackOnFailure(true) // do we call the fallback on failure
.setResetTimeout(10000) // time spent in open state before attempting to re-try
);
breaker.execute(future -> {
// future.complete(“success")
// future.fail("cause")
}).setHandler(ar -> {
// Get the operation result.
});
Circuit Breaker 164
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
new CircuitBreakerOptions()
.setMaxFailures(5) // number of failure before opening the circuit
.setTimeout(2000) // consider a failure if the operation does not succeed in time
.setFallbackOnFailure(true) // do we call the fallback on failure
.setResetTimeout(10000) // time spent in open state before attempting to re-try
);
breaker.execute(future -> {
// future.complete(“success")
// future.fail("cause")
}).setHandler(ar -> {
// Get the operation result.
});
Circuit Breaker 165
CircuitBreaker breaker = CircuitBreaker.create("my-circuit-breaker", vertx,
new CircuitBreakerOptions()
.setMaxFailures(5) // number of failure before opening the circuit
.setTimeout(2000) // consider a failure if the operation does not succeed in time
.setFallbackOnFailure(true) // do we call the fallback on failure
.setResetTimeout(10000) // time spent in open state before attempting to re-try
);
breaker.executeWithFallback(future -> {
// future.complete(“success")
// future.fail("cause")
}, th -> {
// Fallback
return "Hello";
}).setHandler(ar -> {
// Get the operation result.
});
Circuit Breaker 166
• Formats
• Properties
• JSON
• YAML
• etc.
Config 167
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
168
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
169
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
170
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
171
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
172
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
• Git
173
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
• Git
• Kubernetes ConfigMap
174
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
• Git
• Kubernetes ConfigMap
• Redis
175
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
• Git
• Kubernetes ConfigMap
• Redis
• Zookeeper / Consul
176
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
• Git
• Kubernetes ConfigMap
• Redis
• Zookeeper / Consul
• Vault
177
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
• Git
• Kubernetes ConfigMap
• Redis
• Zookeeper / Consul
• Vault
• Spring Config Server
178
• Formats
• Properties
• JSON
• YAML
• etc.
Config
• Sources
• File / Directory
• Environment Variables
• System Properties
• HTTP
• Event Bus
• Git
• Kubernetes ConfigMap
• Redis
• Zookeeper / Consul
• Vault
• Spring Config Server
• etc.
179
Data Access
SQL & NoSQL
Out of the box
• SQL
• JDBC
• MySQL
• PostgreSQL
Data Access 181
Out of the box
• SQL
• JDBC
• MySQL
• PostgreSQL
• NoSQL
• MongoDB
• Redis
Data Access 182
Out of the box
• SQL
• JDBC
• MySQL
• PostgreSQL
• NoSQL
• MongoDB
• Redis
3rd party
• Anything...
Data Access 183
Integration
185Integration
• Event Bus Bridges
• TCP Bridge
186Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
187Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
188Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
• Messaging & Streaming
• RabbitMQ Client
189Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
• Messaging & Streaming
• RabbitMQ Client
• Kafka Client
190Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
• Messaging & Streaming
• RabbitMQ Client
• Kafka Client
• STOMP Server & Client
191Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
• Messaging & Streaming
• RabbitMQ Client
• Kafka Client
• STOMP Server & Client
• IoT
• MQTT
192Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
• Messaging & Streaming
• RabbitMQ Client
• Kafka Client
• STOMP Server & Client
• IoT
• MQTT
• Java EE
• JCA Resource Adaptor
193Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
• Messaging & Streaming
• RabbitMQ Client
• Kafka Client
• STOMP Server & Client
• IoT
• MQTT
• Java EE
• JCA Resource Adaptor
• Misc
• Mail Client
194Integration
• Event Bus Bridges
• TCP Bridge
• Camel Bridge
• AMQP Bridge
• Messaging & Streaming
• RabbitMQ Client
• Kafka Client
• STOMP Server & Client
• IoT
• MQTT
• Java EE
• JCA Resource Adaptor
• Misc
• Mail Client
• Consul Client
Metrics
Metrics 196
Micrometer
Metrics 197
Micrometer
SignalFx
StatsD
New Relix
Influx/Telegraf
JMXPrometheus
Netflix Atlas
CloudWatch
Datadog
Graphite
Ganglia Wavefront
Micrometer
Dropwizard
Health Check API
Metrics 198
Reactive
fileSystem
.rxReadFile("cities.txt").toFlowable()
.flatMap(buffer -> Flowable.fromArray(buffer.toString().split("r?n")))
.flatMap(city -> searchByCityName(httpClient, city))
.flatMap(HttpClientResponse::toFlowable)
.map(extractingWoeid())
.flatMap(cityId -> getDataByPlaceId(httpClient, cityId))
.flatMap(toBufferFlowable())
.map(Buffer::toJsonObject)
.map(toCityAndDayLength())
.subscribe(System.out::println, Throwable::printStackTrace);
Reactive Programming 200
Observable<Double> observable = vertx.eventBus().
<Double>consumer("heat-sensor").
bodyStream().
toObservable();
observable.
buffer(1, TimeUnit.SECONDS).
map(samples -> samples.
stream().
collect(Collectors.averagingDouble(d -> d))).
subscribe(heat -> {
vertx.eventBus().send("news-feed", "Current heat is " + heat);
});
Reactive Programming 201
• Vert.x supports
• RxJava 1
Reactive Programming 202
• Vert.x supports
• RxJava 1
• RxJava 2
Reactive Programming 203
• Vert.x supports
• RxJava 1
• RxJava 2
• Reactive Streams (publishers & subscribers)
Reactive Programming 204
Reactive Manifesto 205
Responsive
Message
Driven
Elastic Resilient
Reactive & Distributed
Vert.x Summary
Reactive & Distributed
Event Bus
207
Reactive & Distributed
Event Bus
208
Reactive & Distributed
Event Bus
Server 1 Server 2 Server 3 Server N...
209
Reactive & Distributed
Event Bus
Handler Handler Handler Handler Handler Handler
Server 1 Server 2 Server 3 Server N...
210
Reactive & Distributed
Module ModuleModule
Event Bus
Handler Handler Handler Handler Handler Handler
Server 1 Server 2 Server 3 Server N...
211
Reactive & Distributed 212
Bridged
Apps
Data
Access
Metrics
External
Apps
IoT
Devices
etc.
Module ModuleModule
Event Bus
Handler Handler Handler Handler Handler Handler
Server 1 Server 2 Server 3 Server N...
Reactive & Distributed 213
Bridged
Apps
Data
Access
Metrics
External
Apps
IoT
Devices
etc.
Module ModuleModule
Event Bus
Handler Handler Handler Handler Handler Handler
Server 1 Server 2 Server 3 Server N...
• Java
• JavaScript
• Groovy
• Ruby
• Ceylon
• Scala
• Kotlin
Polyglot 214
Bridged
Apps
Data
Access
Metrics
External
Apps
IoT
Devices
etc.
Module ModuleModule
Event Bus
Handler Handler Handler Handler Handler Handler
Server 1 Server 2 Server 3 Server N...
• JavaScript
• Vert.x event bus integration over SockJS for browser-based/node.js apps.
Polyglot 215
Bridged
Apps
Data
Access
Metrics
External
Apps
IoT
Devices
etc.
Module ModuleModule
Event Bus
Handler Handler Handler Handler Handler Handler
Server 1 Server 2 Server 3 Server N...
216Reactive & Distributed
Module
Module
Module
Module
Module
Module
Module
Module
Discovery & Configuration
Distributed Application
JDBC
Client
JDBC
?
? ?
HTTP? ?
Event
Bus
External
Apps
Polyglot
Cloud IoT
Thank You!
http://orkhan.io
http://fb.com/groups/reactive.distributed

Contenu connexe

Tendances

Maximize the power of OSGi
Maximize the power of OSGiMaximize the power of OSGi
Maximize the power of OSGiDavid Bosschaert
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadDavid Gómez García
 
Take Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersTake Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersNaresha K
 
Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018
Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018
Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018Chris Gillum
 
AAI 2236-Using the New Java Concurrency Utilities with IBM WebSphere
AAI 2236-Using the New Java Concurrency Utilities with IBM WebSphereAAI 2236-Using the New Java Concurrency Utilities with IBM WebSphere
AAI 2236-Using the New Java Concurrency Utilities with IBM WebSphereKevin Sutter
 
Wicket Security Presentation
Wicket Security PresentationWicket Security Presentation
Wicket Security Presentationmrmean
 
Provisioning with OSGi Subsystems and Repository using Apache Aries and Felix
Provisioning with OSGi Subsystems and Repository using Apache Aries and FelixProvisioning with OSGi Subsystems and Repository using Apache Aries and Felix
Provisioning with OSGi Subsystems and Repository using Apache Aries and FelixDavid Bosschaert
 
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R AugeHTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Augemfrancis
 
Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenJoshua Long
 
JavaFX for Business Application Developers
JavaFX for Business Application DevelopersJavaFX for Business Application Developers
JavaFX for Business Application DevelopersMichael Heinrichs
 
Building scalable applications with hazelcast
Building scalable applications with hazelcastBuilding scalable applications with hazelcast
Building scalable applications with hazelcastFuad Malikov
 
Service Oriented Web Development with OSGi - C Ziegeler
Service Oriented Web Development with OSGi - C ZiegelerService Oriented Web Development with OSGi - C Ziegeler
Service Oriented Web Development with OSGi - C Ziegelermfrancis
 
Coldbox developer training – session 5
Coldbox developer training – session 5Coldbox developer training – session 5
Coldbox developer training – session 5Billie Berzinskas
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Ryosuke Uchitate
 
Felix HTTP - Paving the road to the future
Felix HTTP - Paving the road to the futureFelix HTTP - Paving the road to the future
Felix HTTP - Paving the road to the futureMarcel Offermans
 
Deploying to azure web sites
Deploying to azure web sitesDeploying to azure web sites
Deploying to azure web sitesGiant Penguin
 
Spring Cloud Function — Going Serverless
Spring Cloud Function — Going ServerlessSpring Cloud Function — Going Serverless
Spring Cloud Function — Going ServerlessGlobalLogic Ukraine
 

Tendances (20)

Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発Springを用いた社内ライブラリ開発
Springを用いた社内ライブラリ開発
 
Dropwizard
DropwizardDropwizard
Dropwizard
 
Maximize the power of OSGi
Maximize the power of OSGiMaximize the power of OSGi
Maximize the power of OSGi
 
Java9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidadJava9 Beyond Modularity - Java 9 más allá de la modularidad
Java9 Beyond Modularity - Java 9 más allá de la modularidad
 
Take Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainersTake Control of your Integration Testing with TestContainers
Take Control of your Integration Testing with TestContainers
 
Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018
Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018
Advanced Durable Functions - Serverless Meetup Tokyo - Feb 2018
 
AAI 2236-Using the New Java Concurrency Utilities with IBM WebSphere
AAI 2236-Using the New Java Concurrency Utilities with IBM WebSphereAAI 2236-Using the New Java Concurrency Utilities with IBM WebSphere
AAI 2236-Using the New Java Concurrency Utilities with IBM WebSphere
 
Wicket Security Presentation
Wicket Security PresentationWicket Security Presentation
Wicket Security Presentation
 
Provisioning with OSGi Subsystems and Repository using Apache Aries and Felix
Provisioning with OSGi Subsystems and Repository using Apache Aries and FelixProvisioning with OSGi Subsystems and Repository using Apache Aries and Felix
Provisioning with OSGi Subsystems and Repository using Apache Aries and Felix
 
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R AugeHTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
HTTP Whiteboard - OSGI Compendium 6.0 - How web apps should have been! - R Auge
 
Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in Heaven
 
JavaFX for Business Application Developers
JavaFX for Business Application DevelopersJavaFX for Business Application Developers
JavaFX for Business Application Developers
 
Building scalable applications with hazelcast
Building scalable applications with hazelcastBuilding scalable applications with hazelcast
Building scalable applications with hazelcast
 
An intro to cqrs
An intro to cqrsAn intro to cqrs
An intro to cqrs
 
Service Oriented Web Development with OSGi - C Ziegeler
Service Oriented Web Development with OSGi - C ZiegelerService Oriented Web Development with OSGi - C Ziegeler
Service Oriented Web Development with OSGi - C Ziegeler
 
Coldbox developer training – session 5
Coldbox developer training – session 5Coldbox developer training – session 5
Coldbox developer training – session 5
 
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
 
Felix HTTP - Paving the road to the future
Felix HTTP - Paving the road to the futureFelix HTTP - Paving the road to the future
Felix HTTP - Paving the road to the future
 
Deploying to azure web sites
Deploying to azure web sitesDeploying to azure web sites
Deploying to azure web sites
 
Spring Cloud Function — Going Serverless
Spring Cloud Function — Going ServerlessSpring Cloud Function — Going Serverless
Spring Cloud Function — Going Serverless
 

Similaire à Vertx - Reactive & Distributed

Quick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase ServerQuick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase ServerNic Raboy
 
Cloud Native Serverless Java — Orkhan Gasimov
Cloud Native Serverless Java — Orkhan GasimovCloud Native Serverless Java — Orkhan Gasimov
Cloud Native Serverless Java — Orkhan GasimovGlobalLogic Ukraine
 
Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?” Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?” Dakiry
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMichael Dawson
 
DeployR: Revolution R Enterprise with Business Intelligence Applications
DeployR: Revolution R Enterprise with Business Intelligence ApplicationsDeployR: Revolution R Enterprise with Business Intelligence Applications
DeployR: Revolution R Enterprise with Business Intelligence ApplicationsRevolution Analytics
 
Building Android apps with Parse
Building Android apps with ParseBuilding Android apps with Parse
Building Android apps with ParseDroidConTLV
 
Cloud Application Blueprints with Apache Brooklyn by Alex Henevald
Cloud Application Blueprints with Apache Brooklyn by Alex HenevaldCloud Application Blueprints with Apache Brooklyn by Alex Henevald
Cloud Application Blueprints with Apache Brooklyn by Alex Henevaldbuildacloud
 
Kraken Front-Trends
Kraken Front-TrendsKraken Front-Trends
Kraken Front-TrendsPayPal
 
A Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesFederico Feroldi
 
Flask and Angular: An approach to build robust platforms
Flask and Angular:  An approach to build robust platformsFlask and Angular:  An approach to build robust platforms
Flask and Angular: An approach to build robust platformsAyush Sharma
 
SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!Sébastien Levert
 
ITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The Win
ITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The WinITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The Win
ITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The WinITCamp
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Matthew Groves
 
Full Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQLFull Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQLAll Things Open
 

Similaire à Vertx - Reactive & Distributed (20)

Quick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase ServerQuick and Easy Development with Node.js and Couchbase Server
Quick and Easy Development with Node.js and Couchbase Server
 
Cloud Native Serverless Java — Orkhan Gasimov
Cloud Native Serverless Java — Orkhan GasimovCloud Native Serverless Java — Orkhan Gasimov
Cloud Native Serverless Java — Orkhan Gasimov
 
Full Stack Scala
Full Stack ScalaFull Stack Scala
Full Stack Scala
 
Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?” Альона Тудан “Microservices: better for Devs or QA’s?”
Альона Тудан “Microservices: better for Devs or QA’s?”
 
Micro app-framework - NodeLive Boston
Micro app-framework - NodeLive BostonMicro app-framework - NodeLive Boston
Micro app-framework - NodeLive Boston
 
Micro app-framework
Micro app-frameworkMicro app-framework
Micro app-framework
 
DeployR: Revolution R Enterprise with Business Intelligence Applications
DeployR: Revolution R Enterprise with Business Intelligence ApplicationsDeployR: Revolution R Enterprise with Business Intelligence Applications
DeployR: Revolution R Enterprise with Business Intelligence Applications
 
Gwt.create
Gwt.createGwt.create
Gwt.create
 
Building Android apps with Parse
Building Android apps with ParseBuilding Android apps with Parse
Building Android apps with Parse
 
mobl
moblmobl
mobl
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Cloud Application Blueprints with Apache Brooklyn by Alex Henevald
Cloud Application Blueprints with Apache Brooklyn by Alex HenevaldCloud Application Blueprints with Apache Brooklyn by Alex Henevald
Cloud Application Blueprints with Apache Brooklyn by Alex Henevald
 
Kraken Front-Trends
Kraken Front-TrendsKraken Front-Trends
Kraken Front-Trends
 
A Blueprint for Scala Microservices
A Blueprint for Scala MicroservicesA Blueprint for Scala Microservices
A Blueprint for Scala Microservices
 
Flask and Angular: An approach to build robust platforms
Flask and Angular:  An approach to build robust platformsFlask and Angular:  An approach to build robust platforms
Flask and Angular: An approach to build robust platforms
 
SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!SharePoint Conference 2018 - APIs, APIs everywhere!
SharePoint Conference 2018 - APIs, APIs everywhere!
 
Clean Architecture @ Taxibeat
Clean Architecture @ TaxibeatClean Architecture @ Taxibeat
Clean Architecture @ Taxibeat
 
ITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The Win
ITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The WinITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The Win
ITCamp 2018 - Magnus Mårtensson - Azure Resource Manager For The Win
 
Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017Full stack development with node and NoSQL - All Things Open - October 2017
Full stack development with node and NoSQL - All Things Open - October 2017
 
Full Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQLFull Stack Development with Node.js and NoSQL
Full Stack Development with Node.js and NoSQL
 

Plus de Orkhan Gasimov

Complex Application Design
Complex Application DesignComplex Application Design
Complex Application DesignOrkhan Gasimov
 
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...Orkhan Gasimov
 
Digital Transformation - Why? How? What?
Digital Transformation - Why? How? What?Digital Transformation - Why? How? What?
Digital Transformation - Why? How? What?Orkhan Gasimov
 
Service Mesh - Why? How? What?
Service Mesh - Why? How? What?Service Mesh - Why? How? What?
Service Mesh - Why? How? What?Orkhan Gasimov
 
Angular Web Components
Angular Web ComponentsAngular Web Components
Angular Web ComponentsOrkhan Gasimov
 
Spring Cloud: API gateway upgrade & configuration in the cloud
Spring Cloud: API gateway upgrade & configuration in the cloudSpring Cloud: API gateway upgrade & configuration in the cloud
Spring Cloud: API gateway upgrade & configuration in the cloudOrkhan Gasimov
 
Designing Fault Tolerant Microservices
Designing Fault Tolerant MicroservicesDesigning Fault Tolerant Microservices
Designing Fault Tolerant MicroservicesOrkhan Gasimov
 
Refactoring Monolith to Microservices
Refactoring Monolith to MicroservicesRefactoring Monolith to Microservices
Refactoring Monolith to MicroservicesOrkhan Gasimov
 
Fault Tolerance in Distributed Environment
Fault Tolerance in Distributed EnvironmentFault Tolerance in Distributed Environment
Fault Tolerance in Distributed EnvironmentOrkhan Gasimov
 
Patterns of Distributed Application Design
Patterns of Distributed Application DesignPatterns of Distributed Application Design
Patterns of Distributed Application DesignOrkhan Gasimov
 
Secured REST Microservices with Spring Cloud
Secured REST Microservices with Spring CloudSecured REST Microservices with Spring Cloud
Secured REST Microservices with Spring CloudOrkhan Gasimov
 
Data Microservices with Spring Cloud
Data Microservices with Spring CloudData Microservices with Spring Cloud
Data Microservices with Spring CloudOrkhan Gasimov
 
Spring Cloud: Why? How? What?
Spring Cloud: Why? How? What?Spring Cloud: Why? How? What?
Spring Cloud: Why? How? What?Orkhan Gasimov
 

Plus de Orkhan Gasimov (14)

Complex Application Design
Complex Application DesignComplex Application Design
Complex Application Design
 
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...
Cloud Native Spring - The role of Spring Cloud after Kubernetes became a main...
 
Digital Transformation - Why? How? What?
Digital Transformation - Why? How? What?Digital Transformation - Why? How? What?
Digital Transformation - Why? How? What?
 
Service Mesh - Why? How? What?
Service Mesh - Why? How? What?Service Mesh - Why? How? What?
Service Mesh - Why? How? What?
 
Angular Web Components
Angular Web ComponentsAngular Web Components
Angular Web Components
 
Spring Cloud: API gateway upgrade & configuration in the cloud
Spring Cloud: API gateway upgrade & configuration in the cloudSpring Cloud: API gateway upgrade & configuration in the cloud
Spring Cloud: API gateway upgrade & configuration in the cloud
 
Designing Fault Tolerant Microservices
Designing Fault Tolerant MicroservicesDesigning Fault Tolerant Microservices
Designing Fault Tolerant Microservices
 
Refactoring Monolith to Microservices
Refactoring Monolith to MicroservicesRefactoring Monolith to Microservices
Refactoring Monolith to Microservices
 
Fault Tolerance in Distributed Environment
Fault Tolerance in Distributed EnvironmentFault Tolerance in Distributed Environment
Fault Tolerance in Distributed Environment
 
Angular or React
Angular or ReactAngular or React
Angular or React
 
Patterns of Distributed Application Design
Patterns of Distributed Application DesignPatterns of Distributed Application Design
Patterns of Distributed Application Design
 
Secured REST Microservices with Spring Cloud
Secured REST Microservices with Spring CloudSecured REST Microservices with Spring Cloud
Secured REST Microservices with Spring Cloud
 
Data Microservices with Spring Cloud
Data Microservices with Spring CloudData Microservices with Spring Cloud
Data Microservices with Spring Cloud
 
Spring Cloud: Why? How? What?
Spring Cloud: Why? How? What?Spring Cloud: Why? How? What?
Spring Cloud: Why? How? What?
 

Dernier

[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfhans926745
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 

Dernier (20)

[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

Vertx - Reactive & Distributed

Notes de l'éditeur

  1. JSON body example
  2. JSON body example