API网关帮后端服务做连接管理

本文涉及的产品
云原生 API 网关,700元额度,多规格可选
简介: 使用API网关来管理你的API的时候,由API网关来负责管理所有客户端的连接,后端服务器可以专心处理业务请求,节省了大量连接管理的开销。

当一个互联网产品业务量越来越大,她接入的客户端也会越来越多,不管客户端使用的是长连接还是短连接,对用户的连接管理必将成为一件耗资源且复杂的事情。特别对于使用HTTP短连接进行数据交互的业务,在HTTP连接维护上面,需要花费比较大的开销。

让我们来看看使用HTTP短连接来完成一次数据交互的全过程。

众所周知,HTTP是基于TCP的协议,而使用TCP进行通信前,首先需要通信双方建立TCP连接。我们来看看客户端是如何和服务器端建立连接的:

  1. 请求新的TCP连接时,客户端需要向服务器发送一个小的TCP报文(通常是40-60字节), 这个报文设置了一个特殊的SYN标记。说明这是一个连接请求;
  2. 如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP报文,这个报文的SYN和ACK标记都被置位。ACK标记被置位是告诉客户端,服务器端已经收到你的连接请求了,SYN标记被置位是服务器告诉客户端,服务器端的连接已经建立;
  3. 最后, 客户端收到刚才的SYN和ACK报文后,向服务器会送一条TCP报文,这个报文的ACK标记都被置位。这个报文是通知服务器端,客户端知道服务器的连接建立好了。

三步完成后,此连接已成功建立, 客户端和服务器端都可以在此连接上发送数据了,这三步就是江湖上经常说道的TCP三次握手的过程,下面我们用一张图来更清晰地描述下这个过程:

三次握手建立连接

连接建立后,客户端在这条连接上发送请求数据,服务器端收到请求后,将请求交给业务线程处理,业务线程在处理完成业务后,将应答数据写入连接。客户端接收到应答数据,将应答数据处理后显示给客户端使用者。此时客户端由于客户端使用的是短连接通信策略,并且数据交互过程已经完成,客户端会主动去关闭这条连接,这个关闭的过程也比较复杂,比建立连接的三步还多一步:

  1. 客户端需要向服务器发送一个标记为FIN的报文,告诉服务器我要关闭这条连接了;
  2. 服务器收到客户端发送的标记为FIN的报文后,给客户端发送一个标记为ACK的报文,告诉客户端我知道你想关闭这条连接了;此时服务器如果还有未发送完的应答数据,也会继续在这条连接上将数据传输完毕;
  3. 服务器端发现自己也没有数据发送给客户端了,这时服务器会给客户端发送一条标记为FIN的报文,告诉客户端,我也准备好关闭这条连接了;
  4. 客户端收到服务器端发送过来的FIN报文后,立即给服务器端发送一个针对这条FIN报文的ACK报文,告诉服务器端,我收到了,你安心释放这条连接的资源吧。服务器收到最后的ACK报文后,将这条连接的资源释放掉。此时客户端在发送完ACK报文后会处于TIME_WAIT状态一段时间,然后再释放这条连接。

让我们用一张简要的图来描述下这个过程:

关闭TCP连接

有时候服务器端会主动发起FIN报文,流程和客户端发起的一样,这块就不继续描述了。

从以上的描述中,我们已经可以了解到,客户端和服务器端处理连接的建立和释放这个过程是非常耗时间和资源的。目前很多APP的业务还都是使用HTTP短连接来完成数据通讯的,这样每完成一次业务通信,就需要完成一次建立连接和关闭连接的过程。使用HTTP短连接做数据通讯,每一次连接的建立和关闭具体会消耗服务器多少时间呢,我们可以通过抓包来量化这个过程。

下面是我抓的一个典型的短连接数据的网络包,客户端向服务器发起请求一个HTTP请求获取一个静态页面,服务器端读取本地页面文件后给客户端返回。

短连接HTTP请求抓包

从这个图中我们可以看到,前三个包是TCP三次握手建立连接的过程,一共花费了服务器22毫秒的样子,中间三个报文是接收HTTP请求和返回应答的报文,一共花费了服务器180毫秒,最后四个报文是关闭连接的报文,花费了服务器60毫秒左右。也就是说服务器在连接的建立与关闭,一共花费了82毫秒的CPU时间,而真实的业务处理花费了180毫秒,连接管理的开销达到了业务开销的45%。这个业务请求是有磁盘IO的,如果业务的操作在内存可以完成,那么连接管理的开销可能达到业务开销的100%。

如果你的业务服务器部署在阿里云API网关的后面,由阿里云API网关负责管理所有客户端的连接,阿里云API网与后端业务服务器之间使用长连接进行通信。由于长连接通信不需要频繁的建立、释放TCP连接,那么后端的业务服务器完全不用在连接管理上面有额外开销,所有的CPU资源都可以花销在业务处理上。我们来看一下这块的架构图:

架构图

结论:

使用API网关来管理你的API的时候,由API网关来负责管理所有客户端的连接,后端服务器可以专心处理业务请求,节省了大量连接管理的开销。

需要注意的一点是,后端服务器的HTTP容器必须配置成支持HTTP长连接才能享受到使用API网关带来福利。

目录
相关文章
|
2月前
|
设计模式 API 开发者
探索现代后端开发:微服务架构与API设计
【10月更文挑战第6天】探索现代后端开发:微服务架构与API设计
|
20天前
|
缓存 前端开发 API
深入浅出:后端开发中的RESTful API设计原则
【10月更文挑战第43天】在数字化浪潮中,后端开发如同搭建梦想的脚手架,而RESTful API则是连接梦想与现实的桥梁。本文将带你领略API设计的哲学之美,探索如何通过简洁明了的设计,提升开发效率与用户体验。从资源定位到接口约束,从状态转换到性能优化,我们将一步步构建高效、易用、可维护的后端服务。无论你是初涉后端的新手,还是寻求进阶的开发者,这篇文章都将为你的开发之路提供指引。让我们一起走进RESTful API的世界,解锁后端开发的新篇章。
|
20天前
|
缓存 API 开发者
构建高效后端服务:RESTful API设计原则与实践
【10月更文挑战第43天】在数字化时代的浪潮中,后端服务的稳定性和效率成为企业竞争力的关键。本文将深入探讨如何构建高效的后端服务,重点介绍RESTful API的设计原则和实践技巧,帮助开发者提升服务的可用性、可扩展性和安全性。通过实际代码示例,我们将展示如何将这些原则应用到日常开发工作中,以确保后端服务能够支撑起现代Web和移动应用的需求。
|
27天前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
22天前
|
JSON 缓存 API
探索后端开发中的RESTful API设计原则
【10月更文挑战第41天】在后端开发的广阔天地中,API的设计如同绘制一幅精细的地图,指引着数据的流向和前端的交互。本文将带你走进RESTful API的世界,一起探索如何用简洁高效的设计原则来构建一个清晰、可维护且易于理解的API结构。我们将从RESTful API的基础概念出发,通过实际案例分析,揭示如何在实践中应用这些设计原则,并讨论如何在复杂的业务逻辑中保持API的简洁性和一致性。
|
26天前
|
JSON 前端开发 API
后端开发中的API设计与文档编写指南####
本文探讨了后端开发中API设计的重要性,并详细阐述了如何编写高效、可维护的API接口。通过实际案例分析,文章强调了清晰的API设计对于前后端分离项目的关键作用,以及良好的文档习惯如何促进团队协作和提升开发效率。 ####
|
1月前
|
前端开发 关系型数据库 API
深入浅出后端开发——从零到一构建RESTful API
本文旨在为初学者提供一个关于后端开发的全面指南,特别是如何从零开始构建一个RESTful API。我们将探讨后端开发的基本概念、所需技术栈、以及通过实际案例展示如何设计和实现一个简单的RESTful API。无论你是完全的新手还是有一定编程基础的开发者,这篇文章都将为你提供实用的知识和技巧,帮助你在后端开发的道路上迈出坚实的一步。
|
13天前
|
安全 测试技术 API
构建高效RESTful API:后端开发的艺术与实践####
在现代软件开发的浩瀚星空中,RESTful API如同一座桥梁,连接着前端世界的绚丽多彩与后端逻辑的深邃复杂。本文旨在探讨如何精心打造一款既高效又易于维护的RESTful API,通过深入浅出的方式,剖析其设计原则、实现技巧及最佳实践,为后端开发者提供一份实用的指南。我们不深入晦涩的理论,只聚焦于那些能够即刻提升API品质与开发效率的关键点,让你的API在众多服务中脱颖而出。 ####
24 0
|
1月前
|
缓存 负载均衡 安全
后端开发的艺术:构建高效、可扩展的API
在现代软件开发中,后端开发扮演着至关重要的角色。它不仅负责处理数据存储、业务逻辑和安全性,还需要提供高效、可扩展的API供前端和其他服务使用。本文将深入探讨后端开发的关键概念和技术,帮助读者了解如何构建高效、可扩展的API,并提供一些实用的建议和最佳实践。
|
2月前
|
SQL API 数据安全/隐私保护
打造现代化后端服务:从零到一实现RESTful API
【10月更文挑战第20天】在数字化时代的浪潮中,构建一个高效、可靠的后端服务是每个软件工程师的必备技能。本文将引导你理解RESTful API的设计哲学,并通过实际的代码示例,展示如何从无到有地实现一个现代化的后端服务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的知识和启发。