Spring Boot进阶:原理、实战与面试题分析
上QQ阅读APP看书,第一时间看更新

1.3.2 Web服务

在当下的互联网应用程序中,前后端分离的开发模式大行其道,Web服务是开发人员使用Spring Boot实现HTTP端点的基本手段。这部分内容涉及的技术体系非常丰富,我们把这些技术体系按实战方向分成两大部分,即轻量级Web服务和响应式Web服务。

1. Web服务的实战内容

(1)轻量级Web服务

对于轻量级Web服务开发而言,传统的Spring WebMVC仍然是目前主流的技术体系,我们可以使用Controller来暴露HTTP端点,并通过RestTemplate工具类来实现对远程服务的访问。

我们知道这种基于HTTP的请求-响应模式采用的是RESTful架构风格。但是请注意,真正的RESTful风格存在一个成熟度模型,代表最高成熟度等级的并不是我们日常所使用的WebMVC,而是HATEOAS(Hypermedia As The Engine Of Application State,基于超媒体的应用状态引擎)。Spring也专门为实现HATEOAS提供了Spring HATEOAS框架。

针对前后端分离的开发场景,如何设计合理且高效的交互Web API是前端和后台开发人员日常开发工作的一大难点和痛点。传统的RESTful风格能够很好运作的前提是提取资源的需求和API的设计之间能够得到匹配。如果这一条件无法满足,那么就会出现前端无法预判响应的数据格式、无法根据请求控制对应的返回结果以及需要发送多次请求等诸多问题。GraphQL为这些问题提供了解决方案,而Spring家族的Spring GraphQL框架也已经正式成为Spring顶级项目。

从实战角度讲,如何基于RESTful风格设计合理的HTTP端点、如何基于HATEOAS开发自解释型Web API,以及如何使用GraphQL替代RESTful API,需要开发人员有相应的设计方法和实现技巧。

(2)响应式Web服务

随着Spring 5的正式发布,我们迎来了响应式编程(Reactive Programming)的全新发展时期。响应式编程能够提高系统的弹性。Spring在Project Reactor这款响应式编程框架的基础上开发了Spring WebFlux框架。相较Spring WebMVC,Spring WebFlux能够为我们实现异步、非阻塞的远程交互过程。

在响应式的世界中,关于Web服务还有一个重要的话题,即网络协议。我们知道HTTP是一款典型的请求-响应式的应用层协议。而请求-响应模式在很多应用场景中存在局限性,也无法与响应式编程体系进行整合。在这个背景下就诞生了RSocket协议,该协议提供了四种不同的Web交互模式,并且可以与响应式编程技术完美融合。Spring目前已经全面拥抱RSocket协议,并专门提供了Spring RSocket框架。

从实战角度讲,使用非阻塞式Web服务提升系统性能、结合响应式Web服务和响应式数据访问技术构建全栈响应式服务体系,以及使用RSocket替代HTTP等开发技巧,可以直接应用于日常开发过程中,并实现系统性能的提升和交互方式的改进。

2. Web服务的实战案例

可以说,开发Web服务是Spring Boot框架最主要的应用场景,因此本书提供了大量的案例来充分展示Web服务的开发过程,包括Spring WebMVC案例、Spring HATEOAS案例、Spring GraphQL案例、Spring WebFlux案例以及Spring RSocket案例。

对于使用Spring Boot开发Web服务而言,正确使用Spring WebMVC是基础。为此,我们将通过一个案例来展示基于WebMVC构建RESTful API的实现方法。

在Spring WebMVC的基础之上,Spring HATEOAS案例的价值在于为我们提供超媒体(Hypermedia)应用程序的开发经验。基于超媒体中的链接机制,你会发现开发自解释Web API并没有看上去那么难。

2021年7月,Spring GraphQL发布了1.0.0版本,正式成为Spring家族的顶级项目。Spring GraphQL构建在GraphQL Java的基础之上,是原有的GraphQL Java Spring框架的替代版本,为开发人员使用GraphQL提供了多项技术支持。我们将通过一个精简但又完整的案例来演示最新版本Spring GraphQL的功能特性。

在开发响应式系统时,首先需要掌握的是响应式编程框架。Spring内置的响应式编程框架是Project Reactor。在掌握Project Reactor的基础上,我们进一步通过案例来展示使用Spring WebFlux开发响应式Web服务的实现过程。开发人员可以通过使用注解和函数式编程这两种开发模式来实现响应式Web服务,并基于全新的WebClient工具类实现非阻塞式的远程调用过程。

关于Web服务的最后一个案例是针对RSocket这款全新的网络通信协议给出对应的实践技巧。我们将引入整合了RSocket协议的Spring RSocket框架,并基于该框架实现传统的请求-响应模式,以及其他多种交互方式。