美文网首页
{ vert.x } Vert.x初接触

{ vert.x } Vert.x初接触

作者: nealma | 来源:发表于2016-08-03 16:06 被阅读0次

    最近有点时间,关注了下Vert.x,从测试数据来看,性能不错,适合目前移动互联网的高并发要求。

    Vert.x 是什么

    • Polyglot(多种语言支持) (Java, JavaScript, Groovy, and Ruby)
    • Simplicity 编写的代码是完全基于异步事件的,异步执行并且通信是无阻塞的
    • Scalability(可扩展) 基于Actor模型
    • Concurrency(并发性) Vert.x本身内置三种线程池帮你处理
    • Modular(模块化) Vert.x本身内置强大的模块管理机制
    • 分布式消息传输 Vert.x基于分布式Bus消息机制实现其Actor模型
    • WebSocket 支持WebSocket协议兼容SockJS

    基本概念

    Verticle

    Vert.xAPI的代码就是一个Verticle.他可以用Scala Clojure JS Ruby等语言实现. 多个Verticle实例可以并行的被执行.一个基于Vert.x的服务也许需要多个verticles来实现,而且要部署在多台服务器上. 他们之间通过vert.x事件进行通信.你可以之间通过vert.x命令启动,也可以将verticle包装成vert.x modules.(推荐这么做)

    Module

    Vert.x应用由一个或多个modules来实现.一个模块呢由多个verticles来实现.你可以把module想象出一个个Java package. 里面可能是特定业务的实现,或者公共的服务实现(那些可以重用的服务).Vert.x编写好的module,可以发布到maven的仓库里. 以zip包装成二进制格式.或者发布到vert.x module 注册中心.实际上这种以模块方式的开发,支撑着整个Vert.x生态系统. Module更多的信息,我需要单独开一个系列来讲解.

    Vert.x 实例

    Verticles 其实是跑在 Vert.x实例上的.所谓Vert.x实例其实就是一个运行在某一个JVM上的Vert.x对象实例. 可以将多个Verticles运行在一个Vert.x实例上,而vert.x实例可以跑在单个JVM上,也可以跑在其他JVM上,通过分布式event bus 来维持通信.注意vert.x实例其实是由vertx命令行启动的.你可以指定实例数目在单个JVM上.

    Event Loops

    上面提到Vert.x实例,每个Vert.x实例内部维持几个线程,线程数目基本与CPU核数一致.这些线程在Vert.x内部叫做事件循环(Event Loop) 这个思想在很多事件驱动的架构都有,典型的就是IOS事件,它操作系统内部也有一个事件监控线程,不停捕捉外部的事件,比如touch,多点触摸等. 然后分配到指定的处理函数上,在vert.x里这些处理函数是Handler接口. 在Vert.x里这些事件可以是从Socket里读到数据,或者是一个定时器触发,亦或是一个HTTP请求接受到. 一个部署好的verticle都会得到一个event loop,来处理相关的事件.相关的后续的处理都会在这个event loop解决掉(也就是一个线程里) ,注意在同一个时间里有且只有一个线程处理.即Handler接口里是线程同步的.这点非常类似 reactor pattern.

    不要在Event Loops写一些阻塞代码,因此下面code不应该存在

    阻塞处理

    事件处理之外肯定会发生其长时间数据处理请求.比如处理一个图片上传,然后转存到磁盘上等.或者一次长时间的排序计算等. 在Verticle类型里,有一种特别的verticle叫做Worker.不同于标准的verticle,他不使用event loop.而是采用vert.x内部的 另一个线程池叫做worker pool.

    其区别在于,worker verticles不会并行的执行Handler.而是阻塞式的,等待上一个Handler处理完了,才会再执行后面的请求.你可以 想象出队列的方式执行某些请求.

    所以为了支持标准的与阻塞式的worker verticles, Vert.x 提供了一种混合线程模型,你可以选择适当的模型用于你的应用. worker verticle是一种阻塞式的方法,但是不可以做到并发水平扩展的

    共享数据

    消息通过Bus可以在各个Vert.x实例直接传输.但是如果多个Verticle在一个Vert.x实例内,是可以避免进行消息传输的.比如单个JVM内,你不会 通过Socket互相在两个Java 对象之间传输消息吧.但是因为实例隔离,因为Actor模型,所以对象数据如果要传到Handler里,必须通过消息传输. Vert.x提供了一个简单的共享Map与Set来解决这个问题.数据被存储到一个不可变的数据结构了,各个实例直接通过此API获取数据.(看例子更容易)

    Core API提供
    • TCP/SSL servers and clients
    • HTTP/HTTPS servers and clients
    • WebSockets servers and clients
    • The distributed event bus
    • Periodic and one-off timers
    • Buffers
    • Flow control
    • File-system access
    • Shared map and sets
    • Accessing configuration
    • SockJS

    安装

    verx.io下载3.0,解压设置环境变量
    vertx -version

    Hello world

    package vertx;   
    import io.vertx.core.AbstractVerticle;
    public class Server extends AbstractVerticle{
      public void start () throws Exception {
        vertx.createHttpServer().requestHandler(req -> {
           req.response()
           .putHeader("content-type", "text/plain")
           .end("Hello World.");
            }).listen(8080);
       }
    }
    

    vertx run Server.java

    相关文章

      网友评论

          本文标题:{ vert.x } Vert.x初接触

          本文链接:https://www.haomeiwen.com/subject/yrgqsttx.html