为何要用 Next 来开发?

Cloudopt Next 是一个很是轻量级且现代的、基于 Kotlin 编写的全栈开发框架,同时支持 Java 和 Kotlin,能够处理 Url 的解析,数据的封装,Json 的输出等等,从根本上减小开发时间、提高开发体验。java

同时 Next 也是 Vert.x 及 awesome-kotlin 推荐项目。让咱们来看看 Next 一些有趣的特色。web

好比直接用 Vert.x 写路由的话是下面这样的写法:redis

router.route().handler(ctx -> {
// This handler will be called for every request
HttpServerResponse response = ctx.response();
response.putHeader("content-type", "text/plain");
// Write to the response and end it
response.end("Hello World from Vert.x-Web!");
});

那么当你还要操做数据库的话,那么看起来就是一个回调嵌着一个回调,很容易造成回调地狱。spring

让咱们看看在 Next 中如何实现一个简单的输出 Json 的路由:数据库

@GET("json")
fun json() {
var map = hashMapOf<String, Any>()
map.put("a", 1)
map.put("b", 2)
renderJson(map)
}

在写法上彻底不须要改变本身的习惯用传统的写法便可。甚至你还能够直接使用相似 spring boot 的参数注入的写法(结合 hibernate 的参数校验):编程

fun argsController(
@Chinese(false)
@Parameter("name", defaultValue = "Peter")
name: String,
@Min(18)
@Parameter()
age: Int ) {
var map = hashMapOf<String, Any>()
map["name"] = name
map["age"] = age
renderJson(map)
}

并且在 Cloudopt Next 中支持多种异步写法,你能够选择本身喜欢写法自由发挥:json

好比咱们如今须要运行某个阻塞的代码并须要将结果传递回来,你能够用如下的方式运行。固然你也能够经过 Worker.worker 运行阻塞的代码。记得在结尾经过 handler.complete 传递结果。promise

fun test() {
var id = worker<Int>({ handler ->
handler.complete(1)
}, { asyncResult ->
//onComplete
})
}

第二种作法是利用 kotlin 的协程的 await 特性,写起来会更为优雅。但利用 kotlin 协程须要在方法上声明 suspend。这也是咱们推荐的异步写法。缓存

suspend fun test() {
var id = await<Int> { handler ->
handler.complete(1)
}
}

第三种状况是你在没法支持 suspend 语法的地方使用 await 语法。你可使用下面的方式运行:微信

fun test() {
global {
var id = await<Int> { handler ->
handler.complete(1)
}
}
}

第四种作法是你能够在路由的方法上增长 @Blocking 注解,使其自动变为普通的路由。

@Blocking
@GET("blocking")
fun blocking() {
renderText("This is Blocking!")
}

好比咱们利用 await 语法就能够直接使用任意的同步操做数据库 orm ,彻底不用担忧阻塞的问题(这里用的是 jooq):

@GET
suspend fun get() {
await { promise ->
val result = JooqManager.dsl?.selectFrom(Tables.TODO)?.fetch()?.into(Todo::class.java)
renderJson(result )
promise.complete()
}
}

固然你把它封装好的话,看起来就是这样的:

@GET
suspend fun get() {
renderJson(todoService.getTodoList())
}

固然还支持经过注解来设置验证器、Handler 等等,甚至还简化了 Vert.x 的 EventBus,你只须要在路由上面声明 @AfterEvent便可自动完成在 xxx 事件后执行 xxx 事件这种方式。

@GET("afterEvent")
@AfterEvent(["net.cloudopt.web.test"])
fun afterEvent() {
this.context.data().put("key","value")
renderText("AfterEvent is success!")
}

你只须要在其它类上声明 @AutoEvent 并继承 EventListener 便可自动订阅这个事件。

@AutoEvent("net.cloudopt.web.test")
class TestEventListener:EventListener {
override fun listener(message: Message<Any>) {
print(message.body())
}
}

Cloudopt Next 在很大程度上让你保留了原先的编程习惯,同时得到了 Vert.x 的强大的性能。不只如此,Cloudopt Next 提供了大量的插件,如分布式二级缓存、jooq、redis、日志、spring支持、quartz、国际化等等 Vert.x 没有提供的功能。还兼容 Vert.x 的模块体系。也就是说你不只能够用 Next 官方出的插件,还能够用 Vert.x 的插件以及 Vert.x 社区贡献的一系列生态。

赶忙试试吧,使用 Koltin + Next 你将得到一个学习曲线平滑、使用简单、符合直觉且性能极高的异步服务。

本文分享自微信公众号 - Cloudopt(cloudopt)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索