请求的处理方式

本文档介绍 App Engine 应用如何接收请求和发送响应。如需了解详情,请参阅请求标头参考

如果您的应用使用多项服务,您可以将请求路由到特定服务或此服务的特定版本。如需详细了解服务可寻址性,请参阅请求的路由方式

处理请求

应用负责启动 Web 服务器和处理请求。您可以使用支持您的开发语言的任何网络框架。

应用服务器的配置决定了并发请求的处理方式。Eclipse Jetty 9 运行时已经针对并发进行了配置,但如果您使用的是 Java 8 运行时,则由您的应用或框架配置并发。

当 App Engine 收到针对您的应用的 Web 请求时,会调用与网址对应的 servlet,如应用的部署描述符WEB-INF/ 目录中的 web.xml 文件)中所述。App Engine 使用 Java Servlet API 3.1 版将请求数据提供给 servlet,并接受响应数据。

以下示例 servlet 类在用户浏览器上显示简单消息。

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType("text/plain");
        resp.getWriter().println("Hello, world");
    }
}

配额和限制

App Engine 会随着流量的增加自动为您的应用分配资源。但是,这一过程受到以下限制的约束:

  • App Engine 会为低延时应用(应用响应请求的时间少于 1 秒)预留自动扩缩容量。高延时(例如,处理大量请求时,每个请求响应时间超过 1 秒)和高吞吐量的应用需要白银级、黄金级或白金级支持。若客户享有上述支持级别,则可联系其支持代表以申请更高的吞吐量限额。

  • 严重受 CPU 限制的应用还可能发生额外的延时,以便与同一服务器上的其他应用有效地共享资源。静态文件请求不受这些延迟限制的影响。

发送到应用的所有传入请求都会计入请求限额。为响应请求而发送的数据会计入传出带宽(计费)限额。

HTTP 和 HTTPS(安全)请求均计入请求传入带宽(计费)传出带宽(计费)限额。GCP Console 的“配额详情”页面还会分别列出安全请求次数安全传入带宽安全传出带宽的值,以供参考。仅 HTTPS 请求会计入这些值。如需了解详情,请参阅配额页面。

以下限制仅适用于请求处理程序的使用:

请求限制

  • 允许最大约 15KB 的请求标头。
  • 请求的总大小上限为约 32MB。
  • 转发到应用服务器时,所有 HTTP/2 请求都将转换为 HTTP/1.1 请求。
  • SSL 连接在负载平衡器处终止。来自负载平衡器的流量通过加密通道发送到实例,然后通过 HTTP 转发到应用服务器。您可以通过 X-Forwarded-Proto 标头了解原始请求是 HTTP 还是 HTTPS。

响应限制

  • 响应由 64k 存储块缓冲。
  • 响应大小无限制。
  • 响应时间限制为一小时。

不支持的 HTTP 请求

App Engine 柔性环境不支持以下功能:

  • 发送至后端服务的 HTTP/2 流量。
  • 直接访问实例的 HTTP 请求。

请求标头

传入 HTTP 请求包含客户端发送的 HTTP 标头。为保证安全,部分标头在到达应用前由中间代理进行清理或修改。

如需了解详情,请参阅请求标头参考

请求响应

App Engine 会使用请求对象和响应对象调用 servlet,然后等待 servlet 填充响应对象并返回。当 servlet 返回时,响应对象上的数据将发送给用户。

您生成的响应会受到一些限制,而且响应在返回客户端之前可以修改。

停用缓冲

默认情况下,来自 App Engine 的所有响应都使用 64k 存储块进行缓冲。在某些情况下,停用缓冲并将字节直接流式传输到客户端可能是合理的做法。当使用挂起 GET 或服务器发送的事件 (SSE) 时,通常会希望停用缓冲。如需停用缓冲,您可以将 X-Accel-Buffering 响应标头设置为 no

X-Accel-Buffering: no

强制 HTTPS 连接

出于安全原因,所有应用都应鼓励客户端使用 https 连接。对于给定页面或整个网域,您可以使用 Strict-Transport-Security 标头指示浏览器首选 https 而不是 http,例如:

Strict-Transport-Security: max-age=31536000; includeSubDomains