什么是代理?

代理是位于客户端(例如应用程序)和目标服务器(如后端 API)之间的中间服务器。 当应用程序发送请求时,代理会首先接收它。 然后,代理可以将请求转发到目标服务器、修改请求、阻止请求或直接返回响应。

简言之,代理代表客户端或服务器进行调解通信。

代理的工作原理

代理通过接收传入请求并执行以下一个或多个作,在 HTTP 级别(或其他应用程序协议)上运行:

  • 将请求转发 到目标服务器,然后将响应中继回客户端。
  • 转发之前修改标头、URL 或有效负载
  • 在本地截获 和响应请求,而无需联系目标服务器。
  • 根据规则或访问策略拒绝请求。

从客户端的角度来看,它只是将请求发送到 URL。 代理处理幕后其他所有工作。 模式是客户端到代理再到目标服务器。

此模式引入了一层控制和抽象,可用于提高安全性、可观测性、性能和可测试性。

代理的类型

有不同类型的代理。 每个组件都适合系统架构中的特定角色。

转发代理

正向代理位于 客户端前面。 当应用程序发出请求时,它会通过代理,该代理决定是否以及如何转发它。 转发代理通常用于:

  • 控制对外部资源的访问。
  • 将客户端流量匿名化。
  • 记录传出流量进行监视。
  • 应用内容筛选或转换。

反向代理

反向代理位于 服务器前面。 客户端不知道底层后端基础结构。 反向代理接收传入的请求并将其转发到多个后端服务器之一。 反向代理通常用于:

  • 跨多个服务对流量进行负载均衡。
  • 提供缓存响应以减少后端负载。
  • 终止 TLS/SSL 连接。
  • 对公共 Internet 隐藏内部服务详细信息。

透明代理

透明代理会截获流量,而无需显式配置客户端来使用它。 此类型用于企业或 Internet 服务提供商环境,以强制实施策略或监视使用情况。

为什么代理对应用程序开发人员很重要

基础结构或网络团队通常管理代理。 但是,代理直接影响应用程序行为,尤其是在开发和测试环境中。 以下是影响日常工作的一些实际方法。

调试和可观测性

代理可以捕获和检查 HTTP 流量。 开发代理、Fiddler、Proxyman、Charles Proxy 或 mitmproxy 等工具充当本地转发代理。 可以通过它们运行应用程序来分析请求和响应、发现错误以及验证标头或身份验证令牌。

API 网关和路由

在许多生产系统中,发往应用程序的后端的流量通过 API 网关或反向代理(例如 NGINX)或 Azure API 管理等云原生服务进行路由。 这些代理处理路由、身份验证、速率限制等。

设计 API 或生成分布式服务时,必须了解代理如何影响标头(例如 X-Forwarded-For)、超时和请求大小限制。

CORS 和本地开发

在本地开发期间,尤其是在 Web 应用程序中,从浏览器调用 API 时,可能会遇到跨域资源共享(CORS)限制。 开发代理可以在重写标头以绕过 CORS 限制时将请求转发到目标 API。 重写 CORS 请求的开发人员工具的常见示例包括 Express 或 ASP.NET Core 等框架中的 vitewebpack-dev-server或自定义代理中间件。

服务虚拟化和测试

代理可以模拟后端 API。 当实际服务不可用、不稳定或测试期间使用成本高昂时,此功能非常有用。 通过截获和模拟响应,可以在不同场景下测试应用程序行为,例如超时、错误或格式不正确的数据。

开发代理或自定义代理实现等工具通常用于集成和端到端测试。

身份验证和安全性

代理通常是保护应用程序时的第一道防线。 他们可以强制实施访问控制、注入身份验证标头或终止 TLS/SSL 连接。 作为开发人员,请务必了解应用程序在代理后面的行为方式,以及如何访问携带身份验证或标识信息的标头。

常见标头和代理注意事项

当请求通过代理传递时,会添加或修改某些标头以保留重要的元数据。 例如:

  • X-Forwarded-For:指示客户端的原始 IP 地址。
  • X-Forwarded-Proto:指示原始协议(HTTP 或 HTTPS)。
  • X-Forwarded-Host:指示客户端请求的原始主机。

当您的应用程序在反向代理后面运行时,请确保您的框架或平台已配置为信任并正确解析这些请求头。

开发代理充当用于开发和测试的转发代理

开发代理是一个转发代理,可用于截获和修改来自应用程序的请求到任何目标服务器。 通过 Dev Proxy(开发代理),您可以:

  • 了解应用如何响应 API 错误。
  • 验证应用如何处理 API 速率限制。
  • 了解应用如何处理慢速 API。
  • 无需编写代码行即可快速建立模拟 API。
  • 使用上下文指南改进应用,了解如何使用 API。

后续步骤