阻塞和非阻塞:针对的是线程的场景。
同步和异步:针对的是服务调用的场景。
场景:系统按照预设的用户数、并发请求数量、平均响应时间等准备了系统资源,包括web容器的线程池、CPU、内存等。当并发请求数量超出预期时,发生响应时间延长和服务中断。
希望服务具有即时响应性,需求(负载)的变化以及外部服务可用性变化,针对变化做出响应。
比如弹性Elasticity,即服务的吞吐量可以应对访问量变化。从而服务不会应为需求变大而出现延迟或者中断。
可伸缩性Scalability,水平或者垂直,包括计算资源和实例。
回弹性Resilience,在发生故障的情况下能够保持即时响应。比如隔离机制,隔离所有内部故障。或者把同步响应转换为异步响应,比如支付服务中断的情况下,允许继续接受用户订单,然后通过调度自动重新提交支付请求。
注意,弹性和回弹性是紧密耦合的,两者同时启用才能实现真正的即时响应系统。
响应式编程 vs 命令式编程
WebFlux是响应式编程的其中一种技术栈。
程序员往往根据不同的应用场景选择不同的技术,有的场景适合用于同步阻塞的,有的场景适合用于异步非阻塞的。而Spring 5提供了一整套响应式(非阻塞)的技术栈供我们使用(包括Web控制器、权限控制、数据访问层等等)。
在容器端,响应式编程需要异步非阻塞的容器的支持,比如Netty,Servlet 3.1。而Servlet技术栈用的是Servlet容器,比如Tomcat。
在Web控制端,响应式编程用的是WebFlux,命令式编程用的是SpringMVC。
它们均可以用注解式编程模型,均可以运行在tomcat,jetty,undertow等servlet容器当中。可是SpringMVC采用命令式编程方式,代码一句一句的执行,这样更有利于理解与调试,而WebFlux则是基于异步响应式编程,对于初次接触的码农们来讲会不习惯。对于这两种框架官方给出的建议是:
1)若是原先使用SpringMVC好好的话,则不必迁移。由于命令式编程是编写、理解和调试代码的最简单方法。由于老项目的类库与代码都是基于阻塞式的。
2)若是你的团队打算使用非阻塞式web框架,WebFlux确实是一个可考虑的技术路线,并且它支持相似于SpringMVC的Annotation方式实现编程模式,也能够在微服务架构中让WebMvc与WebFlux共用Controller,切换使用的成本小。
3)在SpringMVC项目里若是须要调用远程服务的话,你不妨考虑一下使用WebClient,并且方法的返回值能够考虑使用Reactive Type类型的,当每一个调用的延迟时间越长,或者调用之间的相互依赖程度越高,其好处就越大。
举例:a=b+c
在响应式编程中,a的值由b和c计算得到。但如果后面b和c的值发生变化,会影响到a的值。
什么是响应式编程
响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。
学习路线:
Lambda表达式 -> Stream流 -> 响应式编程
异步非阻塞并不会使程序运行得更快。WebFlux 并不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性。
Spring WebFlux 是一个异步非阻塞的 Web 框架,所以,它特别适合应用在 IO 密集型的服务中,比如微服务网关这样的应用中。
为什么需要响应式编程
Reactive systems have certain characteristics that make them ideal for low-latency, high-throughput workloads. Project Reactor and the Spring portfolio work together to enable developers to build enterprise-grade reactive systems that are responsive, resilient, elastic, and message-driven.
The key word is support non-block.
Spring WebFlux Framework
WebFlux有两种风格,功能性和注释性。
Mono
用于0/1个元素。
Flux
用于N个元素。
WebClient
在Spring Framework 5中,WebClient是一个非阻塞、反应式类型的安全HTTP客户端,属于Spring WebFlux模块的一部分。
它是为了替代传统的RestTemplate而设计的,提供了一种基于HTTP/1.1协议的响应式、非阻塞解决方案。
WebClient的主要特点包括:
1. 非阻塞IO:基于非阻塞I/O模型,在等待网络响应时,线程不会被阻塞,可以继续处理其他任务,提高了系统的吞吐量和伸缩性。
2. 反应式编程:支持异步、非阻塞式请求和响应处理,与Project Reactor库深度集成,支持复杂的异步数据流处理。
3. 高性能:由于采用了非阻塞I/O,WebClient能够用较少的线程处理更多的并发请求,降低了系统的资源消耗,提高了吞吐量。
4. 流式处理能力:支持从服务器上或下流式传输数据,这对于处理大文件或实时数据流尤为重要。
5. 强类型安全的API:提供了类型安全的API,避免了编译时错误,增强了代码的可读性和稳定性。Fluent API风格使得构建请求更为直观和简洁。
6. 函数式编程友好:能够很好地与Java 8及更高版本的Lambda表达式和函数式接口集成,使代码更加简洁、易于理解和维护。
7. 自定义配置灵活性:允许用户根据需要配置连接池、超时时间、重试策略等,以适应不同的网络环境和业务需求。
8. 集成Spring生态系统:无缝集成Spring框架,可以与Spring Security、Spring Boot以及其他Spring组件协同工作,简化了配置和使用过程。
WebClient在Spring Boot中的使用需要添加相应的依赖,并创建WebClient实例来发送HTTP请求和处理响应。它适用于需要高并发和响应式编程的现代Web应用。

