vert.x guide 译(一)

2017-11-22 14:17:23来源:oschina作者:woshixin人点击

分享

介绍:


本指南是一个入门的介绍使用vert.x异步编程,主要面对对象是已经熟悉主流非异步Web开发框架和库开发者(比如Java EE, Spring)


关于这个guide:


我们假设读者已经熟悉java编程语言及其生态系统。


我们将从一个支持关系数据库和服务器端页面呈现的wiki Web应用程序开始;然后我们将通过几个步骤来开发应用程序,直到它变成一个具有“实时”Web特性的现代应用程序。一路上你会学会:


1.设计一个Web应用程序,服务器端通过模板呈现页面,并使用关系数据库来保存数据。


2.清晰隔离每个技术组件作为一个可重用的处理单元。


3.提取vert.x服务促进无缝连接在同一个JVM进程或集群中的分布式节点之间的沟通设计。


4.用异步操作测试代码。


5.与第三方服务集成,提供了Web API。


6.发布一个a HTTP/JSON web API。


7.使用HTTPS访问安全控制,Web浏览器会话和JWT tokens为第三方的客户端应用程序的认证。


8.用流行的响应式RxJava类库和vert.x集合来重构代码。


9.用AngularJS编写客户端程序。


10.使用Vert.x event bus集成SockJS来实时WEB编程。


NOTE:本文档和示例代码的来源可从https://github.com/vert-x3/vertx-guide-for-java-devs。我们欢迎issue reports, feedback and pull-requests!


Vert.x是什么?

Eclipse Vert.x是建立在JVM上的编写响应式程序的工具集。


---Vert.x website


Eclipse Vert.x(我们在这份文档中简单的称vert.x)是一个eclipse基金会开源的项目,由Tim Fox在2012年建立。vert.x不算一个框架,称之为一个工具集吧:核心的类库定义了编写异步网络应用的基础APIs。你可以把这个特性应用到你的应用中用到的模块中(比如数据库连接,监控,认证,日志,服务发现,集群支持...)。vert.x是基于netty项目,一个在JVM上高效的异步网络编程库。如果需要vert.x会让你接触netty的内部实现,总的来说你会得益于vert.x提供的vert.x提供的高水准的apis,但是与netty比较又没有牺牲性能。


vert.x包不需要引入其他包或者构建环境,因为Vert.x core自身就是一个常规的类库,可以嵌入到应用的包管理中。一个简单的包包含了所有的依赖,并且它可以在流行的组件或者用用容器中。


因为vert.x是被设计异步通讯,可以处理并发的网络连接,比如同步的apis(比如Java servlets 或 java.netsocket 类)可以使用更少的线程。vert.x可以应用于大量的应用中:high volume message / event processing,微服务,API gateways,提供给客户端应用的apis等。Vert.x和它的生态体系可以提供各种各样的技术工具用于构建end-to-end 响应式应用。


虽然这会使vert.x听起来仅适用于符合要求的应用,这份指导也指出vert.x也可以在传统应用中工作的很好。如我们所想,代码写的相对于容易理解。但是在看应用的代码的拓展部分中可能遇到一个难点是:事件的异步处理。


最后,值得一提的是vert.x支持大部分JVM语言,Java, Groovy, Scala, Kotlin, JavaScript, Ruby and Ceylon。vert.x不仅仅提供了不同语言的apis,而已在不同的语言中使用地道的语法应用于apis(比如用Scala futures取代Vert.x futures)。所以使Vert.x用不同的JVM语言编写不同的技术模块变成可能。


Vert.x核心概念:

这有两个核心概念在学习 vert.x中:


1.verticle是什么


2.在event bus中怎么控制verticles通讯


线程模型


大量网络库或者框架依赖于一个单线程策略:每一个网络客户端连接分配一个线程,并且这个线程处理完客户端时间直到连接关闭。这就是Servlet和网络编程需要加入java.io和java.net包的原因所在了。这种同步的I/O的线程模型的好处就是容易理解。但是破坏了当有大量网络并发连接的拓展性,尤其对于系统的线程开销也不便宜,在操作系统的内核中花了很多时间在线程调度的管理上。在这种情况下,我们需要移步到异步I/O上,这方面,vert.x提供了坚实的基础。



每一个事件被分配一个合理的时间段,不至于阻塞了event loop,这样阻塞的线程就不会在event loop中执行,恰是在一个图形用户界面事件处理中(通过慢速网络请求冻结 java/swing interface)。在这个guide的后面我们可以看到,vert.x提供了在event loop外面处理阻塞线程的操作。在任何情况下,当一个线处理花了太长事件,vert.x在日志中打印出警告信息,这也可以根据应用的特定要求进行配置(比如,slower IoT ARM boards)。


每一个event loop依于一个线程,默认vert.x在每个cpu内核上占用2个event loops。导致的直接后果就是verticle总是处理事件在同一线程上,所以没有必要使用线程的协调机制来操纵一个verticle状态(eg.Java class fields)


verticle可以添加一些配置(eg.证书,network地址),verticle也可以被部署多次。



传进来的网络数据会被接受数据的线程接受,然后会被处理成events传递给相应的verticles。当一个verticle打开了一个network服务并且deploy多次,然后event会以循环的方式分配给verticle实例。在有很多请求的并发网络情况下,对最大限度的CPU使用率是非常有用的。


Event bus

Vert.x中event-bus是不同verticles通过异步消息通讯的主要工具。例如,假设我们有一个verticle处理HTTP请求,还有一个verticle处理连接数据库的连接通讯。这时候event bus允许HTTP verticle发送一个请求给database verticle执行sql查询的操作,然后返回结果给HTTP verticle。



event-bus可以使用任何类型的数据格式,但是JSON是最好的格式选择,因为这样可以让verticles用不同的语言进行通讯,而且JSON是一种流行的通用的半结构化数据封送处理文本格式。


消息可以被自由选择的格式发送到它的目的地,event-bus支持下面的通讯格式:


1.point-to-point消息


2.request-response消息


3.publish / subscribe消息


event-bus可以允许verticles的沟通不仅仅是在同一个JVM进程上:

当环境是集群的,event-bus是分布式的,所以消息可以被发到其他机器上节点上运行的verticle。


event-bus可以通过简单的TCP协议使第三方应用进行交流。


event-bus也可以用通用的消息桥梁暴露(e.g, AMQP, Stomp)


SockJS允许web应用在event-bus无缝的通讯,通过在浏览器上运行的JavaScript来接受和发布消息,就如任何verticle做的一样。

能力有限,只能翻译成这样了,见谅!


原文链接:http://vertx.io/docs/guide-for-java-devs/



最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台