Upload
yiguang-hu
View
2.486
Download
0
Embed Size (px)
DESCRIPTION
Introduction to Vert.x.
Citation preview
VERT.X
Columbus Code Camp 2013Yiguang Hu
What is it?
• PolyGlot• Simple• Scalable• Asynchronous• Concurrent
Simple
A groovy server example:
vertx.createHttpServer().requestHandler { req -> req.response.end "<html><body><h1>Hello
from vert.x!</h1></body></html>"}.listen(8080, "localhost")
Demo create a simple server that dispays a static html page
vertx run http/Servertxt.groovy
PolyGlot
• Java• groovy• Python/jython• Ruby• JavaScript(CoffeeScript, AngularJS)• (Scala, clojure to come….)• Mix them in one app
PolyGlot
Vert.x Core(Java)
Language Specific Layer
Natural API
Scalable
• Linear horizontal scale• Message passing • Automatic load-balancing• Efficiently utilizes server cores
Vert.x Architecture
Event Bus
Scaling
• Instances: -instance 10• Clustering: -cluster
AsynchronousJava Version web server –Anonymous inner class
public class ServerExample extends Verticle {
public void start() { vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() { public void handle(HttpServerRequest req) { System.out.println("Got request: " + req.uri());
req.response().headers().set("Content-Type", "text/html; charset=UTF-8"); req.response().end("<html><body><h1>Hello from vert.x!</h1></body></html>"); } }).listen(8080); }}
Asynchronous
Groovy Version web server-closure
package http
vertx.createHttpServer().requestHandler { req -> req.response.end "<html><body><h1>Hello
from vert.x!</h1></body></html>"}.listen(8080, "localhost")
Asynchronous
JavaScript Version web server-function
var vertx = require('vertx')
vertx.createHttpServer().requestHandler(function(req) {
req.response.end("<html><body><h1>Hello from vert.x!</h1></body></html>");
}).listen(8080);
AsynchronousJava Version web server –Anonymous inner class
public class ServerExample extends Verticle {
public void start() { vertx.createHttpServer().requestHandler(new Handler<HttpServerRequest>() { public void handle(HttpServerRequest req) { System.out.println("Got request: " + req.uri());
req.response().headers().set("Content-Type", "text/html; charset=UTF-8"); req.response().end("<html><body><h1>Hello from vert.x!</h1></body></html>"); } }).listen(8080); }}
WebSockets(Server)
vertx.createHttpServer().websocketHandler { ws ->
ws.dataHandler { data -> ws.writeTextFrame(data.toString()) }
}.requestHandler { req -> if (req.uri == "/") req.response.sendFile
"websockets/ws.html"}.listen(8080)
WebSockets (Client)<script> var socket; if (window.WebSocket) { socket = new WebSocket("ws://localhost:8080/myapp"); socket.onmessage = function(event) { alert("Received data from websocket: " + event.data); } socket.onopen = function(event) { alert("Web Socket opened!"); }; socket.onclose = function(event) { alert("Web Socket closed."); }; } else { alert("Your browser does not support Websockets. (Use Chrome)"); }
function send(message) { if (!window.WebSocket) { return; } if (socket.readyState == WebSocket.OPEN) { socket.send(message); } else { alert("The socket is not open."); } }</script>
SockJS
• Handles the communication between the browser and the server.
• Provides a websocket-like API in client-side JS• Works when websockets not available• JSON-Polling, XHR-Polling/Streaming, etc
SockJS<html><head> <title>SockJS Test</title> <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script></head><body>
<script> var sock = new SockJS('http://localhost:8080/testapp'); sock.onopen = function() { console.log('open'); }; sock.onmessage = function(e) { console.log('message', e.data); alert('received message echoed from server: ' + e.data); }; sock.onclose = function() { console.log('close'); };
function send(message) {
if (sock.readyState === SockJS.OPEN) { console.log("sending message") sock.send(message); } else { console.log("The socket is not open."); } }</script><form onsubmit="return false;"> <input type="text" name="message" value="Hello, World!"/> <input type="button" value="Send SockJS data" onclick="send(this.form.message.value)"/></form></body></html>
SockJSdef server = vertx.createHttpServer()
// Serve the index pageserver.requestHandler { req -> if (req.uri == "/") req.response.sendFile 'sockjs/index.html'}
// The handler for the SockJS app - we just echo data backvertx.createSockJSServer(server).installApp(prefix: '/testapp') { sock -> sock.dataHandler { buff -> sock << buff }}
server.listen(8080)
How module communicate
• Shared data• Maps or Sets• May only store immutable data• Immutable-no concurrency issue
Publish/subscribe messaging
Publish/subscribe
var eb = require("vertx/event_bus");var console = require("vertx/console");var vertx = require("vertx")
vertx.setPeriodic(1000, function sendMessage() {
eb.publish('news-feed', 'some news!');})
subscriber
var eb = require("vertx/event_bus");var console = require("vertx/console");
eb.registerHandler("news-feed", function(message) {
console.log('Received news ' + message);});
P-to-P
Ping
var eb = require("vertx/event_bus");var console = require("vertx/console");var vertx = require("vertx")
vertx.setPeriodic(1000, function sendMessage() { eb.send('ping-address', 'ping!', function(reply) { console.log("Received reply: " + reply); });})
receiver
var eb = require("vertx/event_bus");var console = require("vertx/console");
eb.registerHandler("ping-address", function(message, replier) {
console.log('Received message ' + message); // Now reply to it replier('pong!');});
Event Bus
• Fit asynchronous Model• Decoupling-Only data, no method calls• Can be distributed• JSON
Demonstration
• Web app• Listen on a topic and send received data to
web through websocket• A server that searches random topics on
duckduckgo periodically and publish result to the topic
• Multiple browsers display the data and are update simultaneously
References
• Vertx.io• Some slides/charts are lifted from the
following presentations• http://m.javaworld.com/javaworld/jw-07-201
3/130730-osjp-enterprise-messaging-and-integration-with-vertx.html?page=1
• http://www.cubrid.org/blog/dev-platform/inside-vertx-comparison-with-nodejs/
• http://www.javacodegeeks.com/2012/07/osgi-case-study-modular-vertx.html