单体与微服务
单体应用是快速开发的一个例子,开发团队希望在快速的周转时间内开发产品。他们把所有的东西都写在一个单一的包里,然后交付给客户。它在几个月或一两年内运行良好,然后客户提出要求,需要改变设计或架构。
为了处理复杂性,同时支持更快交付的想法,我们软件行业的优秀工程师们提出了新的架构。它为每个业务组件定义特定的属性,并有专门的服务。一个单独的业务组件或单一的责任服务被称为一个微服务。在大的软件应用程序中,多个服务共同完成一个单一的目标。
REST
典型的REST应用架构如图
REST是REpresentational State Transfer的缩写。符合RESTful约束的REST服务称为RESTful服务。
网络经过一段时间的发展,从Web 1.0到2.0,3.0,再到4.03。Web 1.0是用于文件共享。Web 2.0是以人为中心的,支持互联网作为平台。网络3.0是可执行的网络,支持数据共享。Web 4.0是智能的、智慧的网络,在这个网络中,机器很聪明,可以为人类加载内容。
在为万维网开发网络应用时,架构应满足不断增长的需求,必须包括以下非功能要求。
- 效率
- 性能和可扩展性
- 可靠性
- 可重用性
- 可移植性
- 模块化
- 其他
符合RESTful4架构约束的REST服务被称为RESTful服务。这些约束条件如下。
- 客户端-服务器架构
- 无状态性
- 缓存
- 分层系统的使用
- 统一的接口
- 支持按需编码
客户端-服务器架构支持责任的分离。客户端是独立于服务器的。客户端或用户界面可以独立开发,而不知道服务器的内部细节及其功能。
无状态性有助于提高服务器的整体性能。服务器不需要知道或维护请求的状态/会话。它的基本工作是提供响应,而不需要用会话来追踪来源。这是由HTTP协议实现的。
缓存有助于提高性能。如果同一个请求来自不同的用户,它可以被缓存起来。HTTP有一个功能,有助于缓存响应。这有助于提高服务器的效率。
使用分层系统有助于解决更多的问题,如认证和安全。拥有一个分层系统有利于快速调试根本原因。
统一接口是RESTful架构的基础。它确保了资源是基于URI来识别的,比如/api/v1/products。关于统一接口,把HATEOAS5过一遍就好了。
支持按需编码的例子比如Java小程序或客户端的JavaScripts。对于测试RESTful API来说,有了以上的理解就足够了。RESTful架构使用HTTP作为客户端和服务器之间通信的协议。由于HTTP是一个无状态协议,RESTful架构的目标是可扩展性和性能,而且由于HTTP内部调用TCP进行客户端和服务器之间的连接,它也是可靠的。让我们在下一节中详细讨论HTTP。
HTTP
超文本传输协议(HTTP Hypertext Transfer Protocol)用于典型网络应用中客户端和服务器之间的通信。
第一个基本版本是HTTP 0.9。后来经过几次更新,它被发布为HTTP 1.0。这个版本为每个请求利用一个单独的连接。
到目前为止,HTTP 1.1版本是最流行和最广泛使用的版本。这个版本解决了延迟的问题。头部元数据和信息都是文本格式的。HTTP 2.0通过使用加密对头元数据进行了性能优化;同时,消息在客户端和服务器之间被复用,以获得更好的性能。HTTP 3.0目前正在开发中;它使用UDP作为传输层。
本文中将一直使用HTTP 1.1。
HTTP是应用层6协议,通过TCP(http:// 默认端口80)或TLS(https:// 通过端口443)加密的TCP连接工作。TCP是最可靠的协议;它保证数据包的发送/接收100%没有任何损失。如果出现丢失,将向接收方发送错误信息。
HTTP协议根据请求从服务器上获取资源,例如从服务器上获取HTML内容或指定格式的数据。在HTTP从服务器获取数据之前,客户端必须与服务器建立连接,以便通过HTTP获取资源。这是由客户端和服务器之间通过TCP层的三方通信来完成的。客户端在给定的端口上向服务器发送连接请求。服务器确认收到该请求,然后客户端也确认收到该请求。这样,客户端和服务器之间就建立了连接。现在通过HTTP,客户端可以从服务器上获取所需的信息。一旦建立了连接,客户可以通过HTTP发送多个请求,服务器将对每个请求发送响应。
HTTP协议是简单的、可扩展的和无状态的。我们可以读取头信息和消息正文。如果头的用法或语义发生变化,它可以在客户端和服务器之间很容易地进行调整。服务器不记得请求的状态。它只是发送请求的数据,并为新的请求开放。
HTTP有缓存机制。客户端可以在请求头中发送信息,以便在规定的时间内将响应存储在缓存中,供以后使用以提高性能。HTTP还支持CORS;也就是说,如果请求体或HTML有一个不同的域,这将被提供给客户端。HTTP也在sessionId上工作。客户端发送了一个请求,服务器在响应中发送了sessionId。之后,这个sessionId可以用来验证请求。一个典型的服务器之间有一个代理,以隐藏服务器的IP,防止黑客攻击。HTTP支持实时模仿真实服务器的代理服务器。
客户端和网络服务器之间的HTTP连接的步骤:第1步,在客户端和服务器之间建立TCP连接。第2步通过HTTP从服务器上获取资源。通过一个TCP连接,客户端可以发送多个请求,服务器将通过HTTP响应所需信息。
Header
头信息是每个HTTP请求/响应的一部分,它们定义了客户端和服务器之间的信息流。头信息中最常见的字段是 Content Type, Content Length, Host, User-Agent,Accept, Accept Encoding, Accept Language, Connection, Cache Control,Age, Date, Expires和Keep-Alive。
头信息在逻辑上被分为三类:请求头信息、响应头信息和一般头信息。这可以在发送请求后在浏览器的网络标签中看到。
请求头主要有Authorization, Host, Accept, Accept-Language, Accept-Encoding, and Content-Type等字段。授权字段用于与服务器的认证。它指定请求来自授权的客户端。
响应头有Expires、Content-Length、Content-Type、Cache-Control、Date和Keep-Alive字段。Content-Type提供了响应类型的格式,例如,响应是JSON还是纯文本。Keep-Alive是以秒为单位的超时,是允许连接保持开放的时间。
一般头文件有关于请求URL、请求方法、状态代码、远程地址和连接的信息。
谷歌浏览器中的头信息分组还有一类标头名为表示标头,包括内容类型、内容长度和其他与响应的表述有关的字段。
请求
客户端使用HTTP请求与服务器通信。该请求有请求方法、资源地址(在服务器上)URI、请求头和请求正文(body 可选)等。
- 请求方法
请求方法是客户想要在服务器资源上执行的操作。在开发基于API的软件应用中最常用的方法是GET、POST、PUT和DELETE。其他还有TRACE、UPDATE、HEAD、CONNECT、OPTIONS、TRACE和PATCH。
GET方法是用来从服务器上获取信息的。POST方法用于向服务器资源添加一个新对象。PUT方法用于更新服务器资源上的现有对象。DELETE方法用于删除服务器资源上的对象。GET、PUT和DELETE是等价的方法;也就是说,如果你多次执行相同的调用,结果将是相同的。GET也是一个安全的方法,如果你多次执行该调用,不会有任何伤害。
- 资源地址
资源地址是由URI定义的,其中URI代表统一资源标识符。它是服务器上资源的标识符,被称为服务的端点,如/api/v1/products。
- 请求头
请求头包含一个认证字段,用于认证服务器上的请求,以及Content-Type,用于指定预期来自服务器资源的内容类型。
- 请求主体(Request Body)
请求正文有一个需要遵循的格式,它被服务器资源或服务端点所理解。通常情况下,响应体是JSON或XML格式。
响应
当请求到达服务器时,它会发送响应。这里使用的协议是HTTP。它有状态行、响应头和信息体。
- 状态行
状态行列出了协议版本、返回状态代码和状态文本。状态代码通常被称为响应代码。
-
响应头
响应头包含了由服务器发送的定义响应信息的信息,如Content-Length和Content-Type。 -
响应主体(Response Body)
响应主体是服务器根据给定资源上的请求发送给客户端的响应消息。
响应代码
- 信息:1XX-199
- 成功:2XX-299
- 重定向: 3XX-399
- 来自客户端的错误:4XX-499
- 来自服务器的错误:5XX-599
比如102状态代码表示已收到来自客户端的请求,服务器正在工作。
200状态代码标志着来自客户端的请求是成功的,并被服务器接受。
302状态代码表示该请求被重定向到另一个资源。
400状态代码标志着来自客户端的请求是错误的。
500状态代码标志着服务器无法到达或有一个服务器错误。
你只需要记住基于API的软件应用中常用的几个。知道响应代码对API测试很重要,因为API的消费者应该知道来自服务器的响应,如果出现错误,可以采取纠正措施。
总结
在这一章中,你了解了基于网络的应用架构类型,这些类型是业界普遍使用的。你还了解了客户端和服务器之间的通信方面以及这些属性。你了解了HTTP、HTTP头、HTTP请求、HTTP响应,以及典型的基于网络的应用中的各种响应代码。在下一章中,你将学习标准认证。
参考资料
- 本文涉及的python测试开发库 谢谢点赞!
- 本文相关海量书籍下载
https://en.wikipedia.org/wiki/Hibernate_(framework)
https://en.wikipedia.org/wiki/Roy_Fielding
https://ijcsit.com/docs/Volume%205/vol5issue06/ijcsit20140506265.pdf
https://en.wikipedia.org/wiki/Representational_state_transfer
https://en.wikipedia.org/wiki/HATEOAS
https://en.wikipedia.org/wiki/Application_layer
https://en.wikipedia.org/wiki/Transport_Layer_Security
https://en.wikipedia.org/wiki/Cross-origin_resource_sharing
网友评论