במדריך הזה מוסבר איך לבצע מיגרציה מ-App Engine Datastore אל Firestore במצב Datastore (שנקרא גם Datastore).
Firestore במצב Datastore דומה ל-App Engine Datastore, כי שניהם מתייחסים לאותו שירות Datastore בסיסי. ל-App Engine Datastore יש גישה רק דרך השירותים המצורפים מדור קודם של App Engine, אבל Firestore במצב Datastore הוא מוצר עצמאי Google Cloud שיש לו גישה דרך ספריות הלקוח של Cloud.
Firestore במצב Datastore מציע גם רמת שירות חינמית, ומאפשר לכם לנהל מסד נתונים מסוג NoSQL לאחסון מסמכים עם יכולת הרחבה גבוהה. בנוסף, הוא מעניק לכם גמישות לעבור בעתיד ל-Cloud Run או לפלטפורמה אחרת לאירוח אפליקציות Google Cloud .
לפני שמתחילים
כדאי לעיין במצבי מסד הנתונים השונים של Firestore כדי להבין מהו תרחיש השימוש הכי טוב לאפליקציה שלכם. שימו לב שהמדריך הזה מסביר איך לבצע מיגרציה למצב Datastore.
קוראים את התמחור והמכסות של Firestore במצב Datastore ומוודאים שכל סעיפיהם מובנים לכם.
Firestore במצב Datastore מציע שימוש בחינם עם מגבלות יומיות, ואחסון, קריאה וכתיבה ללא הגבלה לחשבונות בתשלום. בזמן שהאפליקציות של App Engine מושבתות, הן לא מקבלות תנועה ולכן לא יחויבו עליה. עם זאת, יכול להיות שיהיה חיוב על השימוש ב-Datastore אם הוא חורג ממכסת השימוש בחינם.
מפעילים את ממשקי ה-API הבאים בפרויקט שמכיל את האפליקציה:
- Artifact Registry API לאחסון ולניהול של ארטיפקטים של בנייה
- Cloud Build API כדי לפתח, לבדוק ולפרוס את האפליקציה באופן רציף.
Cloud Datastore API להעברה מ-Datastore בחבילה של App Engine ל-Firestore במצב Datastore.
יש לכם אפליקציית App Engine קיימת שמופעלת ב-Java 8 או 11 ומחוברת לשירות App Engine Datastore.
סקירה כללית על התהליך
באופן כללי, תהליך המעבר אל Firestore במצב Datastore מ-App Engine Datastore מורכב מהשלבים הבאים:
עדכון קובצי תצורה
מעדכנים את קובצי ההגדרות כדי להשתמש בספריות הלקוח של מצב Datastore.
מעדכנים את קובץ pom.xml של אפליקציית Java הבסיסית:
מסירים את הייבוא של App Engine SDK
appengine-api-1.0-sdk, כמו הייבוא הבא:<dependency> <groupId>com.google.appengine</groupId> <artifactId>appengine-api-1.0-sdk</artifactId> <version>2.0.4</version> </dependency>מוסיפים את לקוח
Datastore, כמו בדוגמה הבאה:<dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-datastore</artifactId> <!-- Use latest version --> <version>2.2.9</version> </dependency>
עדכון אפליקציית Java
עדכון הצהרות ייבוא
משנים את קובצי האפליקציה על ידי עדכון שורות הייבוא וההפעלה:
מסירים את הצהרות הייבוא הבאות של App Engine עבור App Engine Datastore
com.google.appengine.api.datastore.*:import com.google.appengine.api.datastore.DatastoreService; import com.google.appengine.api.datastore.DatastoreServiceFactory; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore.FetchOptions; import com.google.appengine.api.datastore.Query;מוסיפים את הייבוא הבא של Firestore במצב Datastore:
com.google.cloud.datastore.*:import com.google.cloud.Timestamp; import com.google.cloud.datastore.Datastore; import com.google.cloud.datastore.DatastoreOptions; import com.google.cloud.datastore.Entity; import com.google.cloud.datastore.Key; import com.google.cloud.datastore.FullEntity; import com.google.cloud.datastore.KeyFactory; import com.google.cloud.datastore.Query; import com.google.cloud.datastore.QueryResults; import com.google.cloud.datastore.StructuredQuery;
שינוי אופן הגישה של האפליקציה לשירות Datastore
Firestore במצב Datastore משתמש במחלקה Datastore במקום ב-DatastoreService. כדי לשנות את אופן הגישה של האפליקציה לשירות Datastore:
מחפשים את השורות שבהן נעשה שימוש בשיטה
DatastoreServiceFactory.getDatastoreService()כמו בדוגמה הבאה:// Initialize a client DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();מחליפים את
DatastoreServiceFactory.getDatastoreService()בשיטהDatastoreOptions.getDefaultInstance().getService(), כמו בדוגמה הבאה:// Initialize a client Datastore datastore = DatastoreOptions.getDefaultInstance().getService();
קבלת מפתח שנוצר על ידי Datastore
אחרי שמפעילים לקוח, יוצרים KeyFactory חדש של Kind המתאים כדי לקבל מפתח, ואז מבקשים מ-Datastore ליצור מפתח בשבילכם. כדי לקבל מפתח שנוצר על ידי Datastore:
יצירת
newKeyFactory.קוראים ל-method
setKind()כדי לקבוע אתkindשל הישות שמשמשת לסיווג שאילתות.מוסיפים את method
newKey()כדי ליצור מפתח Datastore://Prepare a new entity String kind = "visit"; Key key = datastore.allocateId(datastore.newKeyFactory().setKind(kind).newKey());
שינוי של יצירת ישויות
אחרי שמקבלים מפתח Datastore, יוצרים ישויות באמצעות השיטות הבאות:
משתמשים ב-
Entity.newBuilderומעבירים את המפתח שנוצר על ידי Datastore.מחפשים את השורות שבהן נעשה שימוש בקריאה לבונה
Entity, כמו בדוגמה הבאה:Entity visit = new Entity(kind);מחליפים את הקריאה לבונה
Entityבקריאה לבונהEntity.newBuilder, כמו בדוגמה הבאה:Entity visit = Entity.newBuilder(key);משתמשים בשיטה
setכדי להגדיר מאפיינים של ישויות.הפרמטר הראשון הוא הנכס המיועד, והפרמטר השני הוא הערך. במקרה של המאפיין
timestamp, הערך הואTimestampבמקוםInstant.toString().מחפשים את השורות שבהן נעשה שימוש בשיטה
setProperty, כמו בדוגמה הבאה:visit.setProperty("user_ip", userIp); visit.setProperty("timestamp", Instant.now().toString());מחליפים את השיטה
setPropertyבשיטהset, כמו בדוגמה הבאה:Entity visit = Entity.newBuilder(key).set("user_ip", userIp).set("timestamp", Timestamp.now()).build();
ביצוע העסקה
ספריית הלקוח של Firestore במצב Datastore משתמשת בשיטה add() כדי לבצע טרנזקציה. כדי לאשר את העסקה:
מחפשים שורות שמשתמשות בשיטה
put(), כמו השורה הבאה:// Save the entity datastore.put(visit);מחליפים את השיטה
put()בשיטהadd(), כמו בדוגמה הבאה:// Save the entity datastore.add(visit);
תוצאות השאילתה
שאילתות מאחזרות entities שעומדים בקבוצה מסוימת של תנאים. אפשר להשתמש בשיטות הבאות כדי להציג את התוצאות:
המתודה
OrderByמציגה את התוצאות בסדר עולה או יורד.השיטה
Limitמגבילה את המספר המקסימלי של תוצאות שאפשר לאחזר באמצעות באותו כלי בנייה.
השאילתה משתמשת בשיטת תבנית builder עם המשתנה kind. המשתנה kind מוגדר לערך Visit מהשלב קבלת מפתח שנוצר על ידי Datastore.
כדי לאחזר את 10 התוצאות הראשונות:
מחפשים שורות שמשתמשות בשיטה
addSort(), כמו השורה הבאה:// Retrieve the last 10 visits from the datastore, ordered by timestamp. Query query = new Query(kind).addSort("timestamp", Query.SortDirection.DESCENDING); List<Entity> results = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(10));מחליפים את השיטה
addSort()בשיטהsetOrderBy()ומוסיפים את השיטהsetLimit(), כמו בדוגמה הבאה:// Retrieve the last 10 visits from the datastore, ordered by timestamp. Query<Entity> query = Query.newEntityQueryBuilder() .setKind(kind) .setOrderBy(StructuredQuery.OrderBy.desc("timestamp")) .setLimit(10) .build();אחרי שהשאילתה מוכנה, מריצים את הקוד באמצעות
datastore.run()ואוספים את התוצאות באוסףQueryResultsEntity.אובייקט
QueryResultsשמתקבל הוא איטרטור עם פונקציהhasNext().בודקים אם יש קבוצת תוצאות עם אובייקט
nextלעיבוד, במקום להשתמש בלולאה ברשימת התוצאות. לדוגמה:QueryResults<Entity> results = datastore.run(query); resp.setContentType("text/plain"); PrintWriter out = resp.getWriter(); out.print("Last 10 visits:\n"); while (results.hasNext()) { Entity entity = results.next(); out.format( "Time: %s Addr: %s\n", entity.getTimestamp("timestamp"), entity.getString("user_ip")); }
דוגמאות
כדי לראות דוגמה להעברת אפליקציית Java 8 ל-Firestore במצב Datastore, אפשר להשוות בין דוגמת הקוד של App Engine Datastore ל-Java 8 לבין דוגמת הקוד של Firestore במצב Datastore ב-GitHub.
השלב הבא
- איך משתמשים ב-Firestore במצב Datastore
- פרטים נוספים זמינים במאמרי העזרה בנושא Firestore במצב Datastore.
- איך עוברים משירותים קודמים בחבילה ל-Java