Vert.x底层通信框架依赖于Netty,并封装了对Http协议的支持,因此可以非常方便的进行Web开发,且不依赖于任何中间件。笔者所在的公司老系统使用的是SSM架构的项目,部署在Weblogic上,每年花在中间件上的钱就非常多,现在全面改造为Vert.x,中间件的费用直接就省了。另外不依赖中间件,编程会变得非常灵活,定制性非常强,安全性也会得到一定层度的提高。

对于实现一个简单的web服务,有很多种选择,简单划为三种

  1. 这是使用最多的一种,也是很多的Java开发者可能最先想到的,就是使用Java中间件来实现,只要下载一个Tomcat,再编写个web项目就可以对外提供Web服务。这种方式我们完全不需要考虑线程的交互,不需要考虑网络协议,只需要关注业务逻辑,可以说是一种全包的形式。
  2. 使用Java原生的Socket或者NIO来实现,但这种方式比较复杂,对编程功底要求最高,而且自己实现很难保证性能和稳定性。这种方式完全需要手动处理,很少会使用这种方式来实现HTTPServer,可以说这是最为原始形式。
  3. 介于全包和原始形式之间,就是用第三方的框架来实现,比如Vertx或者偏底层的Netty。你可以利用框架封装的API简单的创建一个HttpServer,并不需要关注底层的通信协议。这种方式更为灵活,一般来讲性能也更高,并且不依赖中间件。

下面简单的来实现一个HttpServer,通过浏览器访问这个HttpServer能够在浏览器上显示HelloWorld。下面简单列出实现的步骤:

  1. 创建一个Maven项目,并配置依赖的包。(这里仅仅需要引入vertx-core的包即可)
  2. 创建一个核心类,创建main方法,直接在main方法中编写代码即可(后期会进行改造)
  3. 直接运行核心类,并通过浏览器访问

下面是具体的代码

1.pom文件

<dependency><groupId>io.vertx</groupId><artifactId>vertx-core</artifactId><version>3.5.2</version>
</dependency>

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();// 创建一个HttpServerHttpServer 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<HttpServerRequest>() {@Overridepublic 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中运行,实现步骤如下:

  1. 创建一个类,继承AbstractVerticle类
  2. 重写start方法和stop方法,在start方法中处理业务逻辑,stop方法中释放资源
  3. 在main方法中部署Verticle模块
  4. 启动服务,并通过浏览器进行访问

这里我们只需要粘贴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);}@Overridepublic void start() {// 在这里可以通过this.vertx获取到当前的VertxVertx vertx = this.vertx;// 下面可以实现helloworld中相同的功能// 创建一个HttpServerHttpServer 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);}@Overridepublic 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上采坑的朋友。因为笔者能力有限,文章中难免会有错误和疏漏,如果您对文章有意见或者好的建议,可以直接留言或者发送邮件到18366131816@163.com。如果您也对Vert.感兴趣,可以加入到我们,共同学习Vert.x,并推进国内开发者对Vert.x的认知。

Vert.x(vertx) 创建HTTP服务相关推荐

  1. Vert.x(vertx) 实现TCP服务

    对于Java开发人员,想要实现一个http服务,非常简单,写个servlet,打成war包,放到tomcat下就能运行.但如果要实现一个tcp服务就没那么简单了,因为tcp是传输层协议,并不像http ...

  2. vertx创建http服务

    pom文件引入 <dependency><groupId>io.vertx</groupId><artifactId>vertx-core</ar ...

  3. Vert.x(vertx) Web开发-路由

    在Vert.x 创建HTTP服务 中我们已经创建了一个简单的HttpServer,但这个HttpServer比较低级,对于请求参数解析.Session等常用功能都需要我们通过编码实现,也就是要重复造轮 ...

  4. Vert.x(vertx) 事件总线(EventBus)与 远程服务调用

    Event Bus(事件总线) 是Vert.x的神经系统,负责应用系统消息的传递.Vert.x各模块(Verticle)之间的相互调用就是通过Event Bus实现的,因此各Verticle之间是高度 ...

  5. vert.x笔记:4.vert.x中调用spring服务

    evenbus事件总线介绍: 在介绍怎么在vert.x中集成spring服务前,我们要先简单介绍一下什么是vert.x的事件总线. eventbus是vert.x的神经总线,每个vert.x实例维护了 ...

  6. Vert.x(vertx) 简明介绍

    摘要 Vert.x最大的特点就在于异步(底层基于Netty),通过事件循环(EventLoop)来调起存储在异步任务队列(CallBackQueue)中的任务,大大降低了传统阻塞模型中线程对于操作系统 ...

  7. Vert.x(vertx)入门资料

    1.vert.x简介 vert.x 采用类似 Node.js 的 eventloop callback 机制,优势是 Eventloop 是单线程场景下几乎是最快的并发解决方案,但也需要周边生态的支持 ...

  8. 【CSDN软件工程师能力认证学习精选】 Vert.x(vertx) 简明介绍

    CSDN软件工程师能力认证(以下简称C系列认证)是由中国软件开发者网CSDN制定并推出的一个能力认证标准.C系列认证历经近一年的实际线下调研.考察.迭代.测试,并梳理出软件工程师开发过程中所需的各项技 ...

  9. 用.NET创建Windows服务

    用.NET创建Windows服务 译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作 ...

最新文章

  1. uikit框架开发前期配置及定制主题方法。
  2. Java之String类
  3. php array_diff_key,php中array_diff_key函数具有什么功能呢?
  4. Jass 技能模型定义(转)
  5. 程序导致IIS服务器应用程序池停止
  6. 12999元!小米MIX FOLD致敬未来尊享礼盒上线:限量100套 想买先抽签
  7. WebService学习总结(1)——WebService相关概念
  8. C语言的5种存储类以及关键字volatile、restrict
  9. ostringstream使用
  10. 阿里云服务器如何升级配置和降低配置?
  11. csdn资源下载不了问题解决 360浏览器下载不了csdn资源问题解决
  12. 计算机论文的字体要求,论文格式及字体大小要求(标准)
  13. Python实现问卷星表单机刷
  14. Python L型组件填图问题(棋盘覆盖问题)
  15. 健身 宏效 -大道至简
  16. [从头学数学] 第203节 坐标系与参数方程
  17. Android Studio集成NDK开发环境
  18. 玩一个猜数字的小游戏吧
  19. python打印皮卡丘步骤_编程作战丨如何利用python绘制可爱皮卡丘?
  20. 单片机触发器或非门工作原理以及用途

热门文章

  1. CityMaker学习教程01 模块说明
  2. 人工智能数学基础之线性代数(二)
  3. Linux下Rsync+sersync实现数据实时同步
  4. IBM硬件默认的管理地址
  5. 一张图搞清楚EOS是什么怎么工作
  6. R语言使用caret包的train函数构建adaboost模型、模型调优、自定义设置trainControl函数和tuneLength参数
  7. openwrt的UCI 网络配置与Luci在线安装
  8. a标签 download属性不生效,一直还是预览图片BUG
  9. 基于Arduino锂电池容量测试仪
  10. 对象转换成字符串/字符串和对象的相互转换