Vert.x!这是目前最快的 Java 框架
点击上方“方志朋”,选择“设为星标”
回复”666“获取新整理的面试资料
来源:jdon.com/51872
如果您搜索“最佳网络框架 ”,您可能会偶然发现Techempower基准测试,其中排名超过300个框架,在那里你可能已经注意到Vert.x是排名最高的。
Vert.x是一个多语言 Web 框架,它支持Java ,Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。无论语言如何,Vert.x都在Java虚拟机(JVM)上运行。模块化和轻量级,它面向微服务开发。
Techempower基准测试衡量从数据库更新,获取和交付数据的性能。每秒提供的请求越多越好。在这种涉及很少计算的IO场景中,任何非阻塞框架都会有优势。近年来,这种范式几乎与Node.js不可分割,Node.js通过其单线程事件循环来推广它。
与Node类似,Vert.x运行单个事件循环。但Vert.x也利用了JVM。Node运行在单个核心上,而Vert.x维护的线程池大小可以与可用核心数相匹配。凭借更强的并发支持,Vert.x不仅适用于IO,也适用于需要并行计算的CPU繁重流程。
然而,事件循环只是故事的一半。另一半与Vert.x几乎没有关系。Java必备的 15 个框架,推荐看下。
要连接到数据库,客户端需要连接器驱动程序。在Java领域,Sql最常见的驱动程序是JDBC。问题是,这个驱动程序阻塞了。它在套接字级别阻塞。一个线程总会卡在那里,直到它返回一个响应。
毋庸置疑,驱动程序一直是实现完全无阻塞应用程序的瓶颈。幸运的是,在具有多个活动分叉的异步驱动程序上取得了进展(尽管是非官方的),其中包括:
https://github.com/jasync-sql/jasync-sql(适用于Postgres和MySql)
https://github.com/reactiverse/reactive-pg-client(Postgres)
黄金法则
使用Vert.x非常简单,只需几行代码即可启动http服务器。
val vertx = Vertx.vertx()
vertx.createHttpServer().requestHandler(req => {}).listen(8080)
方法requestHandler是事件循环传递请求事件的地方。由于Vert.x没有意见,处理它是自由的风格。但请记住非阻塞线程的唯一重要规则:不要阻止它。
在使用并发时,我们可以从如今的许多选项中获取,例如Promise,Future,Rx,以及Vert.x自己的惯用方法。但随着应用程序复杂性的增加,单独使用异步功能是不够的。我们还需要轻松协调和链接调用,同时避免回调地狱,以及优雅地传递任何错误。
Scala Future满足上述所有条件,并具有基于函数式编程原理的额外优势。虽然本文不深入探讨Scala Future,但我们可以通过一个简单的应用程序来尝试它。
假设该应用程序是一个API服务,用于查找给定其ID的用户:
val vertx = Vertx.vertx()
vertx.createHttpServer().requestHandler(req => {req.path() match {case p if p contains("/user") =>val f = for {f1 <- Future { req.getParam("id").get.toInt }f2 <- if (f1 < 100) Future.unit else Future.failed(CustomException())f3 <- Future { getUserFromDb(f1) }} yield f3f map (r => printout(req, r)) recover {case exception => printout(req, handleException(exception))}case _ => printout(req, "Default page")
}})
.listen(8080)def printout(req: HttpServerRequest, msg: String) = req.response().end(msg)def handleException(e: Throwable): String = {
e match {case t: NoSuchElementException => "Missing parameter"case t: NumberFormatException => "Parameter not number"case t: CustomException => "Custom exception"case t: SQLException => "Database error"case _ => "Unknown error"
}
}def getUserFromDb(id: Int) = "mock user name"case class CustomException() extends Exception("custom exception")
涉及三个操作:检查请求参数,检查id是否有效以及获取数据。我们将把这些操作包装在Future中,并在“for comprehension”结构中协调执行。
第一步是将请求与服务匹配。
Scala具有强大的模式匹配功能,我们可以将其用于此目的。在这里,我们拦截任何提及“/ user”并将其传递给我们的服务。
接下来是这项服务的核心,我们的期货按顺序排列。
第一个furture 未来f1包装参数检查。我们特别想从get请求中检索id并将其转换为int。(如果返回值是方法中的最后一行,Scala不需要显式返回。)如您所见,此操作可能会抛出异常,因为id可能不是int或甚至不可用,但现在可以。
第二个furture f2检查id的有效性。
我们通过使用我们自己的CustomException显式调用Future.failed来阻止任何低于100的id。否则,我们以Future.unit的形式传递一个空的Future作为成功验证。
最后的furture f3将使用f1提供的id检索用户。
由于这只是一个示例,我们并没有真正连接到数据库。我们只返回一些模拟字符串。
map运行从f3生成用户数据的排列,然后将其打印到响应中。
现在,如果在序列的任何部分发生错误,则传递Throwable进行恢复。
在这里,我们可以将其类型与合适的恢复策略相匹配。回顾一下我们的代码,我们已经预料到了几个潜在的失败,例如缺少id,或者id不是int或者无效会导致特定异常。我们通过向客户端传递错误消息来处理handleException中的每一个。
这种安排不仅提供从开始到结束的异步流程,还提供处理错误的干净方法。由于它是跨处理程序的简化,我们可以专注于重要的事情,如数据库查询。
Verticles,Event Bus和其他陷阱
Vert.x还提供了一个名为verticle的并发模型,类似于Actor系统。Verticle隔离其状态和行为以提供线程安全的环境。与之通信的唯一方法是通过事件总线。
但是,Vert.x事件总线要求其消息为String或JSON。
这使得传递任意非POJO对象变得困难。在高性能系统中,处理JSON转换是不可取的,因为它会带来一些计算成本。如果您正在开发IO应用程序,最好不要使用Verticle或事件总线 ,因为这样的应用程序几乎不需要本地状态。
使用某些Vert.x组件也非常具有挑战性。
您可能会发现缺少文档,意外行为甚至无法正常运行。Vert.x可能正在遭受其雄心壮志,因为开发新组件需要移植多种语言。这是一项艰巨的任务。因此,坚持核心将是最好的。
如果您正在开发公共API,那么vertx-core就足够了。如果它是一个Web应用程序,您可以添加vertx-web,它提供http参数处理和JWT / Session身份验证。
无论如何,这两个是主导基准的。在使用vertx-web的一些测试中,性能有所下降,但由于它似乎源于优化,因此可能会在后续版本中得到解决。
热门内容:
SpringBoot线程池的创建、@Async配置步骤及注意事项
看看,这些细节上的坑,你犯了多少?
老大说,网上这种获取真实IP地址的方法不对,我不信...
AJAX 请求真的不安全么?
你知道为什么Java的main方法必须是public static void?
谈谈中间件开发,给想从事中间件开发的同学
大年夜排查bug:竟然是同事把Redis用成这鬼样子,坑了我
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
Vert.x!这是目前最快的 Java 框架相关推荐
- 这是目前最快的 Java 框架,300个框架中排名第一,真香
如果您搜索" 最佳网络框架 ",您可能会偶然发现Techempower基准测试,其中排名超过300个框架,在那里你可能已经注意到Vert.x是排名最高的. Vert.x是一个多语言 ...
- 快学Java NIO
Java NIO Tutorial 地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO系列教程译文地址:http://ifeve.c ...
- 【janio】janio 官网 翻译 Janino 是一个超小、超快的 Java 编译器
1.概述 翻译:http://janino-compiler.github.io/janino/#janino-as-a%20compiler Janino 是一个超小.超快的 Java 编译器. J ...
- java 小鸡_小鸡快跳java
小鸡快跳java(Chicken Jump)是一款很有意思的休闲跑酷手游.游戏画风清新精致,玩法简单易上手,你需要操控小鸡一直向前奔跑,注意避开马路上的汽车哦! 游戏介绍 想象一场你追我赶的赛车游戏, ...
- Google道歉作协“不理” 新语言anic:比C快比Java安全比shell简单(每日关注2010.1.11)
Google被迫向中国作家道歉 中国作协回应称其诚意不够 2010年1月11日消息,昨日中国作协在其官网发布谷歌侵权案的最新进展,谷歌公司代表埃瑞克·哈特曼正式致信中国作协表示道歉,表示希望通过与文著 ...
- 最快的Pythonweb框架之一:FastAPI 初探
最快的Pythonweb框架之一:FastAPI 初探 希望和大家一起来学习FastAPI 异步 web框架,记录一下,当做笔记. 文档资源: 官网:https://fastapi.tiangolo. ...
- light java框架_Java框架之light-4j( 比Spring Boot快44倍,性能好 )
Java框架之light-4j(比Spring Boot快44倍,性能好) light-java是内置了undertow服务器的REST微服务轻量Java框架,它比Spring Boot内嵌Tomca ...
- 2018开发最快的Webapp框架--BUI交互框架
原文地址: https://segmentfault.com/a/1190000012994082 一.案例代表 这是你看下去的动力, 我用BUI仿照QQ的手机截图做出来的一个demo, 包含QQ的常 ...
- 2018开发最快的Webapp框架--BUI交互框架 1
一.案例代表 这是你看下去的动力, 我用BUI仿照QQ的手机截图做出来的一个demo, 包含QQ的常见交互, 侧滑边栏,TAB切换,侧滑列表,下拉刷新,下拉菜单,弹窗搜索等交互操作, 这几种操作很多U ...
最新文章
- 什么是好的图神经网络?
- 浪潮信息:企业互联网化下的数据平台升级 | 云·创课程实录
- QT,C++多项式计算器—version3(厌倦CMD黑框框的走起!)
- stm32g474教程_STM32-开发入门教程
- Elasticsearch master节点的作用以及脑裂现象
- 在本地计算机无法启动windows audio,win10系统无法启动windowsaudio服务的操作步骤
- ux和ui_糟糕的UI与UX番茄酱模因
- 10年IT老兵酒后吐真言,我看了5遍...
- Centos 安装 JDK8
- 某东商城获取eid和fp参数方法
- Java对象内存布局
- U盘安装CentOS7的最终解决方案
- 列出1-100的所有质数的两种方法
- Oracle报错01756,oracle导入数据报错处理
- oracle rman备份和恢复数据库,Oracle rman备份和还原恢复数据库
- RHCSA-Day1 --- Linux介绍及环境搭建
- python sorted函数倒序_Python sorted函数
- linux系统semba,examples.desktop
- 计算机基础常用英语,计算机常用基础英语
- selectpicker 清空选项_boostrap selectpicker 用法