响应式编程(Reactive Programming)是相对于命令式编程的一种全新的编程模型,是基于数据流变化传播的编程范式。
响应式编程具备快速响应、不可变性、高并发、异步非阻塞、规模扩展、代码可读性高等诸多优势。Java编程领域出现了众多基于响应式流规范的编程开发框架。
本篇我们会从响应式编程动机、响应式编程基本概念、响应式宣言开始介绍,引出响应式编程的基本特性(数据流、背压等)和核心概念。
Spring Boot 2.x微服务框架在Spring Boot 1.x的基础上,基于Spring 5 Reactor框架实现了响应式的微服务基底技术。Reactor框架是Spring家族在响应式编程领域的子项目,由Pivotal公司开发,实现了基于响应式流编程规范。Reactor最大的优势是与Spring生态的无缝集成,Spring WebFlux框架正是基于Reactor框架实现的。此外,本文还会介绍基于响应式流规范开发的类库实现,包括Java Flow API、RxJava、Vert.X等响应式编程框架。
最后,我们会重点介绍WebFlux异步非阻塞Web框架(核心组件包括Flux、Mono、Scheduler等)和Spring Cloud Gateway项目。另外,还会介绍Spring WebFlux与Spring MVC在Web工作原理上的差异和关系,同时会说明WebFlux目前的主要使用场景及在生产环境下的使用局限性。
针对响应式编程,我们会介绍采用响应式编程的动机,并解释响应式编程的含义,然后讲解目前主流的响应式技术框架。
当前大多数公司使用Spring或者Spring Boot 1.x技术栈开发后端业务的Web服务器。假设在正常情况下,我们将Tomcat线程池配置为200(最大并发线程数),如果每个人的请求响应时间在200ms以内,并且根据每个请求的超时时间、资源限制和其他因素,粗略估算后,我们得出一个结论,系统在单位时间内最高可以支持1000个用户同时在线访问业务资源。然而,当业务场景是支持一个促销活动时,可能会出现用户规模快速增长或流量(QPS)激增的情况。这时,Tomcat服务器会出现短期资源耗尽及性能急速下降的问题,Tomcat后台爆出大量的服务超时、资源不可用、网页刷新慢等异常,而用户的直观体验就是服务不可用。
下面我们以Tomcat 7.x作为试验对象来模拟上述情景,使用BenchMark的方法比较客户端随着请求的增加对响应时间(延迟)、系统吞吐、负载均值等