טיפול בסשנים באמצעות Firestore

במדריך הזה מוסבר איך לנהל סשנים ב-Cloud Run.

באפליקציות רבות נדרש ניהול סשנים לצורך אימות והעדפות משתמש. ‫Jetty framework מגיע עם הטמעה מבוססת-זיכרון לביצוע הפונקציה הזו. עם זאת, ההטמעה הזו לא מתאימה לאפליקציה שאפשר להציג מכמה מופעים, כי יכול להיות שהסשן שמתועד במופע אחד יהיה שונה ממופעים אחרים. במדריך הזה מוסבר איך לנהל סשנים ב-Cloud Run.

מטרות

  • כותבים את האפליקציה.
  • מריצים את האפליקציה באופן מקומי.
  • פורסים את האפליקציה ב-Cloud Run.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Firestore API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  8. במסוף Google Cloud , פותחים את האפליקציה ב-Cloud Shell.

    כניסה ל-Cloud Shell

    ‫Cloud Shell מספק גישה למשאבי הענן דרך שורת הפקודה ישירות מהדפדפן. פותחים את Cloud Shell בדפדפן ולוחצים על המשך כדי להוריד את קוד הדוגמה ולעבור לספריית האפליקציה.

  9. ב-Cloud Shell, מגדירים את ה-CLI של gcloud לשימוש בפרויקט החדש Google Cloud :
    # Configure gcloud for your project
    gcloud config set project YOUR_PROJECT_ID
    
  10. מעדכנים את Maven כדי להשתמש ב-Java 11 כברירת מחדל:
    sudo update-alternatives --config java
    
    כשמופיעה בקשה, מזינים את המספר כדי לבחור ב-Java 11. רושמים את הנתיב שמופיע לגרסה הזו.
  11. מייצאים את הנתיב שהעתקתם בשלב הקודם כמשתנה סביבה:
    export JAVA_HOME=java-11-path
    

‫Gemini בדפדפן

האפליקציה הזו מציגה ברכות בשפות שונות לכל משתמש. משתמשים חוזרים תמיד מקבלים את פניית המערכת באותה שפה.

כמה חלונות של אפליקציות שמוצגת בהם ברכה בשפות שונות.

לפני שהאפליקציה יכולה לאחסן העדפות של משתמש, צריך לאחסן מידע על המשתמש הנוכחי בסשן. אפליקציית הדוגמה הזו משתמשת ב-WebFilter כדי לאחזר ולעדכן נתוני סשנים ב-Firestore.

@Override
public void init(FilterConfig config) throws ServletException {
  // Initialize local copy of datastore session variables.
  firestore = FirestoreOptions.getDefaultInstance().getService();
  sessions = firestore.collection("sessions");

  try {
    // Delete all sessions unmodified for over two days.
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date());
    cal.add(Calendar.HOUR, -48);
    Date twoDaysAgo = Calendar.getInstance().getTime();
    QuerySnapshot sessionDocs =
        sessions.whereLessThan("lastModified", dtf.format(twoDaysAgo)).get().get();
    for (QueryDocumentSnapshot snapshot : sessionDocs.getDocuments()) {
      snapshot.getReference().delete();
    }
  } catch (InterruptedException | ExecutionException e) {
    throw new ServletException("Exception initializing FirestoreSessionFilter.", e);
  }
}

בתרשים הבא מוצג הסבר על האופן שבו Firestore מטפל בסשנים באפליקציית Cloud Run.

תרשים של הארכיטקטורה: משתמש, Cloud Run, ‏ Firestore.

HttpServletRequest משתמש בקובץ Cookie כדי לאחסן מזהה ייחודי של הסשן המקומי, שתואם למסמך ב-Firestore עם פרטי הסשן.

מחיקת סשנים

ב-Firestore לא נמחקים סשנים ישנים או סשנים שתוקפם פג. אתם יכולים למחוק נתוני סשן במסוףGoogle Cloud או להטמיע אסטרטגיה למחיקה אוטומטית. אם אתם משתמשים בפתרונות אחסון לסשנים כמו Memcache או Redis, סשנים שפג תוקפם נמחקים אוטומטית.

הרצה מקומית

  1. מפעילים את שרת ה-HTTP:

    mvn jetty:run
    
  2. צפייה באפליקציה בדפדפן אינטרנט:

    Cloud Shell

    בסרגל הכלים של Cloud Shell, לוחצים על Web preview (תצוגה מקדימה של אתר) תצוגה מקדימה של אתר ובוחרים באפשרות Preview on port 8080 (תצוגה מקדימה ביציאה 8080).

    מכונה מקומית

    בדפדפן, עוברים אל http://localhost:8080

    מוצג אחד מחמשת המשפטים הבאים: Hello World,‏ Hallo Welt,‏ Hola mundo,‏ Salut le Monde או Ciao Mondo. השפה משתנה אם פותחים את הדף בדפדפן אחר או במצב פרטי. אפשר לראות ולערוך את נתוני הסשן בGoogle Cloud מסוף.

    פעילויות ב-Firestore במסוף Google Cloud .

  3. כדי לעצור את שרת ה-HTTP, בחלון הטרמינל לוחצים על Control+C.

פריסה והפעלה ב-Cloud Run

אתם יכולים להשתמש ב-Cloud Run כדי ליצור ולפרוס אפליקציה שפועלת בצורה מהימנה בעומס כבד ועם כמויות גדולות של נתונים.

  1. בחלון ה-Terminal, יוצרים ומפעילים תמונה של הקוד ב-Google Container Registry (GCR) באמצעות הפלאגין Jib Maven.

    ‪mvn clean package jib:build

  2. פורסים את האפליקציה ב-Cloud Run:

       gcloud beta run deploy session-handling --image gcr.io/MY_PROJECT/session-handling 
    --platform managed --region us-central1 --memory 512M

    מחליפים את MY_PROJECT במזהה שלGoogle Cloud הפרויקט שיצרתם. כדי לראות איך נתוני הסשן נשמרים בין טעינות דפים, נכנסים לכתובת ה-URL שמוחזרת מהפקודה הזו.

ניפוי באגים באפליקציה

אם אתם לא מצליחים להתחבר לאפליקציית Cloud Run, כדאי לבדוק את הדברים הבאים:

  1. בודקים שהפקודות gcloud deploy הושלמו בהצלחה ולא הוחזרו שגיאות. אם היו שגיאות (לדוגמה, message=Build failed), תקנו אותן ונסו לפרוס את אפליקציית Cloud Run שוב.
  2. נכנסים לדף Logs Explorer במסוף Google Cloud .

    כניסה לדף Logs Explorer

    1. בתפריט הנפתח Recently selected resources, לוחצים על Cloud Run Application ואז על All module_id. מוצגת רשימה של בקשות מהביקור שלכם באפליקציה. אם לא מוצגת רשימה של בקשות, צריך לוודא שבחרתם באפשרות All module_id מהתפריט הנפתח. אם הודעות השגיאה מודפסות בGoogle Cloud מסוף, צריך לוודא שהקוד של האפליקציה זהה לקוד שבקטע על כתיבת אפליקציית האינטרנט.

    2. מוודאים ש-Firestore API מופעל.

הסרת המשאבים

מחיקת הפרויקט

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת מופע Cloud Run

מוחקים את השירות מ-Cloud Run.

  • נכנסים לדף Services במסוף Google Cloud של Cloud Run.

    כניסה לדף Services

  • בוחרים את השירות שרוצים למחוק.
  • לוחצים על מחיקה כדי למחוק את השירות.

המאמרים הבאים