vlambda博客
学习文章列表

读书笔记《building-restful-web-services-with-spring-5-second-edition》以下是一些基本知识

Chapter 1. A Few Basics

随着世界进入大数据时代,仅收集和处理数据已成为我们大多数 Web 应用程序的主要部分,Web 服务也是如此,因为 Web 服务只处理数据,而不是用户的其他部分体验、外观和感觉。尽管用户体验对所有 Web 应用程序都非常重要,但 Web 服务通过从客户端消费服务在处理数据方面发挥着重要作用。

在 Web 服务的早期,简单对象访问协议SOAP ) 是所有处理 web servicechoice ="id288558266" class="indexterm"> 消费。 SOAP主要用于HTTP和简单邮件传输协议SMTP) 用于跨相同或不同平台的消息传输。当没有 JavaScript Object Notation (JSON) 格式可用时对于 Web 服务,XML 曾经是only SOAP 可用于 Web 服务消费的可用格式。

然而,在 JSON 时代,Representational State TransferREST ) 开始主导基于 Web 服务的应用程序,因为它支持多种格式,包括 JSON、XML 和其他格式。 REST 比 SOAP 简单,REST 标准易于实施 和使用。此外,与 SOAP 相比,REST 是轻量级的。

在本章中,我们将介绍以下主题:

  • REST—a basic understanding
  • Reactive programming and its basics, including the benefits of Reactive programming
  • Spring 5 basics with Reactive programming
  • A sample RESTful web service that will be used as a base for the rest of the book

REST – a basic understanding


与流行的看法相反,REST 不是一种协议,而是一种用于管理状态信息的架构原则。它主要用于Web应用程序。 REST 由 Roy Fielding 引入以克服 SOAP 中的实现困难。 Roy 的博士论文为检索数据提供了一种简单的方法,无论使用何种平台。您将在 以下 部分中看到 RESTful Web 服务的所有组件。

Uniform interface

在 REST 原则中,所有 资源 都由 统一资源标识符 URI)。

HTTP REST 资源在某些媒体类型(例如 XML、JSON 和 RDF)中表示。此外,RESTful 资源是自描述的,这意味着提供了足够的信息来描述如何处理请求。

在另一个 REST 原则中,客户端通过超媒体与服务器交互,超媒体由服务器动态提供。除了端点,客户端不需要知道如何与 RESTful 服务交互。这一原则被称为超媒体作为应用程序状态的引擎HATEOAS< /跨度>)。

Client and server

通过分离客户端和服务器等 REST 实体,我们可以降低 REST 原则的复杂性,这将显示出清晰的界限服务器和客户端。这种解耦将帮助开发人员独立地专注于客户端和服务器。此外,它将有助于管理客户端和服务器的不同角色。

Stateless

在 REST 原则中,server 不会在服务器端保留任何有关客户端会话的状态;因此,它是无国籍的。如果从单个客户端对服务器进行两次调用,服务器将无法识别这两个调用是否来自同一个客户端。据服务器所知,每个请求都是独立且新的。根据 URL、HTTP 标头和请求正文(包括参数),可能会在服务器端更改操作。

Cacheable

使用 RESTful Web 服务,客户端可以缓存来自服务器的任何响应。 server 可以提及它如何缓存响应以及缓存多长时间。使用缓存选项,客户端可以使用响应而不是再次联系服务器。此外,缓存将通过始终避免客户端-服务器交互来提高可伸缩性和性能。

Note

该原则对于可扩展性具有显着优势。缓存技术将在 第 8 章性能

由于 REST 通常利用 HTTP,因此它继承了 HTTP 提供的所有缓存属性。

Layered system

通过提供分层系统,server 可以隐藏其身份。通过这样做,客户端将不知道他们正在处理哪个服务器。该策略通过提供中间服务器来提供更多的安全控制,并且还支持负载平衡功能。此外,中间服务器可以通过负载平衡和共享缓存来提高可扩展性和性能。

Code on demand (COD)

按需编码 (COD) 被视为可选原则。服务器可以通过传输可执行代码来扩展客户端的功能。例如,可以向基于 Web 的客户端提供 以自定义功能。由于按需代码会降低客户端的可见性,因此此约束是可选的。此外,并非所有 API 都需要此功能。

More on REST

在 Web 应用程序中,REST 通常在 HTTP 上使用。 REST 不需要绑定到任何特定协议。在HTTP REST中,我们主要使用GETPOSTPUT、和 DELETE 方法来改变我们访问的资源的状态。其他 HTTP 方法,例如 OPTIONSHEADCONNECT 和 < code class="literal">TRACE,可用于更高级的操作,例如,用于缓存和调试目的。出于安全和简单的原因,大多数服务器都禁用了高级方法;但是,您可以通过调整服务器配置文件来启用它们。由于 JSON 被用作主要应用程序的主要媒体类型,因此我们也仅将 JSON 媒体类型用于我们的 Web 服务调用。

Imperative and Reactive programming


让我们看一下命令式programming比较 "> 和反应式编程:x = y + z.

在前面的表达式中,假设 y = 10z = 15。在这种情况下,x 值将是 25x 的值将在表达式 x = y + z x 的值在这个表达式之后永远不会改变。

这在传统的编程世界中完全没问题。但是,我们可能需要一个场景,当我们更改 < 的值时,我们应该能够跟进 x em>yz

我们基于场景的新价值观是:

  • When y = 20 and z = 15, then x = 35
  • When y = 20 and z = 25, then x = 45

上述场景在我们日常编程中经常使用的命令式编程中是不可能的。但在某些情况下,我们可能需要更新 x 的值,对应于 y 或 z。反应式编程是这种场景的完美解决方案。在反应式编程中,x 的值会自动更新,对应于 y< /em>z

电子表格参考单元格是反应式编程的最佳示例。如果单元格值发生变化,引用的单元格值将自动更新。另一个例子可以在 Model-View-Controller 架构中找到,Reactive 编程可以自动更新附加到 Model 的 View。

反应式编程遵循观察者模式来操作和转换数据流,其中发布者(可观察)根据订阅者的需要发出项目。当 Publisher 发出项目时,Subscriber 会使用那些从 Publisher 发出的项目。与拉取项目的迭代器不同,在这里,发布者将项目推送到订阅者。

由于 Reactive 是非阻塞架构的一部分,因此在我们扩展应用程序时会很有用。此外,在非阻塞架构中,一切都被视为事件流。

我们将在本章后面讨论更多关于 Java 和 Spring 中的 Reactive。

Reactive Streams

反应式流都是关于处理异步 数据项流,应用程序在收到数据项时对其做出反应。此模型更节省内存,因为它不依赖任何内存数据。

Reactive Streams 有四个主要组件:

  1. Publisher.
  2. Subscriber.
  3. Subscription.
  4. Processor.

发布者发布数据流,订阅者异步订阅该数据流。处理器无需更改发布者或订阅者即可转换数据流。处理器(或多个处理器)位于发布者和订阅者之间,用于将一个数据流转换为另一个数据流。

Benefits of Reactive programming

Netflix、Pivo​​tal、Twitter、Oracle 和 TypeSafe 的工程师支持 Reactive 流方法。特别是,TypeSafe 对 Reactive Streams 的贡献更大。甚至 Netflix 的工程师也用他们自己的话说:

“使用 RxJava 的响应式编程使 Netflix 开发人员能够利用服务器端并发,而无需担心典型的线程安全和同步问题。”

以下是反应式编程的好处:

  • Focuses on business logic
  • Stream processing causes memory efficiency
  • Overcomes low-level threading, synchronization, and concurrency issues

反应式原则用于实时数据库查询、大数据、实时分析、HTTP/2 等实时案例。

Reactive programming in Java and Spring 5


RxJava 由 Netflix 工程师引入,以支持 Java 8 中的 Reactive 模型,并作为 Reactive Streams 的桥梁。但是,Java 开始使用 Java 9 支持 Reactive 模型,并且 Reactive Streams 已作为 java.util.concurrent.Flow

此外,Pivotal 引入了 Reactor 框架,该框架直接构建在 Reactive 流上,避免了到 Reactive< 的外部桥梁/span> 流。 Reactor 被视为 4th 库。

最后,Spring Framework 5.0 添加了 Reactive 特性,包括用于 HTTP 服务器和客户端的工具。 Spring 用户在处理 HTTP 请求时发现注释和控制器很方便,尤其是向框架分派 Reactive 请求和背压问题。

Reactive 模型在资源利用方面似乎很有效,因为它可以用更少的线程处理更高的负载。但是,反应式模型可能不是所有问题的正确解决方案。在某些情况下,如果我们在错误的部分使用 Reactor,可能会使事情变得更糟。

Our RESTful web service architecture


由于我们假设我们的读者 熟悉Spring Framework,我们将直接关注我们将要构建的示例服务.

在本书中,我们将构建一个票务管理系统。为了清楚地了解 Ticket 管理系统及其使用方式,我们将提出一个方案。

假设我们有一个由我们的客户 Peter 和 Kevin 使用的银行 Web 应用程序,并且我们有 Sammy,我们的管理员和 Chloe,客户服务代表 (CSR),以帮助解决任何银行应用程序问题。

如果 Kevin/Peter 在 Web 应用程序中遇到问题,他们可以在我们的工单管理系统中创建工单。此工单将由管理员处理并发送给处理工单的 CSR。

CSR 从用户那里获取更多信息并将信息转发给技术团队。一旦 CSR 解决了问题,他们就可以关闭问题。

在我们的 Ticket 管理系统中,我们将使用以下组件:

门票

  • ticketid
  • creatorid
  • createdat
  • content
  • severity (minor, normal, major, critical)
  • status (open, in progress, resolved, reopened)

用户

  • userid
  • username
  • usertype (admin, general user, CSR)

 

在这个票务管理系统中,我们将重点关注:

  1. Creating a ticket by the user.
  2. Updating the ticket by the user.
  3. Updating the ticket status by the admin.
  4. Updating the ticket status by the CSR.
  5. Deleting the ticket by the user and admin.

在最初的章节中,我们将讨论用户管理,以在处理 AOP、Spring Security 和 WebFlux 等主题时保持业务逻辑简单。但是,我们将在 第 13 章< /a>,票务管理 - 高级 CRUD 并实现我们之前提到的所有业务需求。在第13章中,票务管理 - 高级 CRUD 您将使用其他章节中使用的所有高级技术来完成我们的业务需求。

Summary


到目前为止,我们已经了解了 REST 和反应式编程的基础知识以及反应式流的必要性。我们在 Reactor 支持下经历了 Spring 5。此外,我们还定义了将在本书其余部分中使用的业务示例和架构。

在下一章中,我们将讨论使用 Maven 和简单的 REST API 创建简单的项目。此外,我们将讨论 Maven 文件结构和依赖关系,包括示例。