将API Web与数据存储模拟器集成
#网络开发人员 #python #gcp #dataengineering

与Google Cloud平台(GCP)项目相关的高昂收入成本是我们在整个产品开发周期中始终牢记的。

为了减轻此问题,其中一种方法是使用模拟某些服务在本地模拟某些服务的模拟器,从而导致项目成本为零。

今天,我们将看到如何使用Docker运行官方数据存储模拟器,以及如何将其与Web API集成!

解决方案的开发

我们将通过笔记本电脑开发一个简短的解决方案,以演示数据存储模拟器的功能。为此,我们将开发一个非常简单的Web API,将与本地数据存储集成。

所有解决方案将通过Docker通过遏制开发。

Web API

开发负责用户寄存器的API。数据将在数据存储遏制中持续存在。

  • POST /users:在数据存储中保存用户;
  • GET /users:恢复所有通常的人在数据存储中持续存在;

还将开发一个dockerfile文件,以安装必要的库并攀登API开发服务器。

$ mkdir src
$ touch src/app.py
import os

from fastapi import FastAPI
from google.cloud import datastore
from pydantic import BaseModel


PROJECT_ID = os.getenv("DATASTORE_PROJECT_ID")

client = datastore.Client(PROJECT_ID)
app = FastAPI()


class User(BaseModel):
    name: str
    age: int


@app.post("/users", status_code=201)
def create_user(user: User):
    kind = "users"

    key = client.key(kind)
    user_entity = client.entity(key)
    user_entity.update(user)

    client.put(user_entity)
    return user


@app.get("/users")
def get_users():
    query = client.query(kind="users")
    users = list(query.fetch())

    return users
$ touch requirements.txt
fastapi==0.91.0
uvicorn==0.20.0
google-cloud-datastore==2.13.2
$touch web-api.Dockerfile
FROM python:3.11-alpine


WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir --upgrade -r requirements.txt

COPY . .

CMD exec python -m uvicorn app:app --reload --app-dir=./src --host=0.0.0.0 --port=8000

数据存储

数据存储容器的开发包括以下步骤:

  • 基于GCP模拟器的官方图像的自定义图像的开发;

- 启动DatoStore Web服务器;

$ touch datastore.Dockerfile
FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators


WORKDIR /datastore

CMD exec gcloud beta emulators datastore start --project my-local-project --host-port 0.0.0.0

开发遏制

最后,我们将开发一个docker-compose文件,该文件将根据我们的图像来协调构造的遏制。

注意:请注意,必须配置数据存储环境在API容器中有所不同。这对于DataStore SDK直接将请求发送到本地封存是必要的,而不是针对GCP服务器。

$ touch docker-compose.yml
version: '3.9'

services:
  web-api:
    build:
      dockerfile: ./web-api.Dockerfile
    environment:
      DATASTORE_DATASET: my-local-dataset
      DATASTORE_EMULATOR_HOST: datastore:8081
      DATASTORE_EMULATOR_HOST_PATH: datastore:8081/datastore
      DATASTORE_HOST: http://datastore:8081
      DATASTORE_PROJECT_ID: my-local-project
    volumes:
      - ./:/app
    ports:
      - 8000:8000

  datastore:
    build:
      dockerfile: ./datastore.Dockerfile
    ports:
      - 8081:8081
$ docker compose up -d
$ docker compose ps

让测试!

我们将根据我们的API的请求来完成。前两个将是发布请求,该请求将在数据存储中保存两个用户,最后一个将是一个请求,该请求将恢复数据库中的两个常规。

$ curl -X 'POST' \
  'http://localhost:8000/users' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "John",
  "age": 20
}'

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    57  100    24  100    33     54     75 --:--:-- --:--:-- --:--:--   130
{"name":"John","age":20}
$ curl -X 'POST' \
  'http://localhost:8000/users' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "name": "Mary",
  "age": 18
}'

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    57  100    24  100    33   1411   1941 --:--:-- --:--:-- --:--:--  3352
{"name":"Mary","age":18}
$ curl -X 'GET' \
  'http://localhost:8000/users' \
  -H 'accept: application/json'

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    51  100    51    0     0    850      0 --:--:-- --:--:-- --:--:--   850
[{"name":"John","age":20},{"name":"Mary","age":18}]

最终考虑

在产品开发周期中,使用Google Cloud Platform模拟器可能是一种有趣的方法。有了它们,我们可以根据需要进行多次测试,而不会导致项目收入的高成本,因为Google Cloud库中的所有请求都将在本地向云服务器的投资提供。

感谢您陪伴我到这里ð。在Prost!

反思