您的位置:首页 > 产品设计 > UI/UE

vert.x guide 译(一)

2017-11-20 00:00 253 查看
摘要: vert.x异步编程

介绍:

本指南是一个入门的介绍使用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.net socket 类)可以使用更少的线程。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/



我的微信公众号:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vertx