ارائه کردن محتوای پویا و میزبانی کردن ریزسرویس‌ها با Cloud Run

Cloud Run را با Firebase Hosting جفت کنید تا محتوای پویایتان را تولید و ارائه کنید یا میاناهای برنامه‌سازی کاربردی REST را به‌عنوان ریزسرویس بسازید.

بااستفاده از Cloud Run، می‌توانید برنامه‌ای را که در تصویر محفظه بسته‌بندی شده است مستقر کنید. سپس، بااستفاده از Firebase Hosting، می‌توانید درخواست‌های HTTPS را برای راه‌اندازی برنامه کانتینری‌شده‌تان هدایت کنید.

  • Cloud Run از چندین زبان (ازجمله Go،‏ Node.js،‏ Python، و Java) پشتیبانی می‌کند و به شما انعطاف‌پذیری لازم را برای استفاده از زبان برنامه‌نویسی و چارچوب انتخابی‌تان می‌دهد.
  • Cloud Run به‌طور خودکار و افقی تصویر محفظه شما را برای رسیدگی به درخواست‌های دریافتی مقیاس‌بندی می‌کند، سپس وقتی تقاضا کاهش می‌یابد، مقیاس را کاهش می‌دهد.
  • فقط برای CPU، حافظه، و شبکه‌سازی مصرف‌شده درطول رسیدگی به درخواست هزینه پرداخت می‌کنید.

برای مشاهده نمونه‌های استفاده و نمونه‌های Cloud Run ادغام‌شده با Firebase Hosting، به نمای کلی بدون سرور ما مراجعه کنید.


این راهنما به شما نشان می‌دهد که چگونه:

  1. نوشتن برنامه ساده Hello World
  2. کانتینرسازی برنامه و بارگذاری آن در Artifact Registry
  3. استقرار تصویر محفظه در Cloud Run
  4. هدایت کردن درخواست‌های Hosting به برنامه کانتینری‌شده

توجه داشته باشید که برای بهبود عملکرد ارائه محتوای پویا، می‌توانید به‌طور اختیاری تنظیمات حافظه نهان خود را تنظیم کنید.

قبل از شروع

قبل‌از استفاده از Cloud Run، باید چند کار اولیه را انجام دهید، ازجمله راه‌اندازی حساب Cloud Billing، فعال کردن میانای برنامه‌سازی کاربردی Cloud Run، و نصب ابزار خط فرمان gcloud.

راه‌اندازی صورت‌حساب برای پروژه

Cloud Run سهمیه استفاده رایگان ارائه می‌دهد، اما برای استفاده یا امتحان کردن Cloud Run، همچنان باید حساب Cloud Billing مرتبط با پروژه Firebase خود داشته باشید.

فعال کردن API و نصب کیت توسعه نرم‌افزار

  1. Cloud Run API را در کنسول Google APIs فعال کنید:

    1. Cloud Runصفحه API را در کنسول Google APIs باز کنید.

    2. وقتی درخواست شد، پروژه Firebase خود را انتخاب کنید.

    3. در صفحه میانای برنامه‌سازی کاربردی Cloud Run، روی فعال کردن کلیک کنید.

  2. نصب و مقداردهی اولیه کیت توسعه نرم‌افزار Cloud.

  3. بررسی کنید که ابزار gcloud برای پروژه صحیح پیکربندی شده باشد:

    gcloud config list

مرحله ۱: نوشتن برنامه نمونه

توجه داشته باشید که Cloud Run علاوه‌بر زبان‌های نشان‌داده‌شده در نمونه زیر، از بسیاری از زبان‌های دیگر پشتیبانی می‌کند.

رفتن

  1. دایرکتوری جدیدی به‌نام helloworld-go ایجاد کنید، سپس دایرکتوری را به آن تغییر دهید:

    mkdir helloworld-go
    cd helloworld-go
    1. فایل جدیدی به‌نام helloworld.go ایجاد کنید، سپس کد زیر را اضافه کنید:
    package main
    
    import (
    	"fmt"
    	"log"
    	"net/http"
    	"os"
    )
    
    func handler(w http.ResponseWriter, r *http.Request) {
    	log.Print("helloworld: received a request")
    	target := os.Getenv("TARGET")
    	if target == "" {
    		target = "World"
    	}
    	fmt.Fprintf(w, "Hello %s!\n", target)
    }
    
    func main() {
    	log.Print("helloworld: starting server...")
    
    	http.HandleFunc("/", handler)
    
    	port := os.Getenv("PORT")
    	if port == "" {
    		port = "8080"
    	}
    
    	log.Printf("helloworld: listening on port %s", port)
    	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
    }
    

    این کد یک سرور وب پایه ایجاد می‌کند که به درگاه تعریف‌شده توسط متغیر محیطی PORT گوش می‌دهد.

برنامه‌تان آماده است و آماده است تا در کانتینر قرار گیرد و در Artifact Registry بارگذاری شود.

Node.js

  1. دایرکتوری جدیدی به‌نام helloworld-nodejs ایجاد کنید، سپس دایرکتوری را به آن تغییر دهید:

    mkdir helloworld-nodejs
    cd helloworld-nodejs
  2. فایل package.json با محتوای زیر بسازید:

    {
      "name": "knative-serving-helloworld",
      "version": "1.0.0",
      "description": "Simple hello world sample in Node",
      "main": "index.js",
      "scripts": {
        "start": "node index.js"
      },
      "author": "",
      "license": "Apache-2.0",
      "dependencies": {
        "express": "^4.22.1"
      }
    }
    
  3. فایل جدیدی به‌نام index.js ایجاد کنید، سپس کد زیر را اضافه کنید:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
      console.log('Hello world received a request.');
    
      const target = process.env.TARGET || 'World';
      res.send(`Hello ${target}!\n`);
    });
    
    const port = process.env.PORT || 8080;
    app.listen(port, () => {
      console.log('Hello world listening on port', port);
    });
    

    این کد یک سرور وب پایه ایجاد می‌کند که به درگاه تعریف‌شده توسط متغیر محیطی PORT گوش می‌دهد.

برنامه‌تان آماده است و می‌تواند در کانتینر قرار گیرد و در Artifact Registry بارگذاری شود.

پایتون

  1. دایرکتوری جدیدی به‌نام helloworld-python ایجاد کنید، سپس دایرکتوری را به آن تغییر دهید:

    mkdir helloworld-python
    cd helloworld-python
  2. فایل جدیدی به‌نام app.py ایجاد کنید، سپس کد زیر را اضافه کنید:

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        target = os.environ.get('TARGET', 'World')
        return 'Hello {}!\n'.format(target)
    
    if __name__ == "__main__":
        app.run(debug=True,host='0.0.0.0',port=int(os.environ.get('PORT', 8080)))
    

    این کد یک سرور وب پایه ایجاد می‌کند که به درگاه تعریف‌شده توسط متغیر محیطی PORT گوش می‌دهد.

برنامه‌تان آماده است و آماده است تا در کانتینر قرار گیرد و در Artifact Registry بارگذاری شود.

جاوا

  1. Java SE 8 یا JDK جدیدتر و CURL را نصب کنید.

    توجه داشته باشید که فقط برای ایجاد پروژه وب جدید در مرحله بعد باید این کار را انجام دهیم. Dockerfile که بعداً شرح داده می‌شود، همه وابستگی‌ها را در محفظه بار می‌کند.

  2. از کنسول، پروژه وب خالی جدیدی بااستفاده از cURL ایجاد کنید، سپس فرمان‌های unzip:

    curl https://start.spring.io/starter.zip \
        -d dependencies=web \
        -d name=helloworld \
        -d artifactId=helloworld \
        -o helloworld.zip
    unzip helloworld.zip

    با این کار، پروژه SpringBoot ایجاد می‌شود.

  3. کلاس SpringBootApplication را در src/main/java/com/example/helloworld/HelloworldApplication.java با افزودن @RestController برای مدیریت نگاشت / به‌روز کنید و همچنین فیلد @Value را برای ارائه متغیر محیطی TARGET اضافه کنید:

    package com.example.helloworld;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    public class HelloworldApplication {
    
      @Value("${TARGET:World}")
      String target;
    
      @RestController
      class HelloworldController {
        @GetMapping("/")
        String hello() {
          return "Hello " + target + "!";
        }
      }
    
      public static void main(String[] args) {
        SpringApplication.run(HelloworldApplication.class, args);
      }
    }
    

    این کد یک سرور وب پایه ایجاد می‌کند که به درگاه تعریف‌شده توسط متغیر محیطی PORT گوش می‌دهد.

برنامه‌تان آماده است و می‌تواند در کانتینر قرار گیرد و در Artifact Registry بارگذاری شود.

مرحله ۲: برنامه‌ای را کانتینری کنید و آن را در Artifact Registry بارگذاری کنید

  1. با ایجاد فایل جدیدی به‌نام Dockerfile در همان دایرکتوری فایل‌های منبع، برنامه نمونه را کانتینری کنید. محتوای زیر را در فایل خود کپی کنید.

    رفتن

    # Use the official Golang image to create a build artifact.
    # This is based on Debian and sets the GOPATH to /go.
    FROM golang:latest AS builder
    
    ARG TARGETOS
    ARG TARGETARCH
    
    # Create and change to the app directory.
    WORKDIR /app
    
    # Copy local code to the container image.
    COPY . ./
    
    # Install dependencies and tidy up the go.mod and go.sum files.
    RUN go mod tidy
    
    # Build the binary.
    # -mod=readonly ensures immutable go.mod and go.sum in container builds.
    RUN CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -mod=readonly -v -o server
    
    # Use the official Alpine image for a lean production container.
    # https://hub.docker.com/_/alpine
    # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
    FROM alpine:3
    RUN apk add --no-cache ca-certificates
    
    # Copy the binary to the production image from the builder stage.
    COPY --from=builder /app/server /server
    
    # Run the web service on container startup.
    CMD ["/server"]
    

    Node.js

    # Use the official lightweight Node.js 12 image.
    # https://hub.docker.com/_/node
    FROM node:12-slim
    
    # Create and change to the app directory.
    WORKDIR /usr/src/app
    
    # Copy application dependency manifests to the container image.
    # A wildcard is used to ensure both package.json AND package-lock.json are copied.
    # Copying this separately prevents re-running npm install on every code change.
    COPY package*.json ./
    
    # Install production dependencies.
    RUN npm install --only=production
    
    # Copy local code to the container image.
    COPY . ./
    
    # Run the web service on container startup.
    CMD [ "npm", "start" ]
    

    پایتون

    # Use the official lightweight Python image.
    # https://hub.docker.com/_/python
    FROM python:3.7-slim
    
    # Allow statements and log messages to immediately appear in the Knative logs
    ENV PYTHONUNBUFFERED True
    
    # Copy local code to the container image.
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    # Install production dependencies.
    RUN pip install Flask gunicorn
    
    # Run the web service on container startup. Here we use the gunicorn
    # webserver, with one worker process and 8 threads.
    # For environments with multiple CPU cores, increase the number of workers
    # to be equal to the cores available.
    CMD exec gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 app:app
    

    جاوا

    # Use the official maven/Java 8 image to create a build artifact: https://hub.docker.com/_/maven
    FROM maven:3.5-jdk-8-alpine AS builder
    
    # Copy local code to the container image.
    WORKDIR /app
    COPY pom.xml .
    COPY src ./src
    
    # Build a release artifact.
    RUN mvn package -DskipTests
    
    # Use the Official OpenJDK image for a lean production stage of our multi-stage build.
    # https://hub.docker.com/_/openjdk
    # https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
    FROM openjdk:8-jre-alpine
    
    # Copy the jar to the production image from the builder stage.
    COPY --from=builder /app/target/helloworld-*.jar /helloworld.jar
    
    # Run the web service on container startup.
    CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/helloworld.jar"]
    

  2. با اجرای فرمان زیر از دایرکتوری حاوی Dockerfile، تصویر محفظه خود را بااستفاده از Cloud Build بسازید:

    gcloud builds submit --tag gcr.io/PROJECT_ID/helloworld

    درصورت موفقیت، پیام «موفقیت» حاوی نام تصویر را خواهید دید
    (gcr.io/PROJECT_ID/helloworld).

اکنون تصویر محفظه در Artifact Registry ذخیره شده است و درصورت تمایل می‌توانید دوباره از آن استفاده کنید.

توجه داشته باشید که به‌جای Cloud Build، می‌توانید از نسخه نصب‌شده محلی Docker برای ساختن کانتینر به‌صورت محلی استفاده کنید.

مرحله ۳: تصویر محفظه را در Cloud Run مستقر کنید

  1. بااستفاده از فرمان زیر پیاده‌سازی کنید:

    gcloud run deploy --image gcr.io/PROJECT_ID/helloworld

  2. وقتی درخواست شد:

  3. چند لحظه صبر کنید تا استقرار تکمیل شود. درصورت موفقیت، خط فرمان نشانی وب سرویس را نمایش می‌دهد. برای مثال: https://helloworld-RANDOM_HASH-us-central1.a.run.app

  4. با باز کردن نشانی وب سرویس در مرورگر وب، از محفظه مستقرشده‌تان بازدید کنید.

مرحله بعدی شما را راهنمایی می‌کند که چگونه ازطریق Firebase Hosting نشانی وب به این برنامه کانتینری‌شده دسترسی پیدا کنید تا بتواند محتوای پویا برای سایت میزبانی‌شده در Firebase شما تولید کند.

مرحله ۴: هدایت کردن درخواست‌های میزبانی به برنامه کانتینری‌شده

با قوانین بازنویسی، می‌توانید درخواست‌هایی را که با الگوهای خاصی مطابقت دارند به یک مقصد هدایت کنید.

مثال زیر نشان می‌دهد که چگونه همه درخواست‌ها را از صفحه /helloworld در سایت Hosting خود هدایت کنید تا راه‌اندازی و اجرای نمونه محفظه helloworld شما را راه‌اندازی کند.

  1. مطمئن شوید که:

    برای دستورالعمل‌های دقیق درباره نصب CLI و مقداردهی اولیه Hosting، به راهنمای شروع به کار برای Hosting مراجعه کنید.

  2. فایل firebase.json را باز کنید.

  3. پیکربندی rewrite زیر را به بخش hosting اضافه کنید:

    "hosting": {
      // ...
    
      // Add the "rewrites" attribute within "hosting"
      "rewrites": [ {
        "source": "/helloworld",
        "run": {
          "serviceId": "helloworld",  // "service name" (from when you deployed the container image)
          "region": "us-central1",    // optional (if omitted, default is us-central1)
          "pinTag": true              // optional (see note below)
        }
      } ]
    }
  4. با اجرای فرمان زیر از ریشه فهرست راهنمای پروژه، پیکربندی میزبانی وب را در سایتتان مستقر کنید:

    firebase deploy --only hosting

اکنون محفظه شما ازطریق نشانی‌های وب زیر قابل‌دسترسی است:

  • زیردامنه‌های Firebase شما:
    PROJECT_ID.web.app/ و PROJECT_ID.firebaseapp.com/

  • هرگونه دامنه سفارشی متصل‌شده:
    CUSTOM_DOMAIN/

برای جزئیات بیشتر درباره قوانین بازنویسی، به صفحه پیکربندی Hosting بروید. همچنین می‌توانید درباره ترتیب اولویت پاسخ‌ها برای پیکربندی‌های مختلف Hosting بیشتر بدانید.

آزمایش محلی

درطول توسعه، می‌توانید تصویر محفظه را به‌صورت محلی اجرا و آزمایش کنید. برای دستورالعمل‌های دقیق، به Cloud Run اسناد مراجعه کنید.

مراحل بعدی