响应式微服务 in Java 译 --Asynchronous Development Model<四>

 

What About Vert.x ?java

Vert.x使用异步非阻塞构建响应式分布式系统的工具集的开发模型,由于这是一个工具集而不是一个框架,因此你可使用Vert.x做为一个类库,它不包含你怎么构建和架构你的系统。你能够为所欲为地使用,Vert.x是很是灵活的,你可使用在单独应用中,或者内嵌到一个大项目中。react

从开发者的角度来看,Vert.x是一系列的JAR文件。每个Vert.x是一个JAR包,你能够加到你的$CLASSPATH中。从HTTP服务,客户端,到消息,到底层点的协议TCP或UDP,Vert.x提供了大量的Modules构建你想要的项目。你能够选择任何模块除了Vert.x Core构建你的系统,Figure 2-2显示Vert.x生态系统的概念。数据库

Figure 2-2编程

Vert.x也提供了大量的栈帮助构建微服务,在微服务流行前,Vert.x就在推微服务的方法。它被设计和构形成直观和强大的方式构建微服务。不只仅如此,Vert.x构建的微服务,它有一个重要的特性:到处异步。微信

Asynchronous Development Model架构

Vert.x构建的全部应用都是异步的,是时间驱动和非阻塞的,当有趣的事情发生的时候,你的应用被触发。让咱们看个具体的例子,Vert.x提供了简单的方式建立HTTP服务,只要HTTP请求到达的时候,服务就会响应:并发

在这个例子中,咱们设定requestHandler来接受HTTP服务,发送“hello Vert.x”,一个Handler是一个方法处理事件。在咱们的例子里,handler的代码处理每个来的请求,注意到并无返回一个result,而是handler提供一个result,result怎么被提供依赖于交互的类型。在最后的代码片断里面,把result写到HTTP的response中就好。这个handler被链到socket监听请求上,HTTP endpoint相应一个简单的HTTP response。负载均衡

因为不多有异常,Vert.x的APIs不会阻塞调用线程,若是一个result能够被很快地提供,将会返回;不然,一个handler被用于稍后接受事件。当事件准备被执行的就是触发程序Handler,或者一个异步的操做完成。框架

在传统的命令式编程,你能够这样写:异步

在这个代码中,你会等到结果的返回,当转换到异步非阻塞的开发模型,当结果准备好的时候才会invoked:

在最后的代码片断中,计算怎么都不会返回一个结果,因此在结果计算完成返回以前不会等待。

得益于非阻塞的开发模型,你能够处理高度并行的工做负载使用一个小数量的线程,这一事件循环在图2-3所描绘的。它消耗事件队列和调度到每一个事件感兴趣的处理程序。

Figure 2-3

线程模型的事件循环的提出有一个巨大的好处,这简化了并发。就像这里只有一个线程,老是被同一个线程中不一样时调用。可是这里有一个重要的规则你必须遵照:

由于没有阻塞,因此一个event loop能够在短期内分发大量的事件,这种Reactor_pattern(https://en.wikipedia.org/wiki/Reactor_pattern)

咱们假设,在某一个瞬间,咱们打破这个这个规则。在以前的代码片断里,request handler老是被相同的event loop调用,所以HTTP请求会阻塞,不会马上返回给用户,其余请求不会被执行,而是放在请求队列里,等待线程释放,就失去了Vert.x带来的可拓展性和效率,所以什么样的会阻塞?第一个最明显的就是数据库链接,长的计算也会阻塞。如把圆周率精度计算到200,000位会阻塞。不用担忧--Vert.x提供告终构来处理这些阻塞代码。 

在一个标准的reactor 实现中,有一个event loop线程处理到达的请求不断分发给处理程序,单线程可运行在CPU的单个核中;可是Vert.x 不是这么运行的,取代单event loop的是,Vert.x 实例能够管理多个event loops,这个被叫作 multireactor 模型,以下图所示:

事件能够被不一样的 Event loops 分发,然而,一旦Handler被执行,后续在那个是被这个 event loop调用,执行了并发带来的好处,像FIgure 2-4,你有多个 Event loops,能够负载均衡到不一样的CPU,这个在处理HTTP请求例子是怎么作的呢?Vert.x 注册 socket 监听,分发不一样的请求到不一样的 event loops。

原文地址:

https://developers.redhat.com/promotions/building-reactive-microservices-in-java/

有什么讨论的内容,能够发我微信公众号:

相关文章
相关标签/搜索