vertx web开发(一)

2023-05-16

vertx web开发

最近在开发中,由于spring 的大而全,反而不实用于一下小项目,因为spring boot在空载的情况,至少其内存占用超过150M.而对于一些简单的项目反到不适用。而反观vertx,这是一个全异步编程的框架,具体可查,其异步编程从某种角度来说可以使并发量极大的提高。而且内存占用远低于springboot.特别使vertx 配合kotlin,可以让你拥有同步的思想来进行异步开发。

  • 创建HTTP server

引进相关的包,gradle项目添加相关依赖

    // vert core
    implementation 'io.vertx:vertx-web:4.0.3'
    // vert route
    implementation 'io.vertx:vertx-web:4.0.3'
    // kotlin coroutine and kotlin >= 4.0.3
    implementation 'io.vertx:vertx-lang-kotlin-coroutines:4.0.3'
    // kotlin 相关工具包
    implementation 'com.github.isyscore:common-jvm:1.6.1'

查阅vertx 文档文档,创建一个verticle 可以通过以下方式,

class HttpVerticle :AbstractVerticle() {
    override fun start() {
        super.start()
    }

    override fun stop() {
        super.stop()
    }
}

重写AbstractVerticle中的start以及stop方法皆可,但如在verticle在启动的时候的添加一下耗时的操作,比如一下IO操作,这个时候就应该用重写future start来启动。如下所示:

 override fun start(startPromise: Promise<Void>) {
        server.requestHandler {
            it.response().end("Hello world")
        }.listen(8080, "127.0.0.1") { res ->
            if (res.succeeded()) {
                startPromise.complete()
            } else {
                startPromise.fail(res.cause())
            }
        }
    }

此处创建一个http服务器,在listen处监听端口是耗时操作,在起回调的时候用complete(),来告诉vertx已经部署完成。但是采用的是kotlin开发,结合vertx可以更方便的集成回调。如下在kotlin下需要引入,io.vertx:vertx-lang-kotlin-coroutines:4.0.3 包,在创建verticle 可以采用如下方式:

class HttpVerticle : CoroutineVerticle() {
    override suspend fun start() {
        server.requestHandler {
            it.response().end("Hello world");
        }.listen(8080).await()
    }

    override suspend fun stop() {
        server.close().await()
    }
}

在这里看到kotlin的suspend关键字,这表示你可以用同步的思想来组织suspend里面的异步代码,而future可以通过await方法将future转成suspend形式,通过suspend避免了future回调地狱的场景.熟悉js的同学,应该知道这个思想和js的promise和像,只不过这里把,promise换成了future对象,async换成suspend,但对比两种方式其核心思想是一致的。

  • 请求异常处理

由于vertx 中的future可以通过compose函数进行顺序合并,也就说中间在合并的中,如果有一个future抛出异常,那么顺序合并的future也是异常的future,通过这个思路,在结合kotlin语言的特性,可以为future扩展一个请求异常处理 函数。

inline fun<reified T> Future<T>.end(context: RoutingContext){
	val response = context.response()
	 this.onSuccess{  response.end("ok") }
	 this.onFailure { reponse.end("error,$it.message") }
}

通过以上的扩展函数,可以将future中抛出异常的future进行合并处理。

  • Future类型转化

在future一般是future里面装一个泛型T,在kotlin中有高阶函数 run ,also将一个类型转化成另外一个类型,对比这样的思路,可以将future里面的T -> R ,有了这个思路,其实现如下:

// 对比also函数
inline fun<T,R> Future<T>.ownAlso(crossinline callback: (obj: T) -> R):Future<R>
 = compose { Future.future<R> { promise ->
            try {
                promise.complete(callback(it))
            }catch (e:Exception){
                promise.fail(e)
            }
        }
    }

inline fun<T,R> Future<T>.ownRun(crossinline callback: T.() -> R):Future<R> = compose { 
    Future.future<R> { promise ->
    try {
        promise.complete(callback(it))
    }catch (e:Exception){
        promise.fail(e)
    }
}
}
  • Iterable 转 future

kotlin 中对list,map 等操作有个高阶函数map,可以将Iterable里面的类型转化成其他类型,这里我们可以借用这个思想,对Iterable里面的元素进行并发合并成一个future,其代码如下:

inline fun<T,R> Iterable<T>.merge(crossinline callback: (obj: T) -> Future<R>) :CompositeFuture =
       map { callback(it) }
      .run { CompositeFuture.all(this)  }

以上是kotlin集成vertx,所探索出来的几个比较有用的扩展函数

  • 结语

本篇初次探索vertx,并且结合koltin语言的特性,探索出对开发有用的帮助的几个扩展函数。下篇文章,介绍基于vertx的路由拦截,所实现的路由工厂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vertx web开发(一) 的相关文章

  • v-bind 错误:v-bind' 是未声明的前缀

    我正在 asp net 中使用 Orckestra CMS 在 Composite 之前 和 Razor 模板 并尝试使用 Vue 框架 使用 option text 时一切都很好
  • 由 Android 应用程序和网站共享的关系数据库 - 最简单的方法

    我有一个项目 我将开发一个 Android 应用程序和一个网站 他们都应该共享相同的数据库 我正在尝试探索所有选项 但我真的很困惑 这是我的要求 1 我需要一个非常简单且EASY方式 我并不是想学习 我只是想学习 我只是想把事情做好 2 数
  • IE 中文本大小列表的实际像素是多少?

    与 IE 中的以下文本大小列表相比 实际字体大小 以像素为单位 是多少 Largest Larger Medium Smaller Smallest 在 Web 应用程序中 我需要提供类似的行为 通过选择上面列表中的任何一个来设置应用程序控
  • 在 ASP Web API 中指定无效参数时返回错误

    我正在使用 C 和 ASP NET Web API 创建一个 API 并且希望它在使用无法识别的参数时返回错误 例如 api Events 应该有一个事件列表 api Events startTime startTime 应该返回在特定时间
  • 使用元 http-equiv 标记进行重定向时,避免将页面添加到浏览器历史记录中

    我有一个网页 它使用以下命令重定向到所需的目标网址 我想避免第一页出现在浏览器历史记录中 特别是 在手机 Android iOS 等 中 我希望后退按钮可以跳过重定向页面 您有两个选择 要么使用真正的 HTTP 重定向 要么使用 JavaS
  • 客户端语言

    我不是网络程序员 所以请原谅我的无知 当谈到服务器端编程时 我们有很多可用的技术 例如 PHP ASP net JSP 等 然而 说到客户端脚本 我只听说过 JavaScript 和 AJAX 也许您还可以包含 Java Applet 因为
  • Facebook 好友对话框无法在移动设备上运行

    序幕 我遇到了与之前提出的问题中描述的相同的问题 FB 在移动设备上添加好友对话框不起作用 https stackoverflow com questions 17230231 fb add friend dialog on mobile
  • 将 >100K 页面链接在一起而不会受到 SEO 惩罚

    我正在创建一个网站 该网站将审查互联网上数十万个其他网站的隐私政策 它的最初内容是基于我的运行普通爬行 http commoncrawl org 50 亿页网络转储和分析所有隐私政策 https stackoverflow com ques
  • css位置固定根本不起作用

    我正在寻找一个页脚类型的东西布莱克霍利网站 http www blakehawley com它有一些不同的链接等 它应该是横幅样式 我的意思是它应该停留在底部并被修复 div 是 菜单 这是我的 HTML
  • Vaadin 与 Bootstrap

    我计划制作一个应用程序 该应用程序在客户端具有复杂表单和逻辑验证的视图 我计划使用 AJAX 进行提交并具有一些视觉吸引力 我想要那些具有 Bootstrap 和 或 CoffeeScript 和 Vaadin 开发经验的人的推荐 我有两个
  • 在 Google Cloud 中设置网站? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我完全迷失在这之中 我习惯于使用带有 cpanel 的简单 Web 主机来制作网站 只需使用 filezilla 登录并上传我的 ht
  • 如何解决PHP扩展“0”必须加载的问题?

    我正在尝试在我的服务器上安装 Magento 我做了一切 正如文档中所写的 我有以下错误 必须加载 PHP 扩展 0 当我尝试在浏览器中的第二页上配置 Magento 时 会发生这种情况 你知道如何解决这个问题吗 如果您安装的是 Magen
  • REST API 与 Web API

    我是构建 HTTP API 的初学者 我似乎对 REST API 和 Web API 之间的区别感到困惑 我在网上读到更多相关内容 困惑似乎越来越多 我猜菲尔丁有与此链接相同的问题http roy gbiv com untangled 20
  • 允许获取请求但仅在我的域中?

    在我的网站上 我可以使用 GET 请求触发某些操作 例如隐藏或删除评论的功能 我不是很担心 但如果有人使用 img src url 设计攻击来删除评论或电子邮件 那会很烦人 有办法防止这种情况吗 我使用 httponlycookies 作为
  • WebLogic Server :: 服务器不支持 J2EE Web 模块规范 3.0 版

    当我尝试使用 WebLogic 11g 10 3 5 服务器运行应用程序时 它显示 服务器不支持 J2EE Web 模块规范 3 0 版 如何克服这个问题 Thanks 使用支持的规范版本 Servlet 2 5 开发您的应用程序 或者使用
  • 网页编码,设置矛盾[重复]

    这个问题在这里已经有答案了 如果一个网页有 但http标头有 Content Type text html charset UTF 8 那么假设什么编码呢 在 HTML5 中 优先级定义为 用户浏览器设置 字节顺序标记 HTTP 标头 or
  • 从网站获取数据的vba代码

    我是这个网站和 VBA 编程的新手 我遇到了一个问题 我必须从中获取数据这一页 http www kieskeurig nl zoeken index html q 4960999543345 我需要有超链接网址Check Rates 10
  • 使用 hg 存储库作为网站

    这与我的安全问题有些相关here https stackoverflow com questions 2361626 security deny access to hg via mod rewrite 对实时网站使用 hg Mercuri
  • 尝试访问我的网站时出现内部服务器错误

    我收到这个错误 内部服务器错误 服务器遇到内部错误或配置错误 无法完成您的请求 请联系服务器管理员 电子邮件受保护 cdn cgi l email protection和 告知他们错误发生的时间以及您可能会发生的任何事情 所做的事情可能导致
  • 创建默认应用程序时 FirebaseOptions 不能为 null

    我正在尝试在 Flutter 集成电子邮件和基于 google 的登录中尝试一个示例项目 并计划使用 firebase 初始化来执行此操作 同时我已按照教程中提到的所有步骤进行操作 一旦尝试使用 firebase 我就会收到此错误已初始化

随机推荐