点击上方“方志朋”,选择“设为星标”

回复”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 框架相关推荐

  1. 这是目前最快的 Java 框架,300个框架中排名第一,真香

    如果您搜索" 最佳网络框架 ",您可能会偶然发现Techempower基准测试,其中排名超过300个框架,在那里你可能已经注意到Vert.x是排名最高的. Vert.x是一个多语言 ...

  2. 快学Java NIO

    Java NIO Tutorial 地址:http://tutorials.jenkov.com/java-nio/index.html Java NIO系列教程译文地址:http://ifeve.c ...

  3. 【janio】janio 官网 翻译 Janino 是一个超小、超快的 Java 编译器

    1.概述 翻译:http://janino-compiler.github.io/janino/#janino-as-a%20compiler Janino 是一个超小.超快的 Java 编译器. J ...

  4. java 小鸡_小鸡快跳java

    小鸡快跳java(Chicken Jump)是一款很有意思的休闲跑酷手游.游戏画风清新精致,玩法简单易上手,你需要操控小鸡一直向前奔跑,注意避开马路上的汽车哦! 游戏介绍 想象一场你追我赶的赛车游戏, ...

  5. Google道歉作协“不理” 新语言anic:比C快比Java安全比shell简单(每日关注2010.1.11)

    Google被迫向中国作家道歉 中国作协回应称其诚意不够 2010年1月11日消息,昨日中国作协在其官网发布谷歌侵权案的最新进展,谷歌公司代表埃瑞克·哈特曼正式致信中国作协表示道歉,表示希望通过与文著 ...

  6. 最快的Pythonweb框架之一:FastAPI 初探

    最快的Pythonweb框架之一:FastAPI 初探 希望和大家一起来学习FastAPI 异步 web框架,记录一下,当做笔记. 文档资源: 官网:https://fastapi.tiangolo. ...

  7. light java框架_Java框架之light-4j( 比Spring Boot快44倍,性能好 )

    Java框架之light-4j(比Spring Boot快44倍,性能好) light-java是内置了undertow服务器的REST微服务轻量Java框架,它比Spring Boot内嵌Tomca ...

  8. 2018开发最快的Webapp框架--BUI交互框架

    原文地址: https://segmentfault.com/a/1190000012994082 一.案例代表 这是你看下去的动力, 我用BUI仿照QQ的手机截图做出来的一个demo, 包含QQ的常 ...

  9. 2018开发最快的Webapp框架--BUI交互框架 1

    一.案例代表 这是你看下去的动力, 我用BUI仿照QQ的手机截图做出来的一个demo, 包含QQ的常见交互, 侧滑边栏,TAB切换,侧滑列表,下拉刷新,下拉菜单,弹窗搜索等交互操作, 这几种操作很多U ...

最新文章

  1. 什么是好的图神经网络?
  2. 浪潮信息:企业互联网化下的数据平台升级 | 云·创课程实录
  3. QT,C++多项式计算器—version3(厌倦CMD黑框框的走起!)
  4. stm32g474教程_STM32-开发入门教程
  5. Elasticsearch master节点的作用以及脑裂现象
  6. 在本地计算机无法启动windows audio,win10系统无法启动windowsaudio服务的操作步骤
  7. ux和ui_糟糕的UI与UX番茄酱模因
  8. 10年IT老兵酒后吐真言,我看了5遍...
  9. Centos 安装 JDK8
  10. 某东商城获取eid和fp参数方法
  11. Java对象内存布局
  12. U盘安装CentOS7的最终解决方案
  13. 列出1-100的所有质数的两种方法
  14. Oracle报错01756,oracle导入数据报错处理
  15. oracle rman备份和恢复数据库,Oracle rman备份和还原恢复数据库
  16. RHCSA-Day1 --- Linux介绍及环境搭建
  17. python sorted函数倒序_Python sorted函数
  18. linux系统semba,examples.desktop
  19. 计算机基础常用英语,计算机常用基础英语
  20. selectpicker 清空选项_boostrap selectpicker 用法

热门文章

  1. [ JSOI 2015 ] Salesman
  2. python开发环境安装
  3. poj2289二分图多重匹配
  4. Android studio快捷键
  5. void *指针的加减运算
  6. 开发微信小程序入门前
  7. Android驱动学习-内部机制_回顾binder框架关键点
  8. Android 4.2真坑爹
  9. 什么是人工神经网络?
  10. 这个宝藏工具,给你一种黑客般的感觉