VERT.X介绍
Posted 幸福Yo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VERT.X介绍相关的知识,希望对你有一定的参考价值。
我最了解的编程语言应该是Java了,虽然一直在门外转悠
一、简介
Vert.x诞生于2011年,当时叫node.x,不过后来因为某些原因改名为Vert.x。经过三年多的发展,现在已经到了3.9.0版本,社区也越来越活跃,在最新的官网Vertx.io上,作者用一句话介绍了它,JVM上的Reative开发套件。Vert.x目前是见过功能最强大,第三方库依赖最少的Java框架,它只依赖Netty4以及Jacskon,另外如果你需要建立分布式的Vert.x则再依赖HazelCast这个分布式框架,注意Vert.x3必须基于Java8。由于基于JVM,所以Vert.x可以用其他语言来实现你的业务。
Vert.x是一个异步无阻塞的网络框架,其参照物是node.js。基本上node.js能干的事情,Vert.x都能干。Vert.x利用Netty4的EventLoop来做单线程的事件循环,所以跑在Vert.x上的业务不能做CPU密集型的运算,这样会导致整个线程被阻塞。
官方文档:http://vertx.io/docs/vertx-core/java/
Vert.x是一个基于JVM、轻量级、高性能的应用平台,非常适用于移动端后台、互联网、企业应用架构。
Vert.x是基于Netty全异步通信,并扩展出了很多有用的特性。
Vert.x是基于事件总线设计的高性能架构,保证应用中不同部分以一种非堵塞的线程安全方式通讯。
Vert.x是借鉴Erlang和Akka架构设计,能充分利用多核处理器性能并实现高并发编程需求的框架。
Vert.x特点:
1、支持多种编程语言
目前已经支持了Java、Scala、javascript、Ruby、Python、Groovy、Clojure、Ceylon等。对程序员来说,直接好处就是可以使用各种语言丰富的LIB,同时也不再为编程语言选型而纠结;
2、异步无锁编程
经典的多线程编程模型能满足很多Web开发场景,但随着移动互联网并发连接数的猛增,多线程并发控制模型性能难以扩展,同时要想控制好并发锁需要较高的技巧,目前Reactor异步编程模型开始跑马圈地,而Vert.x就是这种异步无锁编程的一个首选;
3、对各种IO的丰富支持
目前Vert.x的异步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等,基本满足绝大多数系统架构需求;极好的分布式开发支持——Vert.x通过EventBus事件总线,可以轻松编写分布式解耦的程序,具有很好的扩展性;
4、分布式消息传输
Vert.x基于分布式Bus消息机制实现其Actor模型,我们的业务逻辑如果依赖其他Actor则通过Bus简单的将消息发送出去就可以了。EventBus事件总线,可以轻松编写分布式解耦的程序,具有很好的扩展性。EventBus也是Vert.x架构的灵魂所在。
5、生态体系日趋成熟
Vert.x归入Eclipse基金会门下,异步驱动已经支持了Postgres、mysql、MongoDB、Redis等常用组件,并且有若干Vert.x在生产环境中的应用案例。
6、Vert.x是轻量级的
Vert.x的核心代码包只有650kB左右,同时提供丰富的扩展插件,满足各类需求。
7、Vert.x并不是一个Web容器
Vert.x并不是一个WebServer,它是一种异步编程框架,你可以将自己基于Vert.x的应用程序放置到任何你想放置的Web容器中部署运行,可以非常方便的和Spring,Spring Boot,Spring Cloud,Nodejs等语言混编。
8、模块化
Vert.x本身内置强大的模块管理机制,当你写完一个Vert.x业务逻辑的时候,你可以将其打包成module,然后部署到基于Maven的仓库里,与现有主流的开发过程无缝结合。
9、支持WebSocket
支持WebSocket协议兼容SockJS , 可以非常方便的实现web前端和服务后端长连接通信,是轻量级web聊天室应用首选解决方案。
10、使用简单
这里的简单意味着你编写的代码是完全基于异步事件的,类似Node.JS,与此同时.你不需要关注线程上的同步,与锁之类的概念,所有的程序都是异步执行并且通信是无阻塞的。
11、良好的扩展性
因为基于Actor模型,所以你的程序都是一个点一个点的单独在跑,一群点可以组成一个服务,某个点都是可以水平扩展,动态替换,这样你的程序,基本就可以达到无限制的水平扩展。
12、高并发性
Vert.x是一个事件驱动非阻塞的异步编程框架,你可以在极少的核心线程里占用最小限度的硬件资源处理大量的高并发请求。
此并发并非JDK库的并发,当你Coding的时候,不再关注其锁,同步块,死锁之类的概念,你就可以随性所欲的写自己的业务逻辑,Vert.x本身内置三种线程池帮你处理。
二、在Vert.x基于事件的编程
Vert.x的基于事件的编程模型的标准和独特的功能组合。Vert.x应用在很大程度上是通过定义事件处理程序。不同于传统的基于事件的应用程序,但是Vert.x应用保证不被阻塞。而不是打开一个socket到服务器,请求资源,然后等待(阻塞)的响应,Vert.x发送到应用程序异步地响应,通过事件处理程序,并通过事件总线传递消息写入。
Vert.x的编程框架可以简单的理解为:
verticle是vert.x中可被部署运行的最小代码块,可以理解为一个verticle就是一个最小化的业务处理引擎。一个应用程序可以是单个verticle或者由EventBus通信的多个verticles构成。
verticle被发布部署后,会调用其内部的start方法,开始业务逻辑处理,完成后会调用stop方法,对该代码块执行销毁动作。
Verticles在Vert.x实例中运行。一个Vertx可以承载多个verticles,每个Vert.x实例在其私有的JVM实例运行。一台服务器可以运行一个或多个Vert.x实例(建议运行Vertx实例的数量和CPU核数正相关)。
一个Vert.x实例,保证其承载的verticles实例总是在同一个线程执行,并发Vert.x 是单线程的。
在内部,Vert.x实例维护一组线程(通常为CPU核心数)是在执行一个事件循环。
虽然你可能会认为,共享数据和可扩展性截然相反。Vert.x提供了一个共享的MAP和跨在同一Vert.x实例中运行verticles传递不可改变的数据共享一套设施,这时候数据是可变的唯一真正的。
Vert.x使用相对较少的线程来创建一个事件循环和执行verticles。但在某些情况下,需要verticle做一些要么昂贵计算,或可能阻塞,如连接到数据库。当发生这种情况Vert.x可以让你标记verticle实例作为worker verticle 。
Vert.x确保worker verticles将永远不会被同时执行。
Vert.x系统的体系结构
Vert.x核心服务和模块
Vert.x功能可以分为两类:核心服务和模块核心服务是可从verticle直接调用并包括用于TCP/SSL,HTTP和网络套接字的客户端和服务器上的服务。服务来访问Vert.x事件总线;定时器,缓冲区,流量控制,文件系统访问,共享maps和sets,访问配置,SockJS服务器,以及部署和取消部署verticles。核心服务是相当静态的,预计不会改变,因此所有其他的功能由模块提供。
Vert.x应用和资源可以很容易地打包成模块,并通过Vert.x共享的公共模块库。与模块的交互是通过Vert.x事件总线异步:用JSON发送模块的消息,你的申请将得到答复。模块和集成通过服务总线之间的这种脱钩意味着模块可以在任何支持的语言编写和其它任何支持的语言使用。所以,如果有人写在Ruby中,你想在你的Java应用程序使用这个模块,是完全可以的!
三、Vert.x架构
1、Vert.X概念模型
概念模型
通常,一个进程会创建一个Vert.x实例,Vert.x负责部署Verticle和管理运行时资源。
Verticle实例之间可通过EventBus发送异步消息来通讯,Verticle中的Handler处理发送来的消息。
在集群模式下,通过ClusterManager可发现远程Verticle,EventBus从而可将消息路由到远程Verticle。
2、Vert.X架构模型
架构模型
Vertx的AcceptorEventloopGroup只有1个AcceptorEventloop,即通过1个线程监听所有客户端的连接,连接建立后会交由VertxEventLoopGroup中的一个EventLoop来处理。
Vertx可以将server(HttpServer,TcpServer,UdpServer)部署在多个verticle实例中,这些verticle实例共享这个server。AcceptorEventloop监听和处理连接事件,但NIO读写事件的触发和处理都在VertxEventLoopGroup的EventLoop中执行。
每部署1个verticle实例,都会为该verticle创建1个执行context(每个context都绑定一个EventLoop和Handler处理线程),传入的业务request事件都在此context对应的Handler处理线程中执行。
对于标准模式的verticle,context对应的Handler处理线程就是该verticle绑定的EventLoop线程;对于worker模式的verticle,context对应的Handler处理线程是worker线程。因此,对于标准模式verticle,编解码handler、request handler都在context绑定的EventLoop中执行;对于worker模式verticle,编解码handler会在context绑定的EventLoop中执行,但request handler会在context对应的worker线程中顺序的执行。
任何verticle中通过excuteBlocking方法提交的任务,都会由worker线程池执行;
当部署的verticle数量小于VertxEventLoopGroup的EventLoop数量时,会造成部分EventLoop空闲;当部署的verticle数量大于VertxEventLoopGroup的EventLoop数量时,多个verticle可能绑定同一个EventLoop。
3、架构中重要的概念
Verticle
基于Vert.x框架实现的代码包,就是一个Verticle,简单点说,一个可以被Vert.x框架执行的代码调用了Vert.x API的代码就是一个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更多的信息,我需要单独开一个系列来讲解。
Event Bus
它是Vert.X的核心,在集群中容器之间的通信,各个Verticle之间的通讯都是经过Event Bus来实现的,后期会推出一篇专门关于这个的文章,敬请等待。
Shared Data:
它是Vert.X提供的一个简单共享Map和Set,用来解决各个Verticle之间的数据共享。
参考网址:
http://www.360doc.com/content/18/0203/14/39530679_727432611.shtml
https://www.jianshu.com/p/056f333d97f5
以上是关于VERT.X介绍的主要内容,如果未能解决你的问题,请参考以下文章