vert.x 微服务
Vert.x是用于JVM的React性微服务工具包,它提供了异步,可扩展的并发服务开发模型。 它支持多语种语言开发,并具有对JavaScript,Ruby,Groovy,Scala以及Java的一流支持。
InfoQ有机会赶上了Vert.x的创建者和Vert.x的首席架构师Tim Fox ,以全面了解Vert.x和即将发布的Vert.x 3。
Tim解释了Vert.x与Java EE,Spring和Akka的比较,并解释了Vert.x如何适合微服务,响应式开发。
InfoQ:什么是Vert.x?为什么有人会选择它而不是像Servlets或Java EE或Spring这样的传统Java堆栈?
蒂姆: Vert.x是用于在JVM上编写多语言React式应用程序的工具包。 与传统堆栈不同,它从一开始就考虑微服务,并且在设计时考虑了可伸缩性,因此几乎是完全无阻塞的(OS线程)。
这对于需要处理大量并发性的许多现代应用程序至关重要-例如,处理大量消息或事件,或处理大量连接。
另外,与传统的Java堆栈不同,Vert.x支持Java以外的其他语言,例如JS,Ruby和Groovy,因此我们不强迫您始终使用Java,而是可以将最佳语言用于手头的工作或技能,你的团队。
另一个重要的一点是Vert.x是工具包,而不是容器或“框架”。 这意味着您可以在现有应用程序中使用它来赋予Vert.x超级功能。 例如,您可以在Spring应用程序中使用它,许多用户都可以使用它。
InfoQ:您对Spring有什么想法? 弹簧React堆? Sprint Boot? Node.js?
蒂姆:我非常尊重Spring。 他们在创建丰富的生态系统方面做得非常出色,并且其中的组件几乎可以在阳光下进行所有操作。 对我来说,尽管Vert.x的主要优点是许多Spring API都处于阻塞状态,这将限制可伸缩性,但是Spring在很大程度上仅是Java,而不是像Vert.x这样的多语言。
但我宁愿不要将Vert.x视为Spring的竞争对手。 Vert.x不可能包含和Spring生态系统一样多的片段。 我们不要忘记Vert.x只是一个库,您可以在同一应用程序中将它与Spring一起使用。 我希望随着时间的流逝,Spring生态系统中的更多组件将变得不受阻碍,从而可以在可扩展应用程序中更成功地使用它们。
我们已经看到Spring生态系统的某些部分(如Project Reactor )采用了非阻塞的,事件驱动的方法,因此这是有希望的。
注意: Tim Fox离开VMware并加入RedHat之后,就出现了SpringSource / VMWare的项目React器 。 Project Reactor是Vert.x的竞争对手,并且在焦点和样式上相似。
InfoQ:您对Java EE有何看法? 您对应用程序服务器有何想法?
蒂姆: Java EE最初设计时采用的开发和部署模型与当今现代应用程序所需要的模型完全不同。 Java EE应用程序服务器都具有一个整体服务器,该服务器位于网络中的某个位置,并且您将应用程序打包成jar或ear的形式部署到其中。 这几乎与微服务模型相反。
而且,大多数Java EE API本质上是同步的,因此,大多数Java EE应用服务器必须通过添加线程池来扩展,因为很多事情都在I / O上阻塞(远程JDBC调用,JTA调用,JNDI查找,甚至JMS都有很多)。同步零件)。 众所周知,在可伸缩性方面,添加线程池并不会给您带来太多影响。 因此,实际上,Java EE受到设计的限制,对于需要大量并发的应用程序来说,它永远不是一个好的选择。
Vert.x在许多方面都是对Java EE的React。 公平地说,在最近几年中,出现了使Java EE易于使用的运动,并且我看到一些人为将Java EE重新打包为适用于响应式微服务的模型而付出了艰辛的努力。 但是在我看来,这似乎是一场艰巨的艰苦奋斗-Java EE从来没有考虑到该模型的设计,而将其强加于此将需要对Java EE API进行如此深刻的更改,以至于您不妨丢弃它并重新开始。 这正是我们创建Vert.x的过程。
InfoQ:您对Scala和Akka有何看法?
蒂姆:我尊重并赞赏Scala的强大功能以及可以对其进行编程的人员。 对我来说,Scala的主要问题是它太难了,并且试图做很多事情,这意味着它永远不会像Java那样真正成为主流。 但是,如果您有一支能处理它的超级聪明的开发团队,那么Scala可能是一个不错的选择。
Akka是一个很棒的系统,我也非常尊重它。 在某些领域,它采用与Vert.x类似的方法-例如,Vert.x具有“类似角色”的并发方法,因此我们尝试避免使用可变的共享数据。 Vert.x和Akka都可以使用新的“标准”响应流进行互操作。 Vert.x和Akka在一定程度上都使用同一Zeitgeist (如果有道理!)。
我不认为Vert.x与Akka是“非此即彼”的情况。 我认为看到同时使用Vert.x和Akka的安装以一种很好的可伸缩React方式彼此愉快地交谈是很常见的。
InfoQ:Vert.x的性能与Node.js的性能相比如何?
蒂姆:恩,您可以亲眼看到-TechEmpower BenchMarks
InfoQ:考虑到行业朝着微服务和React式架构的方向发展,您是否对在Vertx的远见卓识感到平反?
蒂姆:我想是的。 当我在2011年创建Vert.x(或最初称为Node.x)时,这是对基于应用服务器的应用程序复杂性的一种React。
从第一天开始,Vert.x一直致力于将您的代码作为自包含服务编写,无论您使用哪种语言,都可以在任意位置运行它们,而不必先在其中预先部署“基础设施”或“应用服务器”。
我们当然是第一个真正推动应用程序开发和部署的微服务模型的项目之一,并且很高兴现在看到它已经变得非常流行,所以是的,我想我确实被证明了。
但是,这还有另一面,当一个想法变得更加主流时,我猜想它也随之而来-那就是每个人都希望跳入模因并宣布自己为微服务。 我们现在可以在各种传统平台上看到这一点,这些传统平台被设计为整体式,现在将它们自己压缩在jar中并添加一个主类,并声明自己为微服务或“React式”,因为它们包含一些异步API。
除了微服务之外,Vert.x的一个关键功能一直是无阻塞。 这就是能够使用最少数量的线程来扩展您的应用程序以处理大量并发的全部内容。 现在,许多用户意识到这一点很重要 。
许多现代应用程序正在处理大量数据,处理大量消息和事件,或处理大量连接,只是无法通过线程池和阻塞(OS线程)实现有效地做到这一点。 事件驱动的可伸缩性是“React式”的重要组成部分,很高兴看到React式也已成为主流-运行React式系统的最近两年已获得JAX创新奖(去年是Vert.x,今年是Akka)。
现在,许多用户都可以使用它,而且非阻塞现在看来比几年前更为主流。因此,我想这也证明了这种方法的正确性。
InfoQ:Vert.x 2和Vert.x 3之间的主要区别是什么?
蒂姆:我们在Vert.x 3中花了很多时间,使事情更易于使用。
在某些方面,Vert.x 2非常类似于容器,但是在Vert.x 3中,我们删除了很多容器,而Vert.x 3确实是可嵌入的。 这就是为什么我们不厌其烦地在Vert.x 3文档中说Vert.x 不是框架或容器。
我们还简化了类加载器模型,默认情况下现在有了一个简单的平面模型(即没有额外的类加载器)。 这更适合您想要将微服务作为简单的主类编写,使用所需的部分然后继续的世界。
Vert.x 3还内置了对RxJava的支持-我们提供所有API的Rx 标准化版本,因此,如果您不喜欢基于回调的方法(例如与从Node.js中获得的方法类似),有时可以尤其是如果您要协调多个数据流时,就很难推理了,那么您可以使用Rx API,该API允许您使用功能样式的操作来合并和转换流。
我们也正在研究Vert.x的实验性新功能,该功能允许您以经典的同步样式编写应用程序,但是在实际上它不阻塞任何OS线程的情况下,您可以获得的可扩展性优势是:阻止OS线程,但没有针对异步API进行编程的回调地狱,即吃饱饭。 如果我们做对了,我们认为这可能是一个杀手er。
Vert.x-Web是我们非常兴奋的另一个真正重要的功能,它是Vert.x-Web-这是用于使用Vert.x编写现代Web应用程序的工具包。
Vert.x-Web包含制作复杂的现代,可伸缩的Web应用程序所需的所有部分,当然,您可以从Vert.x支持的任何语言中使用它。 它包含您期望的所有内容-cookie和会话处理,可插入身份验证,模板,websocket,对SockJS的支持,内容协商以及许多其他功能。
它非常适合您正在编写的任何类型的Web应用程序,无论是“传统”服务器呈现的Web应用程序,HTTP / REST微服务还是客户端呈现的Web应用程序。
您可以浏览新的进行中的Vert.x 3网站 ,其中包含有关各个部分的大量信息。
InfoQ:您对React堆模式有何看法? 您认为Vertx如何适应这一领域?
蒂姆: Vert.x在React堆模式上使用了一种变体,我们称之为“多React器”。 因此,我们不仅拥有一个事件循环,还拥有多个事件循环,但是我们保证任何特定的处理程序都将始终由同一事件循环调用。 这意味着您可以将代码编写为单线程(不必担心同步,易失等),但仍可以轻松扩展。
因此,您可以获得React堆模型的好处,但是由于与纯React堆实现(例如Node.js)不同,我们无需部署许多服务器实例即可更轻松地在服务器核心上进行扩展。
InfoQ:您认为运行时指标对现代开发有多重要? Vert.x 3支持什么以简化收集指标?
蒂姆:运行时指标非常重要,因此您知道Vert.x中的情况。 Vert.x 3提供了指标SPI,您可以在其中插入提供程序以收集Vert.x的指标。 我们有一个开箱即用的指标实现,该实现使用DropWizard指标,而工作中的另一个实现使用Hawkular。
InfoQ:性能:当我看到TechEmpower基准测试并看到Vert.x占据主导地位时,我开始使用Vert.x。 在某些测试中,它通常是最快的,如果不是最快的话,则是前三名。 最近,我没有看到它在基准测试中竞争,我认为这是因为专注于Vertx3。Vertx3的性能如何?
蒂姆:我们撤回了最近的结果,因为它们是针对较旧版本的Vert.x进行的测试,因此它实际上并不是最新版本的代表,并且我们没有时间或资源来保持基准的最新信息。我们的小型永久团队。
Vert.x 3尚未进行性能调整,但是一旦完成并获得3.0,我们就可以花一些时间来更新基准测试并发布结果。
InfoQ:Vertx是多语言的吗? 哪些开发人员最讨厌哪种语言? Vertx社区占每种语言的百分比? Vert.x社区有多大?
蒂姆:在我看来,每个语言社区都有令人讨厌的开发人员,也有一些非常有用和知识渊博的开发人员。
Vert.x社区有多大? 这很难衡量,但是我们有非常活跃的google小组,而且我们是GitHub上最受瞩目的Java项目之一。 我们也有很多公司在生产中使用我们,不管是大牌还是小号(您可以在网站上看到其中的一些),尽管我们还不容易算出全部(尽管),但并不容易提供任何商业支持。
InfoQ:在Vert.x 3中做了什么以简化Vert.x的开发?
蒂姆:在Vert.x 2中我们发现的一件事是,我们以Vert.x特有的方式完成了某些工作,这对某些开发人员来说似乎有些陌生和棘手,尤其是那些来自“传统” Java背景的开发人员到基于Maven的项目和打包。 例如,我们拥有自己的模块系统以及自己的描述符,而您在其他任何地方都找不到。 Vert.x 2也有一个稍微复杂的类加载器模型,这使得在IDE中轻松运行变得有些棘手。
在Vert.x 3中,我们决定停止推波助澜,而是以大多数Java开发人员期望的方式进行操作-因此,我们放弃了模块系统并简化了类加载器模型(默认情况下,现在是平面类加载器模型)。 现在,Vert.x组件打包为标准jar,您可以像处理Maven或Bintray的任何其他依赖项一样处理它们。 平面类加载器模型使在IDE中运行和调试变得更容易-只需创建一个main即可使用。 所有这些都为Vert.x 3的开发提供了更加轻松简单的体验。
InfoQ:Vert.x对MongoDB,MySQL和PostgreSQL有什么样的支持? 为什么异步对数据库很重要?
蒂姆: Vert.x 3只是一个库,因此您可以将其与任何其他您喜欢的Java库一起使用,包括任何数据库客户端。 但是,大多数Java数据库客户端倾向于阻塞,因此您必须注意不要阻塞Vert.x事件循环。
Vert.x 3提供了一个异步JDBC客户端,该客户端基本上包装了JDBC接口并使用线程池对其进行调用,并为用户提供了一个异步接口,因此用户不必担心自己包装它。 显然,客户端仍在阻止对JDBC的内部调用,但是我们无能为力,因为JDBC本质上是同步的,并且调用通常会在网络I / O上阻止。 在理想情况下,Oracle将推出一个官方的异步JDBC API,并且驱动程序供应商将编写非阻塞版本的驱动程序,但是传统的RDBMs厂商在采用上似乎很慢。
NoSQL供应商似乎更快地了解了非阻塞很重要。 例如,MongoDB在Mongo 3.0中推出了一个完全异步的客户端,我们在Vert.x 3中使用了该客户端。还有一个新的Mongo Rx客户端,看起来很酷。
因此,非阻塞数据访问的选项越来越多,并且我希望随着时间的流逝,这种数量会增加(甚至传统的Old SQL供应商也会使用!),因为数据库供应商意识到了需求。
为什么非阻塞数据库访问很重要? 同样,这是关于大量并发扩展应用程序的。
假设您的应用程序需要使用JDBC API对远程数据库执行数据库查询。 请记住,这可能不是一个数据库,而可能是位于不同服务器上的100个数据库。 假设每个查询平均需要一秒钟返回一个结果。 假设您有一个线程池来执行这些请求,最大大小为200(这似乎是一个合理的数字)。
进行数学运算后,您可以轻松地看出,每秒执行的请求数量绝不能超过200个。 这就是您系统中的瓶颈。 远程服务器可能很容易就能应付更多的负载,但是由于您拥有最多200个线程,因此您再也无法比这更快。 当然,如果您的数据库服务器已经真正达到极限,那么在客户端上使用异步将不会提高吞吐量! 但是,在这种情况下,它们的阻塞模型具有备用容量,这限制了您的总体吞吐量。
InfoQ:Java 8对Vertx 3有多重要? 您认为lambda表达式使Vertx比使用匿名内部类更具吸引力吗?
蒂姆: Java 8对Vert.x 3非常重要。也许对我们来说两个最重要的功能是lambda和Nashorn。 Lambda使基于事件样式API的编程变得更加出色,并且我们在JavaScript实现中使用了Nashorn JavaScript引擎。
其他资源:
- Vert.x的高性能响应式应用程序第1部分 -Tim Fox所作的有关使用Vert.x创建响应式应用程序的演示。
- Vert.x的高性能React性应用程序第2部分
- Tim Fox:Vert.x 2.0的新功能-2013年7月 -Tim Fox讨论了Vert.x 2。
- Vert.x加入Eclipse基金会 -Vert.x由Eclipse基金会托管,作为VMWare与Vert.x社区之间协议的一部分。
- Vert.x的未来是什么? - 2013年1月 -涵盖了自解决以来有关Vert.x所有权的一些争议。
- Java微服务体系结构描述了在Java微服务体系结构中哪些种类的重要事物,例如服务发现和运行时统计信息 。 Vert.x 3所采用的东西甚至超过了Vert.x 2。
- 这是一个简单的helloworld微服务示例的链接
关于被访者
Tim Fox从事软件工程已有18年。 在过去的8年中,他一直非常参与开源社区。 蒂姆在红帽工作。 Tim是Vert.x(React式,多语言应用程序平台)的创建者和项目负责人。 蒂姆还从事过JBoss HornetQ的开发工作,该工作现在是Wildfly(以前称为JBoss Application Server)的核心。 蒂姆还在SpringSource等公司从事RabbitMQ的工作。
关于面试官
Rick Hightower使用Vert.x已有一段时间了。 Rick在Vertx之上构建了一个称为QBit的REST / WebSocket / High-speed排队库,该库是Java的微服务库 。 最初,他对Vert.x感兴趣,原因是它的速度和需要以少量预算构建一套1亿个用户微服务。 他与多个客户一起使用Vert.x产生了积极的效果。 QBit受到Vert.x的极大启发。 Rick还编写了Boon ,这是用Java编写的高速JSON解析器。 Rick关于响应式微服务的文章很多。
vert.x 微服务