Spring Framework 1.0 自 2003 年发布以来,主打轻量级、非侵入、AOP(切面编程)、IoC(控制反转)等特性,在段时间内迅速走红,在 Java 社区广受欢迎。2004 - 2007 年,Spring 取得了相当辉煌的成就,不仅将 EJB 2 赶下舞台,而且牢牢确立了 Spring 作为 Java 企业应用开发的主流地位。其后一段时间,SSH 框架组合(Spring + Struts + Hibernate)引领了 Java 企业开发的主流模式,当时对技术比较保守的电信金融等行业,也言必称 Spring,Spring 成为了 Java 框架的事实标准。
再后来,Struts 被 Spring MVC 替代,Hibernate 变成了 JPA 的实现,Spring 却热度不减,一枝独秀。 而 2014 年 Spring Boot 发布,时值微服务概念的普及,Spring Boot 再次成为 Java 微服务的代名词。Spring Boot 基于 Spring 4.0 设计,不仅继承了 Spring 框架原有的优秀特性,而且还通过简化配置来进一步简化了 Spring 应用的整个搭建和开发过程。另外 Spring Boot 通过集成大量的框架使得依赖包的版本冲突、以及引用的不稳定性等问题得到了很好的解决。
如今的 Spring 5.0 版本,引入了全新的响应式编程等概念,在原 Spring 基础上推出了 WebFlux 技术, 实现完全非阻塞,支持 Reactive Streams 背压等特性,能基于 Netty 运行,提供不小的性能提升。其底层依赖 Spring 推出的另外一个全新项目 Project Reactor,原理类似 RxJava 等响应式框架。
Spring Framework 十多年来攻城掠寨,在取得巨大成功的同时,也变得越来越复杂,体积变大,启动变慢,当初的“轻量”变得越来越遥远。IoC、AOP 等概念让新手迷惑,JavaBean、XML 和 @Controller、@Service、@Repository 等各种注解让人们误以为这就是 Java 开发的全部。
时间来到了 2020 年,随着 Scala、Kotlin、Groovy 等 JVM 语言的繁荣,以及函数式编程的流行,一款名为 Vert.x 的框架正异军突起,拥有轻量、异步、可伸缩、高并发等特性,旨在为 JVM 提供一个 Node.js 的替代方案。下面就介绍 Vert.x 框架的一些特点,看看它能不能成为 Spring 框架的有力竞争对手。
背靠 Red Hat,并得到 Eclipse 基金会支持
Vert.x 由 Tim Fox 于 2011 年创立,最初命名为 Node.x(受 Nodejs 启发),当时他受雇于 VMware 旗下 SpringSource。后来 Tim 跳槽去了 RedHat / JBoss,领导 JBoss HornetQ 等项目开发。
2012 年末,在 Tim 离开工作岗位后,VMware 将 Tim 告上法庭,要求控制 Vert.x 社区的 商标、域名、博客和 Github 账户。在大量讨论和妥协之后,2013 年 1 月,VMware 被说服将 Vert.x 社区移交给中立的法人实体 Eclipse Foundation,这符合 Vert.x 社区的最大利益。
2016 年初,Tim Fox 卸任 Vert.x 项目的负责人,另一位 Red Hat 员工、Vert.x 核心开发者 Julien Viet 取代了他的位置。目前 Vert.x 的核心开发者主要来自 Red Hat。
官方多语言支持
Vert.x 支持 Java、JavaScript、Groovy、Ruby、Ceylon、Scala 和 Kotlin 语言,并为每种语言提供了方便的、符合该语言习惯的 API。Vert.x 并没有指定选择优先级,您可以选择其中任一门您熟悉的语言。当然如果需要协程支持,最好的选择是 Kotlin。
官方多框架支持
类似 Spring 全家桶,Vertx 对各种常用技术有很好的集成,比如各种 db 的连接库 vertx-mysql-client、vertx-redis-client、vertx-mongo-client,对 Kafka、Consul 的集成 vertx-kafka-client、vertx-consul-client,对 RxJava 支持的 vertx-rx-java,用于单元测试的 vertx-unit、vertx-junit,涉及了 Java 开发的方方面面。
基于 Netty,事件驱动、非阻塞、高性能
Vert.x 最大的特点就在于异步(基于 Netty),通过事件循环(EventLoop 线程)来调起存储在异步任务队列(CallBackQueue)中的任务(Verticle)。在 EventLoop 线程里面的代码,不能有阻塞操作,比如使用阻塞 IO、加锁、长时间占用 CPU 等,Vert.x 提供了单独的 Worker 线程池来运行阻塞的代码,比如传统的 JDBC 操作,这种模式大大降低了传统阻塞模型中线程对于操作系统的开销。
而通过 EventBus 则可以非常简单的实现分布式消息,进而为分布式系统调用和微服务奠定基础。通过不同的模块组合, Vert.x 可以实现 TCP、UDP、HTTP、WebSocket、MQ 各种不同功能,创建功能强大的应用程序。
体积小巧
十多年前讨论何为 Java 轻量级框架,有一个观点是认为该框架的 jar 包需要小于 1M,当年的 Spring 1.0 的确如此,所有内容打包在一起为 935K。然而现在光是 spring-core 就 1.4M, 加上 spring-contex、spring-aop、spring-beans、spring-mvc,以及 spring-boot、spring-data、spring-orm、spring-security,配上各种实现如 Hibernate、Redis、Mail 等,轻松过 50M 甚至 100M。Spring 不再是一个小而美的框架,而将交由 Vertx、Ktor 等新型框架接棒。
Vert.x 是用于创建轻量化、高性能的微服务的理想选择。
启动快、支持热部署
由于体积小巧,不依赖 Tomcat、Jetty 等传统 Web 容器,Vertx 启动非常快。Vert.x 自带热部署功能,不需要任何设置。相较于 Spring 需要引入 spring-loaded 和 spring-boot-devtools 并启用相关设置,方便许多。
支持 GrpahQL
Vertx 官方库 vertx-web-graphql 提供了对 GraphQL 技术的支持,依赖 graphql-java 和 reactive-streams 实现,开发非常方便。GraphQL 被认为是接棒 Restful 的下一代技术,已被许多的公司( Facebook、Twitter、Github 等)大规模用于生产环境,相信其未来还有很大的发展前景。
支持 MQTT
官方模块 vertx-mqtt 提供了对 MQTT 的支持。
简单、容易上手
虽然 Vert.x 提供了众多创新概念和特性,但暴露给开发者的接口屏蔽了复杂的实现,异常简单。类似于 Node.js,Vert.x 可以快速上手,相比 Akka 等框架简单许多,堪称生产力工具。