`
wx1569488408
  • 浏览: 79091 次
文章分类
社区版块
存档分类
最新评论

Vert.x入门教程

 
阅读更多

Vert.x是一个轻量级的高性能JVM应用平台,基于它可开发各种移动,Web和企业应用程序。一个主要特点是可使用多种语言编写应用,如Java, JavaScript, CoffeeScript, Ruby, Python 或 Groovy等等,它的简单actor-like机制能帮助脱离直接基于多线程编程。它是基于Netty和Java 7的NIO2的编写的。

   当前业界遭遇C10K问题,当并发连接超过10,000+以上时使用传统技术会引发暂停,移动设备或视频 声音如类似微信这样的实时聊天,都是属于长任务连接Long-lived。

   通常Tomcat会在100个并发长请求(这个请求要求做很多事长任务)下堵塞,而Vertx将长任务委托给另外一个线程来执行,从而不会堵塞当前线程,与NodeJS的原理非常类似,如下图:

vertx.png

   事件循环的线程和长任务工作线程之间是通过事件总线EventBus通讯的,这个事件总线是一个JVM之中,如下图:

vertx2.png

   图中每个Verticle是一个线程,符合单写原则,避免了写争夺。总线可以拓展到客户端边的Javascript,可以在客户端和服务器端分发事件,可以如下图在多个客户端或服务器端:

vertxbus.png

   下图是在一个Web应用中,多层之间也可以通过EventBus通讯实现调用:

eventbus.png

 

代码演示

   下面是一个服务器的Java代码:

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);
  }
}

groovy版本:

package http
vertx.createHttpServer().requestHandler { req ->
  req.response.end "<html><body><h1>Hello from vert.x!</h1></body></html>"
}.listen(8080, "localhost")

Javascript版本:

var vertx = require('vertx')
vertx.createHttpServer().requestHandler(function(req) {
  req.response.end("<html><body><h1>Hello from vert.x!</h1></body></html>");
}).listen(8080);

WebScoket实现

  WebSocket是Web服务器端向客户端推送信息的协议,使用vert.x实现如下:

vertx.createHttpServer().websocketHandler { ws ->
  ws.dataHandler { data -> ws.writeTextFrame(data.toString()) }
}.requestHandler { req ->
  if (req.uri == "/") req.response.sendFile "websockets/ws.html"
}.listen(8080)

浏览器客户端通过JS调用:

<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>

SocketJS是一种处理客户端和服务器通讯的框架,能够在客户端提供类似websocket的API,支持JSON-Polling, XHR-Polling/Streaming。

<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>

服务器端创建一个SocketJS的Server:

 

def server = vertx.createHttpServer()
// Serve the index page
server.requestHandler { req ->
  if (req.uri == "/") req.response.sendFile 'sockjs/index.html'
}
// The handler for the SockJS app - we just echo data back
vertx.createSockJSServer(server).installApp(prefix: '/testapp') { sock ->
  sock.dataHandler { buff ->
    sock << buff
  }
}
server.listen(8080)

消息模型

   使用vert.x可以实现1:N和1:1的消息模型。Publish/subscribe如下:

vertxps.png

JS代码如下:

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!');
})

订阅者:

var eb = require("vertx/event_bus");
var console = require("vertx/console");
eb.registerHandler("news-feed", function(message) {
  console.log('Received news ' + message);
});

一对一的队列方式:

vertxqueue.png

发布者JS代码如下:

 

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);
  });
})

订阅者代码如下:

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!');
});

共享数据

  消息传递是非常有用的。然而,它并不总是在所有类型的应用程序解决并发的最好选择。缓存也是最流行的解决方式之一。如果只有一个Verticle有一一个缓存,这是非常低效的。当其他Verticles需要缓存,每个Verticle应该共享相同的缓存数据。 因此,Vert.x提供全局访问共享的MAP的方式,称为 Shared Map。 共享的是不变性数据。

与NodeJS比较

vertxnodejs.png

安装使用

   vertx使用了invokeDynamic in JDK7.因此需要JDK7环境。从 http://vertx.io/downloads.html下载,解压,将bin目录加入环境PATH中。在windows环境可以执行vertx version

比如建设一个JS编写的服务器代码:

 

load('vertx.js');
 
vertx.createHttpServer().requestHandler(function(req) {
req.response.end("Hello World!");}) .listen(8080, 'localhost');

在命令行只有运行下面命令可启动这个服务器:

$ vertx run server.js

在浏览器打开http://localhost:8080,可看到hello World

 

使用vert.x 2.0, RxJava 和 mongoDB创建一个简单RESTful服务

使用Vert.x开发响应式微服务

Vertx在TechEmpower第八轮Web框架基准测试排名第一

Ratpack可快速开发异步响应式的Java Web应用

Java 7/JDK 7的Invokedynamic

Netty原理和应用

Node.js的事件轮询Event Loop原理解释

NodeJS入门事件编程

Play框架入门使用

Servlet 3.0

Actor编程模型

异步编程

转载于:https://my.oschina.net/u/2902719/blog/895338

分享到:
评论

相关推荐

    Vert.x应用开发实例教程

    Vert.x是事件驱动的,其处理请求的高性能也是基于其事件机制。Vert.x的事件机制中有几个非常重要的概念:Event Loop、Event Loop Vertical、Worker Vertical、Event Bus、Vert.x Module。 Event Loop:即事件循环,...

    Vert.x 4 核心手册中文版

    【Vert.x 4 核心手册中文版】深入解析 Vert.x 是一个轻量级、高性能的反应式应用开发框架,适用于 Java 和其他多种语言。它的核心组件小巧且灵活,允许开发者只使用需要的部分,并能无缝嵌入到现有的应用程序中,...

    vertx应用开发实例教程-完整版

     《Vert.x应用开发实例教程》旨在为Vert.x的初学者和大中专院校学生提供易于入门,全面了解和掌握Vert.x框架技术和应用的教材和辅导资料,为使用Vert.x开发实时应用和企业级应用打下良好的基础。

    joker2015demo:在小丑2015上使用vert.x进行恶性化的简单示例

    【描述】提到的"vert.x使用的简单例子"表明,这个项目提供了一个入门级的教程,解释了如何使用Vert.x框架来构建应用程序。"小丑2015年期间证明-"可能是指该项目在特定的时间点,即2015年的某个活动中,用Vert.x实现...

    vertxtest.rar

    【描述】:这个压缩包包含了一个使用Java语言编写的Vert.x入门项目"hello_world"。这个完整的工程文件集成了大部分必要的配置,允许开发者快速开始体验Vert.x框架的使用。在实际运行前,您可能需要根据自己的JDK安装...

    Kotlin 入门教程指南

    Kotlin 入门教程指南 概述:Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,被称之为 Android 世界的 Swift,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便...

    Kotlin比较全面的入门教程

    Vert.x是一个构建响应式应用程序的框架,它也支持Kotlin,允许开发者利用其强大的并发模型和模块化设计。 Kotlin还与JavaScript有着良好的互操作性,你可以方便地在Kotlin中调用JavaScript代码,反之亦然。这使得在...

    Kotlin 语言文档 - 使用 Kotlin 进行服务器端开发

    - **Ktor和Vert.x**:这两个轻量级框架特别为Kotlin优化,Ktor利用协程实现高可伸缩性,Vert.x为构建响应式Web应用提供了专门支持。 - **kotlinx.html**:作为HTML构建的DSL,可以替代传统的模板系统。 - **持久化...

    kotlin-docs.pdf

    - Vert.x是一个构建响应式Web应用程序的框架,它为Kotlin提供专门支持。 - Ktor是JetBrains为Kotlin创建Web应用程序的框架,利用协程来实现高可伸缩性。 - kotlinx.html是一个DSL,用于构建Web应用程序中的HTML,它...

    Matlab图像处理入门到精通源代码.pdf

    【Matlab图像处理入门到精通源代码.pdf】是一份详细介绍了如何使用Matlab进行图像处理的教程。在Matlab中,图像处理主要包括图像的读取、显示、调整、变换以及滤波等多个方面。以下是这份教程中涉及的一些核心知识点...

    OpenGL入门-深度测试及混合-透明度图形实现.zip

    OpenGL入门教程:深度测试与透明度图形实现 在3D图形编程中,OpenGL是一个不可或缺的工具,它提供了丰富的功能来创建复杂的三维场景。本教程将深入探讨如何在C++环境中,利用OpenGL进行深度测试和透明度图形的实现...

    Matlab图像处理入门到精通源代码.docx

    《Matlab图像处理入门到精通源代码》是针对Matlab图像处理的一份详细教程,涵盖了从基础操作到高级技巧的多个方面。以下是对文件中提到的一些关键知识点的深入解析: ### 图像处理基础 #### 直方图查看(§2.1.3)...

    kotlin使用指南中文版

    Vert.x是一个在JVM上构建响应式Web应用程序的框架,也提供了对Kotlin的原生支持。Ktor是JetBrains构建的Kotlin原生Web框架,它利用协程来实现高可伸缩性,并提供了易于使用的API。kotlinx.html是一个用于Web应用程序...

Global site tag (gtag.js) - Google Analytics