原文链接:
http://www.360doc.com/content/18/0203/14/39530679_727432611.shtml
一、Vert.x 简介官方文档:http://vertx.io/docs/vertx-core/java/ Vertx,是一个基于JVM、轻量级、高性能的应用平台,非常适用于移动端后台、互联网、企业应用架构。 Vertx,基于Netty全异步通信,并扩展出了很多有用的特性。 Vertx,是基于事件总线设计的高性能架构,保证应用中不同部分以一种非堵塞的线程安全方式通讯。 Vertx,是借鉴Erlang和Akka架构设计,能充分利用多核处理器性能并实现高并发编程需求的框架。 Vertx特点:
目前,该框架国内用的还不太多,但是国外比较多,如英孚教育、Hulu、以及做JVM监控的一家公司jClarity等。Google group上的话题也比较多,非常活跃,属于技术极客圈里热门话题。 如果你是技术小白,可以通过学习Vertx拓宽你的技术栈;如果你是架构师,可以借鉴Vertx的架构设计思路,更好的提升自我的架构能力,也为公司未来的技术选型,多一种选择和考量。 二、Vertx原理解析本小节主要讲一些理论性的东西,核心是想讲明白Vertx的体系结构,verticle和vertx的关系,以及verticles 之间是如何通信和运行的,很枯燥的一章。建议大家先大体看看,不用立刻理解(也不可能),带着疑问继续读后面的几个章节。 Vertx应用在很大程度上是通过定义事件处理程序。应用之间通过事件总线传递消息,异步响应。 Vertx的编程框架可以简单的理解为:
1、Vert.x系统的体系结构 2、客户端请求处理流程 请求在vert.x框架中被插入到一个事件队列中,耗时的任务将被委托给长任务处理线程进行处理,保证线程不被耗时的IO操作进行阻塞等待。 如下图: 3、EventBus通信模型 事件循环线程和长任务处理线程通过EventBus进行通信。 如下图: 4、部分名词对照表:
Vert.x核心功能是最底层且相当简洁的,没有诸如数据库存取、认证、高级web等功能,你可以在Vert.x ext(扩展包)找到以上这些组件。 5、Vert.x Core提供的功能:
三、Vertx 的牛刀小试本节将教你如何一步一步地创建第一个vert.x应用程序。 1、基础环境:
2、创建vert.x应用程序
Verticle有两个有用的方法: start()和stop() 这两个方法在Verticle实例被注册的Vertx实例或者从Vertx实例卸载的时候被自动调用。 你可以在start()里加入一些需要做的工作,并且在stop里加入一些需要清理的工作。
Vertx提供两种注册方法:
到此,你已经完成了第一个 vert应用程序的创建和使用。 在下一节,我们将扩展开讲解vert的常规应用,通过这一节的学习,你将深入认识vert的开发模式。 四、Vert应用实践上一小节,我们实现了第一个vert程序,本小节将更多更全面的展示vert的使用方法。 1、搭建Vert.x Web服务器代码示例
或 终端执行
返回内容:
浏览器访问
返回页面
解析: HttpServer: http/https/websockets服务器,vert.x发布restful服务,不需要tomcat提供servlet容器,它自己就是一台性能强大的web服务器,并且原生支持负载均衡,后面我们会讲到。 Router类: Router类可以理解为一个路由器,他接收httpserver带来的请求,并将不同的请求分发到不同的路由中,如果简单对比一下spring mvc的话,可以将router理解为spring mvc中的dispatcher。 route: route代表一条路由,同样,对比spring mvc,相当于spring中的@RequestMapping,他指定了restful api的请求接口路径,并将其交给handler来处理该条路由。 Handler: handler处理具体的路由请求,字面上讲就是处理某个具体的restful api。他与httpserver,router,route的关系可以用如下流程表示:
vert.x默认提供了很多处理器,包括但不局限于以下:
RoutingContext: 请求上下文,可以理解为servlet中的httprequest和httpresponse 在RestfulVerticle.java的start方法里创建了一个Router对象。 router是Vert.x Web的基础,负责分发HTTP请求到handler(处理器),在Vert.x Web中还有两个很重要的概念。
router::accept,它表示引用一个方法(这里是引用router的accept方法)。当接收到一个请求的时候,告诉vert.x从router里调用accept方法。 将访问“/assets/*”的请求,route到“assets”目录下的资源,默认访问index.html。 2、处理session代码示例 访问:http://localhost:8080/ 计数器 1返回。 3、处理cookies代码示例 访问:http://localhost:8080/ 计数器 1,返回。 4、Vert.x通信 为了建立一个Vert.x消息系统,需要启动vertx实例的eventBus()方法,从而获得该事件总线。
Vertx提供两种发布消息的方式
代码示例 接收消息: 注册handlers 当收到一条消息时,handler会被调用,而消息(message)会作为参数传递过去。 其中 news.uk.sport 表示消息的注册地址,消息发布者在也要注册到该地址。 当在一个集群event bus上注册了handler时,完成在集群上每个节点的注册需要花点时间。 如果你想在完成时得到通知,你可以在MessageConsumer 对象上注册一个completion handler 发布消息
这个消息会被分发到注册在地址 news.uk.sport 上的所有handlers。 如果想点对点的发布消息即只有一个接收到消息,可以使用send方法
使用send方法时event bus会尝试把消息发送到注册在event bus上的MessageConsumer对象。 某些情况下,发送方可能想知道消息已经被接收并处理了。 为了让发放方了解消息已被处理,consumer可以通过调用reply方法给予回应。 如果这么做了,那么发送方将会收到一个回应,并且回应handler将被调用。看下面这个例子: 接收方: 发送方: 5、定期、延时执行 在标准verticle里,你不能以使线程休眠的方式引入延迟;这样干会阻塞event loop线程. 取而代之的是Vert.x定时器,定时器分为一次性(one-shot)和周期性(periodic) 为一次性定时器: 周期性: 如果你是在verticle内部创建的定时器,那么verticle被卸载时,这些定时器将被自动关闭。 (注意:定时器会定期触发。如果你的定期处理需要耗费大量时间,你的定时器事件可能会连续运行甚至糟糕到堆积在一起。在这种情况下,你应该考虑转而使用setTimer。一旦你的处理完成了,你可以再设置下一个定时器。) 五、辅助工具Vert.x3常用工具 最后在提一下几个Vert.x3的一些小工具。
六、名词解释Reactor模式 和传统Java框架的多线程模型相比,Vert.x Netty是 Reactor模式的Java实现。考古了一下Reactor模式, 其理论最早由Washington University的Douglas C. Schmidt教授在1995年提出,在《Proactor - An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous Events 》这篇论文中做了 完整介绍。 图1-6是对其关键原理部分展开分析。 图1 一个经典Web Server在收到Web浏览器请求后的处理过程 图2 一个经典Web Server使用多线程模型,并发处理来自多个Web浏 览器的请求 图3 Web浏览器连接到一个Reactor模式的Web Server处理过程。利 用了Initiation Dispatcher组件,把耗时的IO操作事件注册到Initiation Dispatcher组件 图4 Web浏览器访问一个Reactor模式的Web Server处理过程。耗时IO 操作由其它线程执行,IO执行完成后通知Initiation Dispatcher,再回到 Http Handler执行 图5 Web浏览器连接一个Proactor模式的Web Server处理过程。和Reactor的主要区别是耗时IO操作交给操作系统异步IO库执行(例如 GNU/Linux aio),操作系统异步IO库执行完毕后,通过异步IO通知机制(例如epoll)触发Completion Dispatch,再交给Http Handler执行 图6 Web浏览器访问一个Proactor模式的Web Server处理过程。和Reactor的主要区别是耗时IO操作交给操作系统异步IO库执行(例如 GNU/Linux aio),操作系统异步IO库执行完毕后,通过异步IO通知机制(例如epoll)触发Completion Dispatch,再交给Http Handler执行 事实上,Vert.x/Netty的Reactor实现部分是在Netty 4.0如上述所示的代码中实现,和上述图中能对应的几个类是io.netty.channel.nio.NioEventLoop,io.netty. channel.epoll.EpollEventLoop,java.nio.channels.spi.SelectorProvide 七、后记Vertx是什么,有哪些特点,以及基本使用方法,本文做了基本的介绍。 作为一个优秀的异步通信框架,Vertx还有非常多的高级应用和完整的生态体系。在后面的文章中,我会为大家持续解开Vertx的神秘面纱。 本文演示所用源码下载地址: https://github.com/wzjgn/Vertx.git |