Vert.x初识

Vert.x是Eclipse基金会下的一个开源的Web开发框架,官网https://vertx.io/。在国内目前用的并不多,资料也非常有限,这次偶然的机会接触到Vert.x,觉得这个框架异常清新小巧,所以在自己使用的过程中,进行一个整理,希望能够帮助正在使用Vert.x的朋友减少踩坑。

本篇是Vert.x的第一篇,主要介绍一些Vert.x的一些优势,以及一些Vert.x编程中用到的思想。建议在阅读本篇文章之前,能够对JavaScript的异步模型有一定的了解。

在Java领域,做Web开发我们一般有很多的选择,比如使用原生的Servlet,比如使用SpringMVC,再比如使用Struts等等总之你有很多的选择。在国内,目前来讲,SpringMVC作为Spring体系下的Web层架构,是深受企业青睐的,绝大部分的企业可能都在使用SpringMVC。而对于我们今天要说的Vert.x这个Web层框架,却很少有人知道,但它却是仅次于SpringMVC,排名第二的一个Web层框架。


Vert.x就像是跑在JVM之上的Nodejs,所以Vert.x的第一个优势就是这是一个异步非阻塞框架。如果熟悉node的朋友可能比较好理解。什么是异步非阻塞呢?我们都写过Ajax,浏览器在执行Ajax代码的时候,不会说是等待Ajax请求成功之后,再继续往下执行,而是不等结果,直接向下执行。等待Ajax执行成功的时候,在回来执行success方法,这就是异步非阻塞!先使用JavaScript举个例子

console.log("before.... ");

$.ajax({
	url:'list.do',
	success: function(res) {
		console.log("success .... ");
	},
	error: function(err) {
		console.log("error .... ");
	}
});

console.log("after.... ");

这是我随便写了一个例子,完全当做伪代码来看就好,我们都很清楚的知道,输出的结果肯定是

before ...
after ...
success ...

下面贴一段使用vert.x的异步代码,比如请求一个远程地址,并读取远程地址的响应。

System.out.println("before ... ")

WebClient
    .create(vertx)
    .postAbs(REQUEST_URL) // 这里指定的是请求的地址
    .sendBuffer(buffer, res -> { // buffer是请求的数据

        if (res.succeeded()) {  
            // 请求远程服务成功
            System.out.println("success ... ")
            
        } else {
            // 请求失败
            resultHandler.handle(Future.failedFuture("请求服务器失败..."));
        }
    });

System.out.println("after ... ")

这段代码的执行效果和上面的JavaScript执行的结果是类似的,同样是先打印 before,在打印 after,最后打印 success。

异步也是Vert.x于其他的JavaWeb框架的主要区别。我们这里先不去讨论异步的优势与他的实现原理,只要先知道,Vert.x和JavaScript一样,是一个异步执行的就可以了。至于EventLoop后面再说。

支持多种语言。Vert.x有一个口号大概是:“我们不去评判那个编程语言更好,你只要选择你想要使用的语言就可以了”。也就是说,在Vert.x上,可以使用JavaScript,Java,Scala,Ruby等等,下面是官网的一个截图


不依赖中间件。Vert.x的底层依赖非常优秀的NIO框架Nettty,因此在使用Vert.x构建Web项目时,不依赖中间件。像Node一样,可以直接创建一个HttServer。这也是Vert.x性能高一个原因。

完善的生态。Vert.x和Spring的对比,有一种使用MacOS和Windows对比的感觉。Vert.x和庞大的Spring家族体系不同,Vert.x提供数据库操作,Web客户端操作,NoSQL数据库的一些操作等常用的结构,很清新,很简洁,但足够使用。下面是从官网截取的一个提供的客户端工具。


为微服务而生。Vert .x提供了各种组件来构建基于微服务的应用程序。通过EventBus可以非常容易的进行服务之间的交互。并且提供了HAZELCAST来实现集群。

当然了,除了一些优势以外,要在项目中选择使用Vert.x还要考虑一些问题,这里不展开说明,只是根据个人的使用经验提出一些点。

* Vert.x使用JDK8的Lambda,所以要使用Vert.x首先需要对JDK8比较熟悉

* 对于复杂的业务,可能会遇到Callback Hell问题(解决方案也有很多)

* 由于异步的特征、契约创建、更高级的错误处理机制使得开发过程会相对更复杂。(来自并发编程网)

技术是为业务服务的,在选择架构的时候,也要考虑用人的成本,也正是因为如此,国内使用Vert.x的企业还不是很多。但是我相信,未来,一定是异步非阻塞的天下(Spring5也开始支持异步)。

猜你喜欢

转载自blog.csdn.net/king_kgh/article/details/80772657