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

Node.js on the JVM

Node.js on the JVM

JavaScript Evented I/O & more for the Java Enterprise Ecosystem with Node.js alternatives on the JVM - Avatar and Nodyn

Niko Köbler

December 05, 2014
Tweet

More Decks by Niko Köbler

Other Decks in Programming

Transcript

  1. JavaScript Evented I/O & more JavaScript Evented I/O & more

    for the Java Enterprise Ecosystem for the Java Enterprise Ecosystem Niko Köbler ( ) @dasniko {JavaScript}Training Node.js on the JVM Node.js on the JVM
  2. What is Node.js? What is Node.js? Server-side JavaScript platform built

    on Google V8 engine What JavaScript has done for the webbrowser, Node.js is doing for the backend server Asyncronous, non-blocking, evented I/O with JavaScript http://nodejs.org var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World\n'); }).listen(1337, '127.0.0.1'); console.log('Server running at http://127.0.0.1:1337/');
  3. The cost of I/O The cost of I/O L1-cache 3

    cycles L2-cache 14 cycles RAM 250 cycles Disk 41 000 000 cycles Network 240 000 000 cycles
  4. And now, you wanna tell us And now, you wanna

    tell us about this about this "brave" "brave" new new (Node-)JS-world? (Node-)JS-world?
  5. Speaking JavaScript Speaking JavaScript “Like it or not, JavaScript is

    everywhere these days - from browser to server to mobile - and now you, too, need to learn the language or dive deeper than you have. Dr. Axel Rauschmayer http://speakingjs.com
  6. “In four years ... Node.js has experienced phenomenal growth. Node.js

    is the language of choice for high performance, low latency applications and has been powering everything from robots to API engines to cloud stacks to mobile web sites. Node.js Advisory Board - October 23, 2014
  7. Any application that Any application that can can be be

    written in JavaScript, written in JavaScript, will will eventually be written in eventually be written in JavaScript JavaScript Atwood's Law http://blog.codinghorror.com/the-principle-of-least-power/
  8. Nashorn Nashorn JavaScript Enginge on the JVM based on invokedynamic

    feature competes with Google V8 ECMAScript 5.1 compatible (ES6/ES2015 with Java 9) Seamless interoperability of Java and JavaScript Shell Scripting Language and API Extensions http://openjdk.java.net/projects/nashorn/​ closures, collections & for each, multi-line string literals, string interpolation, __noSuchProperty__, __noSuchMethod__, typed arrays, binding properties, error extensions, conditional catch clause, String functions, and many, many more...
  9. Nashorn Nashorn Invoking JavaScript from Java ScriptEngine engine = new

    ScriptEngineManager() .getEngineByName("nashorn"); engine.eval("print('Hello Nashorn!');"); engine.eval(new FileReader("scriptfile.js")); Invocable invocable = (Invocable) engine; Object result = invocable.invokeFunction( "jsSayHello", "Nashorn");
  10. Nashorn Nashorn Invoking Java from JavaScript package my.package; public class

    MyJavaClass { static String sayHello(String name) { return String.format("Hello %s from Java!", name); } } var MyJavaClass = Java.type('my.package.MyJavaClass'); var result = MyJavaClass.sayHello('Nashorn'); print(result); // Hello Nashorn from Java!
  11. Nashorn Nashorn Listing Docker Containers via REST-Call from Shell #!/usr/bin/jjs

    -fv var host = "DOCKER_HOST" var dockerUri="http://${host}:5555/containers/json"; var command = "curl ${dockerUri}"; $EXEC(command); var containers = JSON.parse($OUT); for each(container in containers){ print("${container.Image} / ${container.Names[0]} / ${container.Status}"); } (by ) Adam Bien
  12. Avatar 2.0 Avatar 2.0 Inter-thread communication Message Bus Shared State

    (Map API: Key-Value-Store) Model-Store-API JPA (Eclipselink) / JDBC based / https://avatar.java.net https://avatar-js.java.net
  13. also based on invokedynamic REPL / command line Java interaction

    / embedding http://dynjs.org Nashorn is on its way! Nashorn is on its way!
  14. “ Netty is an asynchronous event-driven network application framework for

    rapid development of maintainable high performance protocol servers & clients. http://netty.io Netty Netty
  15. “ Vert.x is a lightweight, high performance application platform for

    the JVM that's designed for modern mobile, web, and enterprise applications. Polyglott* Simplicity Scalability Concurrency Distributed Event Bus** http://vertx.io *) Java, JavaScript, Ruby, Groovy, Python, Scala, Clojure, Ceylon **) using Hazelcast In-Memory Data Grid ( ) hazelcast.org
  16. vertx2-core vertx2-core This module exposes the vert.x 2.x eventbus to

    node.js clients. https://github.com/nodyn/vertx2-core mod-nodyn mod-nodyn This supports running Node.js workloads inside of Vert.x. https://github.com/nodyn/mod-nodyn
  17. var http = require("http"); var vertx = require("vertx2-core"); var registration

    = vertx.eventbus.register("bar", function(message) { var amount = message.body.amount; console.log("BAR: Someone ordered " + amount + " beer(s)."); message.reply({wait_time: amount * 1.75}); }); var server = http.createServer(function(request, response) { var parts = request.url.split("/"); var amount = parts[1]; vertx.eventbus.send("bar", {amount: amount}, function(message) { response.write(amount + " beer(s) will be ready in " + message.body.wait_time + " minutes"); response.end(); }); }); server.listen(9000, function() { console.log( "Beer-Server is listening on port 9000" ); }); beer-as-a-service.js run with nodyn
  18. var http = require("http"); var vertx = require("vertx2-core"); var server

    = http.createServer(function(request, response) { var parts = request.url.split("/"); var amount = parts[1]; vertx.eventbus.send("bar", {amount: amount}, function(message) { response.write(amount + " beer(s) will be ready in " + message.body.wait_time + " minutes"); response.end(); }); }); server.listen(9000, function() { console.log( "Beer-Server is listening on port 9000" ); }); beer-web.js beer-bar.js var eventBus = require("vertx/event_bus"); eventBus.registerHandler("bar", function(message, replier) { java.lang.System.err.println("BAR: Someone ordered " + message.amount + " beer(s)"); replier({wait_time: message.amount * 1.75}); }); java.lang.System.err.println("The BAR is open!"); run with vertx in cluster mode
  19. Conclusion Conclusion JavaScript is an emerging language and widely adopted

    Node.js / IO.js is very popular Operations, monitoring and integration lacks JVM is Enterprise environment of choice (and all the above lacks are already solved) Run JavaScript on the JVM thanks to invokedynamic (Nashorn, DynJS) Re-use your infrastructures and libraries with Node Nodyn from Red Hat Re-use of Node API module, integration of Netty and Vert.x Process-bindings in Java/JavaScript Embed Node.js apps into your Java applications Run Node.js apps in distributed environments
  20. Avatar & Nodyn Avatar & Nodyn @ JavaMagazin @ JavaMagazin

    https://jaxenter.de/ausgaben/java-magazin-3-15 https://jaxenter.de/ausgaben/java-magazin-1-15