中文

通过 Google Cloud Functions 释放无服务器计算的潜力。本指南深入探讨 HTTP 触发器,为全球开发者提供构建可扩展、事件驱动型应用的知识。

Google Cloud Functions:HTTP 触发器综合指南

Google Cloud Functions (GCF) 是一个无服务器执行环境,让您能够构建和连接云服务。借助 Cloud Functions,您可以编写简单的、单一用途的函数,这些函数与云基础设施和服务发出的事件关联。当您所关注的事件发生时,您的函数就会执行。这种方法使您能够开发事件驱动型应用程序,而无需管理服务器或运行时。

触发 Cloud Function 最常见的方式之一是通过 HTTP 请求。本指南将深入探讨 Google Cloud Functions 中的 HTTP 触发器世界,为您提供构建强大、可扩展且经济高效的应用程序的知识。

什么是 HTTP 触发器?

HTTP 触发器允许您响应 HTTP 请求来执行您的 Cloud Function。本质上,当 HTTP 请求发送到特定 URL 时,Google Cloud Functions 将自动执行关联的函数。这使得 HTTP 触发器非常适合构建 API、Webhook 和事件驱动的 Web 应用程序。

使用 HTTP 触发器的主要优势:

创建带 HTTP 触发器的 Cloud Function

让我们逐步了解如何创建一个带有 HTTP 触发器的简单 Cloud Function。我们将创建一个响应“Hello, World!”消息的函数。通过简单地修改输出字符串,此示例可以适应各种全球语言环境。

先决条件:

步骤:

  1. 创建新项目(如果您还没有):

    如果您还没有 GCP 项目,请在 Google Cloud Console 中创建一个。

  2. 启用 Cloud Functions API:

    在 Cloud 控制台中,导航到 Cloud Functions API 并启用它。

  3. 创建函数目录:

    为您的 Cloud Function 创建一个新目录。例如:

    mkdir hello-http
    cd hello-http
  4. 编写函数代码:

    创建一个名为 `main.py`(或 Node.js 的 `index.js`)的文件,其中包含以下代码:

    Python (main.py):

    def hello_http(request):
        """HTTP Cloud Function.
        Args:
            request (flask.Request): HTTP 请求对象。
            
        Returns:
            响应文本或任何可以通过 `make_response` 转换为 Response 对象的
            值集合 。
        """
        request_json = request.get_json(silent=True)
        request_args = request.args
    
        if request_json and 'name' in request_json:
            name = request_json['name']
        elif request_args and 'name' in request_args:
            name = request_args['name']
        else:
            name = 'World'
        return f'Hello, {name}!'

    Node.js (index.js):

    exports.helloHttp = (req, res) => {
      let name = 'World';
      if (req.body.name) {
        name = req.body.name;
      } else if (req.query.name) {
        name = req.query.name;
      }
      res.status(200).send(`Hello, ${name}!`);
    };
  5. 创建依赖文件(仅限 Python):

    如果您使用 Python,请创建一个名为 `requirements.txt` 的文件,并添加您的函数所需的任何依赖项。对于此示例,这不是严格必需的,但包含一个是个好习惯。如果您没有任何依赖项,可以将其留空。

  6. 部署函数:

    使用 `gcloud functions deploy` 命令部署您的函数。将 `YOUR_FUNCTION_NAME` 替换为您希望为函数指定的名称。

    Python:

    gcloud functions deploy YOUR_FUNCTION_NAME \
        --runtime python39 \
        --trigger-http \
        --allow-unauthenticated

    Node.js:

    gcloud functions deploy YOUR_FUNCTION_NAME \
        --runtime nodejs16 \
        --trigger-http \
        --allow-unauthenticated

    参数说明:

    • `YOUR_FUNCTION_NAME`:您希望为 Cloud Function 指定的名称。
    • `--runtime`:您的函数的运行时环境(例如,`python39`、`nodejs16`)。
    • `--trigger-http`:指定函数应由 HTTP 请求触发。
    • `--allow-unauthenticated`:允许任何人无需身份验证即可调用函数。警告:在生产环境中启用此功能时请务必谨慎!考虑实施适当的身份验证和授权。
  7. 测试函数:

    部署后,`gcloud` 命令将输出您函数的 URL。然后您可以使用 `curl` 或 Postman 等工具向该 URL 发送 HTTP 请求来测试它。

    curl YOUR_FUNCTION_URL

    您应该在响应中看到“Hello, World!”消息。您也可以将名称作为查询参数传递:

    curl "YOUR_FUNCTION_URL?name=YourName"

    这将返回“Hello, YourName!”

理解 HTTP 请求和响应

当 Cloud Function 由 HTTP 请求触发时,它会收到一个包含请求信息的对象。此对象通常包括:

您的函数随后应返回一个 HTTP 响应,其中包含:

示例:处理不同的 HTTP 方法

以下是如何在您的 Cloud Function 中处理不同 HTTP 方法的示例:

Python (main.py):

from flask import escape

def http_method(request):
    """响应任何 HTTP 请求。
    Args:
        request (flask.Request): HTTP 请求对象。
    Returns:
        响应文本或任何可以通过 `make_response` 转换为 Response 对象的
        值集合 。
    """
    if request.method == 'GET':
        return '这是一个 GET 请求!'
    elif request.method == 'POST':
        request_json = request.get_json(silent=True)
        if request_json and 'message' in request_json:
            message = escape(request_json['message'])
            return f'这是一个带有消息的 POST 请求:{message}'
        else:
            return '这是一个不带消息的 POST 请求。'
    else:
        return '不支持的 HTTP 方法。', 405

Node.js (index.js):

exports.httpMethod = (req, res) => {
  switch (req.method) {
    case 'GET':
      res.status(200).send('这是一个 GET 请求!');
      break;
    case 'POST':
      if (req.body.message) {
        const message = req.body.message;
        res.status(200).send(`这是一个带有消息的 POST 请求:${message}`);
      } else {
        res.status(200).send('这是一个不带消息的 POST 请求。');
      }
      break;
    default:
      res.status(405).send('不支持的 HTTP 方法!');
      break;
  }
};

请记住使用 `gcloud functions deploy` 命令部署更新后的函数。

保护您的 HTTP 触发器

在使用 HTTP 触发器时,安全性至关重要,尤其是在处理敏感数据或关键操作时。以下是一些关键的安全注意事项:

身份验证和授权

默认情况下,如果您使用 `--allow-unauthenticated`,则由 HTTP 触发的 Cloud Functions 是可公开访问的。在大多数生产场景中,您会希望限制对授权用户或服务的访问。Google Cloud 提供了多种身份验证和授权选项:

输入验证

始终验证您的 Cloud Function 接收到的输入数据,以防止 SQL 注入或跨站脚本 (XSS) 等安全漏洞。使用适当的清理和转义技术来防范恶意输入。

HTTPS

确保您的 Cloud Function 只能通过 HTTPS 访问,以加密客户端与函数之间的通信。Google Cloud Functions 自动提供 HTTPS 端点。

速率限制

实施速率限制以防止滥用和拒绝服务 (DoS) 攻击。您可以使用 Google Cloud Armor 等服务来保护您的 Cloud Functions 免受过多流量的影响。

HTTP 触发器的用例

HTTP 触发器功能多样,可用于广泛的应用程序。以下是一些常见的用例:

跨不同行业的示例

高级技术

使用环境变量

环境变量允许您配置 Cloud Function,而无需在代码中硬编码敏感信息或配置值。您可以使用 `gcloud functions deploy` 命令或在 Google Cloud 控制台中设置环境变量。

gcloud functions deploy YOUR_FUNCTION_NAME \
    --runtime python39 \
    --trigger-http \
    --set-env-vars API_KEY=YOUR_API_KEY,DATABASE_URL=YOUR_DATABASE_URL

在您的代码中,您可以使用 `os.environ` 字典 (Python) 或 `process.env` 对象 (Node.js) 访问环境变量。

Python:

import os

def your_function(request):
    api_key = os.environ.get('API_KEY')
    # 在您的函数中使用 API 密钥
    return f'API Key: {api_key}'

Node.js:

exports.yourFunction = (req, res) => {
  const apiKey = process.env.API_KEY;
  # 在您的函数中使用 API 密钥
  res.status(200).send(`API Key: ${apiKey}`);
};

处理异步任务

对于长时间运行或计算密集型任务,最好使用异步处理以避免阻塞 HTTP 请求。您可以使用 Google Cloud Tasks 或 Cloud Pub/Sub 等服务将这些任务卸载到单独的队列中。

错误处理和日志记录

在您的 Cloud Functions 中实施强大的错误处理和日志记录,以快速识别和解决问题。使用 Google Cloud Logging 从您的函数中收集日志并监控其性能。

最佳实践

常见问题排查

结论

带有 HTTP 触发器的 Google Cloud Functions 提供了一种强大而灵活的方式来构建无服务器应用程序。通过理解本指南中讨论的概念和技术,您可以利用 Cloud Functions 的强大功能,为全球受众创建可扩展、经济高效且事件驱动的解决方案。拥抱无服务器革命,释放您的云应用程序的全部潜力!