Running distributed Node.js Apps
in JVM environments
Nodyn & Vert.x
Niko Köbler
Independent Software-Architect, Developer & Trainer
> niko@n-k.de > www.n-k.de > @dasniko
What is Node.js?
- Asyncronous, non-blocking, evented I/O with JavaScript
- Server-side JavaScript platform built on Google V8 engine
- What JavaScript has done for the webbrowser,
Node.js is doing for the backend server - http://nodejs.org
The Event Loop
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
Why JavaScript?
(undefined is not a function!)
Why Java?
With Java, we have...
And now, you wanna tell us
about this
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.
Any application that can be written in JavaScript, will eventually be written in JavaScript
Integration
Integration
Integration
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
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...
Java and JavaScript
...are similar than car and carpet are similar.
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");
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!
by project:odd @RedHat
- http://dynjs.org
- also based on invokedynamic
- REPL / command line
- Java interaction / embedding
Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
Netty
Node.js Architecture
Nodyn Architecture
more JavaScript than Node.js
Vert.x is a lightweight, high performance application platform for the JVM that's designed for modern mobile, web, and enterprise applications.
- http://vertx.io
- Polyglott*
- Simplicity
- Scalability
- Concurrency
- Distributed Event Bus**
*) Java, JavaScript, Ruby, Groovy, Python, Scala, Clojure, Ceylon
**) using Hazelcast In-Memory Data Grid (hazelcast.org)
Beer-as-a-Service
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
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
We are always mindful where we invest our resources and focus our efforts, and believe the Node.js Foundation has an important role to play in helping to make Node.js successful, as well as the developers using the technology to deploy Node.js applications. We look forward to working alongside our colleagues in the Foundation to help guide the project in the future.
Rich Sharples, senior director, Product Management, Red Hat
https://www.redhat.com/en/about/press-releases/red-hat-joins-nodejs-foundation
Conclusion
- JavaScript is an emerging language and widely adopted
- Node.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.js
-
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
Thank you!
Questions?
Niko Köbler
Independent Software-Architect, Developer & Trainer
> niko@n-k.de > www.n-k.de > @dasniko
Nodyn and Vert.x
By Niko Köbler
Nodyn and Vert.x
Running distributed Node.js apps in JVM environments.
- 3,235