خدمة المحتوى الديناميكي واستضافة الخدمات المصغرة باستخدام Cloud Run

قم بإقران Cloud Run مع Firebase Hosting لإنشاء المحتوى الديناميكي الخاص بك وتقديمه أو إنشاء واجهات برمجة تطبيقات REST كخدمات صغيرة.

عن طريق السحب تشغيل ، يمكنك نشر تطبيق تعبئتها في صورة الحاوية. بعد ذلك ، باستخدام Firebase Hosting ، يمكنك توجيه طلبات HTTPS لتشغيل تطبيقك المعبأ في حاويات.

  • سحابة تشغيل يدعم عدة لغات (بما في ذلك العودة، نود.جي إس، بيثون، وجافا)، مما يوفر لك المرونة لاستخدام لغة البرمجة والإطار الذي تختاره.
  • سحابة تشغيل تلقائيا وأفقيا جداول صورة الحاويات للتعامل مع الطلبات الواردة، ثم جداول أسفل عندما ينخفض الطلب.
  • كنت فقط دفع لوحدة المعالجة المركزية والذاكرة، والربط الشبكي المستهلكة خلال معالجة الطلب.

على سبيل المثال حالات الاستخدام وعينات للسحابة تشغيل متكامل مع Firebase استضافة، زيارة موقعنا على نظرة عامة serverless .


يوضح لك هذا الدليل كيفية:

  1. اكتب تطبيق Hello World بسيطًا
  2. قم بتعبئة أحد التطبيقات وتحميله إلى Container Registry
  3. انشر صورة الحاوية في Cloud Run
  4. طلبات الاستضافة المباشرة لتطبيقك المعبأ في حاويات

علما بأن لتحسين أداء خدمة المحتوى الديناميكي، يمكنك اختياريا الخاص بك لحن إعدادات ذاكرة التخزين المؤقت .

قبل ان تبدأ

قبل استخدام الغيمة تشغيل، تحتاج إلى إكمال بعض المهام الأولية، بما في ذلك إنشاء حساب الفواتير الغيمة، وتمكين API سحابة تشغيل، وتثبيت gcloud أداة سطر الأوامر.

قم بإعداد الفواتير لمشروعك

سحابة تشغيل تقدم الحصص استخدام حرة ، ولكن لا يزال يجب أن يكون لديك حساب سحابة الفواتير المرتبطة مشروع Firebase لاستخدام أو محاولة الخروج سحابة تشغيل.

قم بتمكين API وتثبيت SDK

  1. تمكين Cloud Run API في وحدة تحكم Google APIs:

    1. فتح صفحة API سحابة تشغيل في وحدة تحكم جوجل واجهات برمجة التطبيقات.

    2. عند المطالبة ، حدد مشروع Firebase الخاص بك.

    3. انقر فوق تمكين في صفحة API سحابة تشغيل.

  2. تركيب وتهيئة وSDK الغيمة.

  3. تأكد من أن gcloud تم تكوين أداة للمشروع الصحيح:

    gcloud config list

الخطوة 1: كتابة التطبيق عينة

علما بأن الغيمة تشغيل يدعم العديد من اللغات الأخرى ، بالإضافة إلى اللغات هو مبين في نموذج التالي.

يذهب

  1. إنشاء دليل جديد اسمه helloworld-go ، ثم قم بتغيير الدليل في ذلك:

    mkdir helloworld-go
    cd helloworld-go
  2. قم بإنشاء ملف يسمى جديدة 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 متغير البيئة.

اكتمل تطبيقك وأصبح جاهزًا ليتم وضعه في حاويات وتحميله إلى Container 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.16.4"
      }
    }
    
  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 متغير البيئة.

اكتمل تطبيقك وأصبح جاهزًا ليتم وضعه في حاويات وتحميله إلى Container 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 متغير البيئة.

اكتمل تطبيقك وأصبح جاهزًا ليتم وضعه في حاويات وتحميله إلى Container Registry.

جافا

  1. تثبيت جافا SE 8 أو في وقت لاحق JDK و الضفيرة .

    لاحظ أننا نحتاج فقط إلى القيام بذلك لإنشاء مشروع ويب جديد في الخطوة التالية. سيقوم Dockerfile ، الموصوف لاحقًا ، بتحميل جميع التبعيات في الحاوية.

  2. من وحدة التحكم ، أنشئ مشروع ويب فارغًا جديدًا باستخدام cURL ثم فك ضغط الأوامر:

    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 متغير البيئة.

اكتمل تطبيقك وأصبح جاهزًا ليتم وضعه في حاويات وتحميله إلى Container Registry.

الخطوة 2: التحوية التطبيق وتحميله على التسجيل الحاويات

  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:1.13 as builder
    
    # Create and change to the app directory.
    WORKDIR /app
    
    # Retrieve application dependencies using go modules.
    # Allows container builds to reuse downloaded dependencies.
    COPY go.* ./
    RUN go mod download
    
    # Copy local code to the container image.
    COPY . ./
    
    # Build the binary.
    # -mod=readonly ensures immutable go.mod and go.sum in container builds.
    RUN CGO_ENABLED=0 GOOS=linux 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. أنشئ صورة الحاوية الخاصة بك باستخدام Cloud Build عن طريق تشغيل الأمر التالي من الدليل الذي يحتوي على Dockerfile الخاص بك:

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

    بعد النجاح ، سترى رسالة نجاح تحتوي على اسم الصورة
    ( gcr.io/ PROJECT_ID /helloworld ).

يتم الآن تخزين صورة الحاوية في Container Registry ويمكن إعادة استخدامها إذا رغبت في ذلك.

لاحظ أنه، بدلا من سحابة إنشاء، يمكنك استخدام الإصدار المثبت محليا من عامل الميناء إلى بناء حاوية محليا .

الخطوة 3: نشر صورة الحاويات إلى سحابة تشغيل

  1. انشر باستخدام الأمر التالي:

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

  2. عندما يُطلب منك:

  3. انتظر بضع لحظات حتى يكتمل النشر. عند النجاح ، يعرض سطر الأوامر عنوان URL للخدمة. على سبيل المثال: https://helloworld- RANDOM_HASH -us-central1.a.run.app

  4. قم بزيارة الحاوية التي تم نشرها عن طريق فتح عنوان URL للخدمة في متصفح الويب.

الخطوة التالية ترشدك كيفية الوصول إلى هذا التطبيق حاويات من URL استضافة Firebase بحيث يمكن أن تولد المحتوى الديناميكي لموقعك استضافت Firebase.

الخطوة 4: طلبات الاستضافة المباشرة إلى التطبيق الخاص بالحاويات

مع قواعد إعادة الكتابة ، يمكنك توجيه الطلبات التي تتناسب مع أنماط محددة إلى وجهة واحدة.

يظهر المثال التالي كيفية توجيه جميع الطلبات من الصفحة /helloworld على موقعك استضافة لتشغيل بدء التشغيل والتشغيل الخاص بك helloworld المثال الحاوية.

  1. تأكد من أن:

    للحصول على إرشادات مفصلة حول تثبيت CLI وتهيئة المواقع، راجع دليل كتبت الحصول على استضافة .

  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)
        }
      } ]
    }
    
  4. انشر تكوين الاستضافة على موقعك عن طريق تشغيل الأمر التالي من جذر دليل مشروعك:

    firebase deploy

يمكن الآن الوصول إلى حاويتك عبر عناوين URL التالية:

  • نطاقات Firebase الفرعية الخاصة بك:
    PROJECT_ID .web.app/ و PROJECT_ID .firebaseapp.com/

  • أي متصلة المجالات المخصصة :
    CUSTOM_DOMAIN /

زيارة صفحة تكوين استضافة ل مزيد من التفاصيل حول قواعد إعادة الكتابة . يمكنك أيضا التعرف على ترتيب الأولويات للاستجابات لمختلف تكوينات الاستضافة.

اختبر محليًا

أثناء التطوير ، يمكنك تشغيل صورة الحاوية واختبارها محليًا. للحصول على التعليمات المفصلة، زيارة ثائق الغيمة تشغيل .

الخطوات التالية