Kotlin Vertx

摘要:
Kotlin&VertxKotlin是一门很好的语言,值得了解。Kotlin写了js和一些go。主力军一直是java。有了科特林,我似乎找到了共同语言的平衡。Kotlin有一些部分函数语法,提供了很多方便的api和一些高阶函数。VertxVertx风格与node的express框架一致,后者以java方式实现。)与传统的基于Servlet的javaweb框架相比,基于封装底层通信的框架Vertx在速度和内存消耗方面具有优势。让我们看看Kotlin+Vertx编写的web项目,以展示Kotlin的魅力。Kotlin&Vertx1.maven根据Kotlin和Vertx的官方配置进行配置。
Kotlin & Vertx

Kotlin 是一门好语言,值得大家了解一下。

Vertx 是一个好框架,也值得大家了解一下。

Kotlin

写过js,也写过一点点go,主力一直是java。用了kotlin,貌似找到了常用语言的平衡点了。

Kotlin 拥有一些偏函数式的语法(java8 也引入了一些),提供了相当多便捷的api与一些高阶函数。从两天的试用,以及今天搞得这个 Vertx web 项目,从中体会到最爽的有两点:

  • 支持“带接收者得函数字面值”(允许你直接指定函数的receiver的类型)这一特性。这个特性,在go里面经常看到。然而,java没有,java8也没有...
  • 支持扩展函数(或许是我见识短,这功能爆炸了)

一直很期待可以指定receiver这个功能。有了这个特性,那么写的函数,可以直接被调用者使用。

Vertx

vertx 风格和node的express框架思想一致的,换了一种java的实现。不得不说,node的express 启发了很多其他语言的web框架设计。java的vertx,以及go里面的很多web框架(martin...),很多都有express的影子(难道是我先入为主?)

相比传统的基于Servlet的java web框架,vertx这种基于封装底层通信的框架,在速度上和内存占用上比较有优势。曾经为了在768M内存的docker容器上跑web应用,先是用相对较轻量级的spring-boot,勉强可以跑。然后又用了Node 的 express,这个毫无压力。

终于有一个java版本的这种web框架,整个项目打完包,包括依赖的 lib,整个才4-5M的大小(主要是lib大小),太轻量了。

下面就看看 Kotlin + Vertx 写的web项目,展示下kotlin的魅力。你要是比较懒的话,想直接check out代码,github库在这里

Kotlin & Vertx

1.maven 配置

按照kotlin和vertx官方的配置。
```xml


4.0.0

<groupId>vertx</groupId>
<artifactId>com.vertx</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
    <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                    implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <manifestEntries>
                                    <Main-Class>com.tt.vertx.HelloWorlds</Main-Class>
                                    <Main-Verticle>com.tt.vertx.HelloWorlds</Main-Verticle>
                                </manifestEntries>
                            </transformer>
                        </transformers>
                        <artifactSet/>
                        <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-maven-plugin</artifactId>
            <version>${kotlin.version}</version>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs>
                            <source>src/main/java</source>
                        </sourceDirs>
                    </configuration>
                </execution>
                <execution>
                    <id>test-compile</id>
                    <phase>process-test-sources</phase>
                    <goals>
                        <goal>test-compile</goal>
                    </goals>
                    <configuration>
                        <sourceDirs></sourceDirs>
                    </configuration>
                </execution>
            </executions>
        </plugin>

    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>io.vertx</groupId>
        <artifactId>vertx-web</artifactId>
        <version>3.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib</artifactId>
        <version>${kotlin.version}</version>
    </dependency>
</dependencies>
<properties>
    <kotlin.version>1.0.3</kotlin.version>
</properties>

```

2.程序入口

和spring-boot 一样,vertx 的程序入口也是一个静态的main函数。

class  HelloWorlds : AbstractVerticle() {

    companion object{
        @JvmStatic fun main(args: Array<String>){
            var vertx = Vertx.vertx()
            vertx.deployVerticle(HelloWorlds())
        }
    }

    override fun start() {
        var router = customRouter(vertx)
        println("server running on 8888")
        vertx.createHttpServer().requestHandler({ handler -> router.accept(handler)}).listen(8888)
    }
}

如果写过nodejs应用,这段代码看起来就很简单了。继承vertx的启动类,在启动的时候,设置路由,绑定http server的端口。

注意

和普通的kotlin运行类不一样,入口主类需要打jar包的时候,主方法(main)一定是要是java的标准静态方法. 需要加 @JvmStatic 标注一下。否则运行打出来的jar包,会找不到静态主入口。

在这里,封装了一下路由,提取到了单独的文件中。

3.路由设置

fun customRouter(vertx : Vertx) : Router {
    var router = Router.router(vertx)
    router.route("/").handler({c -> c.response().html().end("hello world")})
    router.route("/json").handler({c -> c.response().json().end(Json.encode(Entity("name","sss")))})
    return router
}

fun HttpServerResponse.html() : HttpServerResponse {
    return this.putHeader("content-type","text/html")
}

fun HttpServerResponse.json() : HttpServerResponse {
    return this.putHeader("content-type","application/json; charset=utf-8")
}

让我觉得kotlin拯救了我的地方就在这一段路由代码里。

先看一下,之前用纯java写的路由版本是什么样的吧,对比一下。

java版本:

router.route("/").handler(context -> context.response().putHeader("content-type","text/html").end("hello world"));
  router.route("/json").handler(context -> {
      context.response().putHeader("content-type","application/json; charset=utf-8")
              .end(Json.encodePrettily(new Entity("hello","world")));
  });

在java版本里面,给每个请求加header的时候,是要加 .putHeader("content-type","xxxx") 的。

试想一下,如果我们有上百个路由的话,每个头里面都要指定这些header,多痛苦。根据经验,我们可能想把它提出来,当做一个方法。于是我们需要写一个工具类之类的,给context.response()的结果 HttpServerResponse 加上header,然后再返回这个 HttpServerResponse,最直观的大概写法应该是:

SomeUtil.setHeader(context.response()).end('xxx')

不管怎么说,因为java的语法限制,我们貌似只能这么写(如果有更好的方法,请大家共享一下)。

看一下kotlin版本的,把加header的操作提了出来,弄成了两个函数。这两个函数是函数接收字面量和扩展函数的结合体,使用扩展函数,这是个,也必须声明一个函数的接受者类型。
我们定义html() 和 json() 函数, 这两个方法只能用HttpServerResponse 去执行它,并且返回执行后的该 HttpServerResponse。 在扩展函数里面,this指向的是该函数的调用者。语法官方有详细文档,就少说了(好多语法我也没有看完 ORZ )。

这个特性超级好用,尤其是在这种链式的调用里面,我们不用在去另写写转换方法,不用在把要转换的对象当参数来回传递了。

4. 还有一个bean 对象

data class Entity(var name:String,var description:String){}

第一次写这个bean的时候,我写错了,无论如何,在路由里面,就是无法取到该bean构造后的值。看了官方文档才知道,这个类是需要加一个data前缀的,这样才会生成 equals ,hashCode ,Setter, Getter 等这些方法。

另外一些感想

主要代码都在这里了,完整的代码在这里

用kotlin , 感觉很幸福,相见恨晚。

代码写的少,对java 是一种强力的补充。它和java之间,完全可以相互调用,是一门很不错的语言,以后可以慢慢用起来了,还有很多东西值得去探索。

还有一点还是提一提吧,kotlin亲爹jetbrains, Idea 亲爹也是 jetbrains。Idea对自家的这门语言支持的相当的不错,大家都可以试试。另: 放弃Eclipse吧,别再折磨自己啦。

免责声明:文章转载自《Kotlin Vertx》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt 模型类 (转)FastReport.Net使用:[19]复选框的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安装新版本的rabbitmq

上一篇提到了,如果通过系统默认的源安装的rabbitmq通常不是最新的,比如我在做测试的时候,rabbitmq的版本已经是3.7.7(http://www.rabbitmq.com),而我通过系统默认源安装得到的rabbitmq的版本是3.5.7 两种方法安装到新版本的rabbitmq 1. 通过增加rabbitmq的源到系统的仓库里面 2. 下载发行包自...

使用vertx共享数据

Using Shared Data with Vert.x io.vertx.core.shareddata 接口计数器 公共接口柜台 一个异步计数器,可用于跨集群维护一致的计数。 作者: 蒂姆·福克斯 方法总结 所有方法实例方法抽象方法 修饰符和类型 方法和说明 void addAndGet(long value, Hand...

Objective-C-基础知识

OC语言前期准备 一、OC简介 Oc语言在c语言的基础上,增加了一层最小的面向对象语法,完全兼容C语言,在OC代码中,可以混用c,甚至是c++代码。 可以使用OC开发mac osx平台和ios平台的应用程序。 拓展名:c语言-.c  OC语言.-m  兼容C++.-mm 注:其实c语言和oc甚至任何一门语言都只是我们为了实现一些功能,达到一些效果而采用的工具...

Windows 安装RabbitMQ后,启动服务就自动停止

  在做SpringCloud消息总线的时候,需要用到RabbitMQ,于是在windows上下载安装了一个,erlang的安装包不是官网下载的,而是朋友分享给我的,没注意它的版本(9.3)。 安装完成后(安装的方法没有错,环境变量及服务安装都对了),发现 http://localhost:15672 无法访问,开始以为是服务没有启动,进入服务列表查看Ra...

centos安装ruby

下面开始安装Ruby 一、下载Ruby源码包 wget ftp://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.7.tar.gz 二、解压安装Ruby tar zxvf ruby-2.1.7.tar.gz ./configure --disable-install-rdoc make make prefix=/usr/l...

给source insight添加.cc的C++文件后缀识别

Options -> Document Options, Document Type 下拉选 C++ Source File, File Filter 中加入,*.cc 为Source Insight添加语言支持 1. 下载语言支持文件。下载地址http://www.sourceinsight.com/public/languages/2. 选择 O...