Vert.x底层通信框架依赖于Netty,并封装了对Http协议的支持,因此可以非常方便的进行Web开发,且不依赖于任何中间件。笔者所在的公司老系统使用的是SSM架构的项目,部署在Weblogic上,每年花在中间件上的钱就非常多,现在全面改造为Vert.x,中间件的费用直接就省了。另外不依赖中间件,编程会变得非常灵活,定制性非常强,安全性也会得到一定层度的提高。
对于实现一个简单的web服务,有很多种选择,简单划为三种
下面简单的来实现一个HttpServer,通过浏览器访问这个HttpServer能够在浏览器上显示HelloWorld。下面简单列出实现的步骤:
下面是具体的代码
1.pom文件
io.vertx
vertx-core
3.5.2
2. 创建核心类MyHttpServer
package com.stu.vertx.hello;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerResponse;
/**
* Vertx 创建一个最简单的HttpServer,当用户请求时返回Hello World
*
* @author lenovo
*
*/
public class MyHttpServer {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
// 创建一个HttpServer
HttpServer server = vertx.createHttpServer();
server.requestHandler(request -> {
// 获取到response对象
HttpServerResponse response = request.response();
// 设置响应头
response.putHeader("Content-type", "text/html;charset=utf-8");
// 响应数据
response.end("Hello World");
});
server.listen(8888); // 监听8888端口
}
}
代码非常简单,首先获取到Vertx对象,然后通过vertx对象创建Http服务,监听Http请求并进行处理。
这里用到了JDK8的新特性,第一个是Vertx.vertx()方法,我们知道Vertx是一个接口,按照我们以前的逻辑,方法实现是不能写在接口中的,在JDK8中增加了静态方法和默认方法。第二个是->这个符合,这也是一个新特性,可能看起来比较难懂,可以类比JavaScript来理解,JavaScript中有很多这样的写法。我们可以看到,这个方法实际上是接收一个Handle接口,Handle接口中有一个抽象方法 public void handle(HttpServerRequest request) ,这个方法有一个参数 HttpServerRequest .按照我们之前的写法应该写成如下代码:
server.requestHandler(new Handler() {
@Override
public void handle(HttpServerRequest request) {
// 获取到response对象
HttpServerResponse response = request.response();
// 设置响应头
response.putHeader("Content-type", "text/html;charset=utf-8");
// 响应数据
response.end("Hello World");
}
});
对比两者可以发现,实际上就是简化了new 子类,简化了重写方法,直接把方法的参数后跟->{方法体}来解决。这样写起来是非常方便的。但是这种写法一个接口中只能定义一个抽象方法。这种接口一般会打上@FunctionalInterface注解。
上面那段代码是直接写到main方法中的,可以直接运行即可。监听的是8888端口,在启动的过程中,要保证8888端口不被占用。启动成功之后可以直接通过浏览器访问。
3.浏览器访问 localhost:8888
到这里,一个简单的Vertx程序就写完了。
代码改进
在上面演示的创建HttpServer的方式我们会发现有一个很大的问题,就是所有的代码都写在main方法中,这样显然是不好的。Vert.x推荐的写法是为每一个应用创建一个Verticle,也就是Vert.x的模块,然后通过Vertx核心接口,部署Verticle模块。多个Verticle模块之间可以通过EventBus进行相互调用。
这里提到了Verticle、EventBus等,这些都是Vert.x中一些非常重要的概念。Verticle可以简单的理解为继承了AbstractVerticle的类都是一个Verticle,每个Verticle可以单独部署或者单独运行。EventBus看不见,摸不着,可以简单的理解为,各Verticle模块之间通信的桥梁。
下面我们就创建一个HttpServer的Verticle模块,并部署到Vertx中运行,实现步骤如下:
这里我们只需要粘贴Verticle核心代码:
public class MyHttpServer2 extends AbstractVerticle {
public static void main(String[] args) {
MyHttpServer2 verticle = new MyHttpServer2();
Vertx vertx = Vertx.vertx();
// 部署verticle,这里会调用start方法
vertx.deployVerticle(verticle);
}
@Override
public void start() {
// 在这里可以通过this.vertx获取到当前的Vertx
Vertx vertx = this.vertx;
// 下面可以实现helloworld中相同的功能
// 创建一个HttpServer
HttpServer server = vertx.createHttpServer();
server.requestHandler(request -> {
// 获取到response对象
HttpServerResponse response = request.response();
// 设置响应头
response.putHeader("Content-type", "text/html;charset=utf-8");
// 响应数据
response.end("Hello World");
});
server.listen(8889);
}
@Override
public void stop() throws Exception {
super.stop();
}
}
上面代码比较简单,start方法的实现和第一个演示中的main方法代码非常相似,start方法中之所以可以直接使用vertx这个变量,是因为继承了AbstractVerticle这个类,在这个类里有一个protected类型的Vertx变量。
另外在main方法中,获取Vertx实例是通过Vertx.vertx()方法,查看代码会发现,Vertx是一个接口,按照之前的逻辑,接口中只能定义抽象方法,这是什么情况呢?这也是JDK8的新特性,接口中可以定义静态方法。也就是说我们调用的是接口中的静态方法,也就是已经实现了的方法。在Vertx中,这种方式非常常见。
这种编码方式是Vertx官方所支持的方式,后面的案例都会通过这种方式来进行编写。
到这里,我们了解了创建HttpServer的API,我们发现,Vertx的API还是非常简洁,好用的。但本节的重点还是Verticle模块的理解和编写。
当然了,如果要真正的实现一个HttpServer,还需要更多的东西,比如路由,Session,Rest接口开发,模板,WebSocket等等,后续我们会陆续整理后发布!
相关文章
(一)Vert.x 简明介绍 https://blog.csdn.net/king_kgh/article/details/80772657
(二)Vert.x创建简单的HTTP服务 https://blog.csdn.net/king_kgh/article/details/80804078
(三)Vert.x Web开发之路由 https://blog.csdn.net/king_kgh/article/details/80848571
(四)Vert.x TCP服务实现 https://blog.csdn.net/king_kgh/article/details/84870775
(五)Vert.x数据库访问 https://blog.csdn.net/king_kgh/article/details/84894599
(六)Vert.x认证和授权 https://blog.csdn.net/king_kgh/article/details/85218454
(七)Vert.x事件总线(Event Bus)与远程服务调用 https://blog.csdn.net/king_kgh/article/details/86993812
Vert.x 案例代码:https://github.com/happy-fly
笔者就职于一家互联网支付公司,公司的核心项目使用的是Vert.x技术体系。记得笔者刚进入公司,接触Vert.x的时候,找遍了大大小小的网站,发现市面上关于Vert.x的文档除了官方文档外,几乎找不到其他资料。当时就励志要出一个专栏来写写Vert.x,以此帮助在Vert.x上采坑的朋友。因为笔者能力有限,文章中难免会有错误和疏漏,如果您对文章有意见或者好的建议,可以直接留言或者发送邮件到[email protected]。如果您也对Vert.感兴趣,可以加入到我们,共同学习Vert.x,并推进国内开发者对Vert.x的认知。