我们都知道Spring系列是目前比较流行的JavaWeb框架,在微服务盛行的当下SpringBoot更是成为了几乎霸主的地位。确实,SpringBoot免去了繁琐的配置并内置了tomcat,可以独立运行,很符合微服务的特性,并在后来有了SpringCloud相关组件的加持使得Spring的地位更加稳固。
它的有点有很多,但是当我们只有一台配置不高的服务器时,或者我们只是想快速的开发一个功能不需要很复杂的服务时使用SpringBoot总会让我们内心有点不舒服(可能只有我有这种感觉吧),因为它不是很轻,尽管它相对于之前的SSM框架来说已经很便捷了,但是它不是我心中的“轻”,作为个人开发时我希望我使用的框架是一个不会占用很多内存,而且性能也可以。于是便发现了Vert.x这个框架,准确的来说它不像是一个框架,它更像是基于Netty实现的一系列工具集。它的最重要的一个特点就是它是异步的架构,怎么理解这个呢?在官网中有这么一句话:“Don’t call us, we’ll call you”,这也是在使用它时的原则,也就是在开发过程中我们不需要等待它给我们返回什么,而是让它告诉我们完成了什么,即所谓的——事件驱动编程。这样有什么好处?我们举个例子:我们去电影院看电影,去了以后我们需要排队取票,然后再去买个爆米花,然后排队检票,也许还有更多的事情,这里就列举三件事,在传统的编程中我们会这样做,去排队取票,等去上票然后去排队买爆米花,然后再排队检票,每件事情在做的时候是需要等待的,也就是每件事情做的时候是同步的,这时你可能会说使用多线程啊,启用分身之术,但我们要注意,**线程的开销是需要消耗系统资源的,再加上频繁的线程切换,如果是要做5000件事情可能还能应付的过来,那如果是50000或者更多呢。**这额外的线程开销和系统资源的消耗可以说给本来就服务器配置不高的我雪上加霜。那如果是事件驱动编程呢?它会这样做,**首先去取票,拿了一个排队号码后它不需要等,直接去买爆米花,当然也不需要排队,拿一个号码,然后去检票那里告诉检票员到我了告诉我,完成上面这几件事后我就去椅子上休息去了。**这种方式是不是很好,把所有要做的事情告诉对象的处理方,等处理完成了直接告诉我们,然后我们拿到相应的结果,这样一个线程就可以支持很多个事件。Vert.x就是这样做的,熟悉Netty有的应该知道,Netty中的事件循环可以使用一个线程来支持很多的事件。
除了以上是Vert.x的一个优点外,对于Web开发它还有一个重要的优点是它不需要类似tomcat的容器来运行我们的程序,而是基于JVM的。这就会使我们的应用体积更小、占用内存更小。
它的优点很多,上面俩个就已经完全满足我的需求,本博客网站的服务端就是纯Vert.x编写,我的云服务器内存是4G,运行后该服务只占用了2.2%的内存,在使用Jmeter压测工具配置30个线程,同时发起请求循环100次,内存上升1%~2%,并不会再上升。
在刚使用时可能会有些不习惯,因为是异步架构的和事件驱动的,需要我们写对应的handler,不过习惯了以后就好,就像我这个博客服务搭建时刚开始写起来很别扭,因为习惯了SpringBoot那一套,不过Vert.x它更偏向底层,不会封装很多东西,因此也会给我们带来真正编码的快了,以为如果你不想好怎么设计或者怎么封装一些自己的工具的话,慢慢代码就会很乱。个人还是很推荐尝试它的,我在以后除了工作中(不可抗拒的力量)外,我自己的项目基本上都会使用它了。