当前位置:首页 > 天道酬勤 > 正文内容

对java行业的认识(对javaee的认识)

张世龙2021年12月22日 07:25天道酬勤320

最近使用谷歌搜索“最佳网络框架”时,可能偶然发现了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。 虽然节点在一个核心上运行,但是由Vert.x维护的线程池的大小与可用的核心数量一致。 更强大的并行支持,使Vert.x不仅适用于IO,还适用于需要并行计算的CPU密集型进程。

但是,事件的循环只是故事的一半。 另一半和Vert.x几乎没有关系。

要连接到数据库,客户端需要连接器驱动程序。 在Java领域,Sql最常见的驱动程序是JDBC。 问题是这个驱动被阻止了。 在套接字级别被阻止。 线程总是卡在那里直到返回响应。

当然,驱动程序是实现未被完全阻止的APP的瓶颈。 幸运的是,在具有多个活动分支的异步驱动程序方面取得了进展,包括: 虽然是非正式的,但有以下几种

3359 Github.com/JA同步MySql/JA同步- SQL (适用于postgres和MySql ) 3359 Github.com /反应式RSE /反应式PG -客户端

使用Vert.x非常简单,只需要几行代码就可以启动http服务器。

val vertx=Vertx.vertx (

vertx.create http服务器() .请求处理程序) ) req={

. }.listen(8080 )方法requestHandler是事件循环传递请求事件的地方。 因为对Vert.x没有意见,所以处理它是自由的风格。 但是,请记住未被阻止线程的唯一重要规则。 请不要屏蔽。

使用并发时,可以从当前的许多选项中获得,包括Promise、Future、Rx和Vert.x特有的常用方法。 但是,随着APP的复杂性增加,单独使用异步功能是不够的。 需要轻松调整和链接呼叫,同时避免回调地狱。 此外,还必须优雅地传达错误。

Scala Future满足上述所有条件,具有基于函数的编程原理的附加优点。 本文不详细介绍Scala Future,但让我们用简单的APP尝试一下。 假设APP应用程序是用于搜索具有指定ID的用户的API服务。

val vertx=Vertx.vertx (

vertx.create http服务器() .请求处理程序) ) req={

req .路径()匹配。

casepifpcontains ((/用户) )=

val f=for {

f1- future {2} (' id ' ).get.toInt } ),其中包括

F2-if(F1100 ) future.unitelsefuture.failed )自定义执行()

F3-future{getuserfromdb(F1 ) }

} yield f3型

fmap (r=打印(req,r ) )恢复)情况描述=打印(case exception ) req,处理程序描述) )

case _=打印(错误,'默认页' ) ) ) )。

}

() )

. Listen(8080 ) )。

def打印输出(req : http服务器请求,msg :字符串=req.response ) ) .结束(msg ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )

defhandleexception (e :可旋转) :字符串={

e匹配

caset :纳米技术='缺少参数'

caset : numberformatexception='参数序列号'

case t :自定义执行=' Cu

stom 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的一些测试中,性能有所下降,但由于它似乎源于优化,因此可能会在后续版本中得到解决。

来源:https://www.jdon.com/51872

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/26896.html

标签: vertx
分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。