如果您搜索“ 最佳网络框架 ”,您可能会偶然发现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。 问题是,这个驱动程序阻塞了。 它在套接字级别阻塞。 一个线程总会卡在那里,直到它返回一个响应。

毋庸置疑,驱动程序一直是实现完全无阻塞应用程序的瓶颈。 幸运的是,在具有多个活动分叉的异步驱动程序上取得了进展(尽管是非官方的),其中包括:

  1. https://github.com/jasync-sql/jasync-sql(适用于Postgres和MySql)
  2. 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的一些测试中,性能有所下降,但由于它似乎源于优化,因此可能会在后续版本中得到解决。

这是目前最快的 Java 框架,300个框架中排名第一,真香相关推荐

  1. 比MySQL快801倍,字节阿里争相 部署,真香!

    信息化时代,数据即价值.前瞻未来,数据价值的挖掘和沉淀是大数据领域重要的发展方向,是大数据广大开发工程师进阶的必备技能和职业素养. OLAP(Online Analysis Processing)联机 ...

  2. Java进阶面试资料无偿分享!真香系列

    8-22 投递简历 8-24 一面(大概1h50min) 0.currenthashmap怎么扩容的?fwn为什么固定hash -1,这样设计有什么好处?帮助扩容是发生在什么阶段?读线程和写线程都会帮 ...

  3. Java 8 的异步编程利器 CompletableFuture 真香!

    大家好,我是不才陈某~ 最近刚好使用CompeletableFuture优化了项目中的代码,所以跟大家一起学习CompletableFuture. 一个例子回顾 Future 因为Completabl ...

  4. Day 30: Play Framework —— Java开发者的梦想框架

    今天是最后一天,我决定学习一下 Play 框架.原本是想写关于Scala的,学习了几个小时之后发现在一天之内是不可能完成Scala的,所以今天会介绍一下Play框架的基本知识,然后学习如何用它开发应用 ...

  5. Vert.x!这是目前最快的 Java 框架

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:jdon.com/51872 如果您搜索"最佳网络 ...

  6. Java对象XML序列化框架-Simple2.0

    Java对象XML序列化框架-Simple2.0 Simple是一个XML序列化框架,一个Java 版本宽容的序列化框架,能够快速在Java 平台上开发XML.支持通过annotations完全配置化 ...

  7. Java开源——常见J2EE框架简介

    Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...

  8. Thinking in java基础之集合框架

    Thinking in java基础之集合框架 大家都知道我的习惯,先上图说话. 集合简介(容器) 把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成 ...

  9. java把map值放入vector_Thinking in java基础之集合框架

    Thinking in java基础之集合框架 大家都知道我的习惯,先上图说话. 集合简介(容器) 把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成 ...

最新文章

  1. 通过rsync+inotify实现数据的实时备份
  2. automapper
  3. 【产品干货】衡量移动APP“价值”的9个重要的KPI指标
  4. 【网络编程】之八、异步选择WSAAsyncSelect
  5. IOZONE测试工具使用方法(转载)
  6. 认清当下的努力,可能毫无意义
  7. POJ 1703 Find them, Catch them 并查集
  8. 50预训练权重_MMDetection笔记:修改预训练模型权重类别数
  9. 高速公路坐标高程计算软件3.6版本发布
  10. 黑马程序员---三天快速入门Python机器学习(第一天)
  11. 【openlayers】ol3入门一基础篇
  12. 逆矩阵与矩阵的特征值的关系
  13. 从零开始创建一个uni-app项目
  14. android麦克风录音格式,Android 中使用MIC(麦克风)录音
  15. cas自定义登陆认证
  16. Ubuntu 18.04 安装 GeForce RTX 3080
  17. Java的GUI编程---贪吃蛇游戏实现
  18. 回顾暑假,用时间铸就规律生活
  19. mysql_d58_ 主键_外键_自增_索引_一对一_多对多_limit_分组_连表操作
  20. 从UQ、3Q大战看当今互联网格局

热门文章

  1. 在不借助其他工具的情况下破解Windows开机密码
  2. WPF:自定义DataGrid,双向绑定,禁用行,行索引
  3. VS2013生成安装包
  4. 中国掀起数字化浪潮|沃丰科技AI外呼机器人助家电企业潜客筛选自动化
  5. 【问链-Eos公开课】第一课 EOS简介
  6. 电信企业如何应对OTT软件的冲击?
  7. [Unity]代码控制在3D物体上播放帧动画
  8. TCP连接:SYN ACK RST UTG PSH FIN
  9. 3Ds Max基础(杂)
  10. 安全管理“新三纲”——呼叫中心班组安全管理落地思考