פיתוח אפליקציות שרת-לקוח באמצעות gRPC

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

grpc.io הוא האתר הרשמי של פרויקט gRPC. מידע נוסף על אופן הפעולה של gRPC זמין במאמר מה זה gRPC? ומושגים ב-gRPC. כדי ללמוד איך להשתמש ב-gRPC באפליקציית Android, אפשר לעיין בדוגמה Hello World במאמר מדריך למתחילים ב-gRPC Android Java. יש גם כמה דוגמאות נוספות ל-gRPC Android ב-GitHub.

תכונות

התקשרות לפרוצדורה הופכת את התהליך לפשוט
מכיוון שמדובר ב-RPC, מודל התכנות הוא קריאות לפרוצדורות: היבט הרשת של הטכנולוגיה מופשט מקוד האפליקציה, כך שזה נראה כאילו מדובר בקריאה רגילה לפונקציה בתוך התהליך. האינטראקציה בין הלקוח לשרת לא תוגבל על ידי הסמנטיקה של שיטות משאבי HTTP (כמו GET,‏ PUT,‏ POST ו-DELETE). בהשוואה ל-REST API, ההטמעה שלכם נראית טבעית יותר, בלי הצורך בטיפול במטא-נתונים של פרוטוקול HTTP.
שידור יעיל ברשת באמצעות HTTP/2
העברת נתונים ממכשירים ניידים לשרת backend יכולה להיות תהליך שדורש הרבה משאבים. שימוש בפרוטוקול HTTP/1.1 הסטנדרטי, חיבורים תכופים ממכשיר נייד לשירות בענן עלולים לרוקן את הסוללה, להגדיל את זמן האחזור ולמנוע מאפליקציות אחרות להתחבר. כברירת מחדל, gRPC פועל על HTTP/2, שכולל סטרימינג דו-כיווני, בקרת זרימה, דחיסת כותרות ויכולת ריבוב של בקשות על חיבור TCP/IP יחיד. התוצאה היא ש-gRPC יכול להפחית את השימוש במשאבים, וכך לקצר את זמני התגובה בין האפליקציה לבין השירותים שפועלים בענן, להפחית את השימוש ברשת ולהאריך את חיי הסוללה של לקוח שפועל במכשירים ניידים.
תמיכה מובנית בהחלפת נתונים של סטרימינג
gRPC תוכנן מראש עם תמיכה בסטרימינג דו-כיווני מלא של HTTP/2. סטרימינג מאפשר לבקשה ולתגובה להיות בגודל גדול באופן שרירותי, כמו פעולות שדורשות העלאה או הורדה של כמות גדולה של מידע. בסטרימינג, הלקוח והשרת יכולים לקרוא ולכתוב הודעות בו-זמנית ולהירשם זה לזה בלי לעקוב אחרי מזהי משאבים. כך ההטמעה של האפליקציה תהיה גמישה יותר.
שילוב חלק עם Protocol Buffer
gRPC משתמש ב-Protocol Buffers ‏ (Protobuf) כשיטת הסריאליזציה/הדה-סריאליזציה שלו עם תוסף codegen שעבר אופטימיזציה ל-Android ‏(Protobuf Java Lite). בהשוואה לפורמט מבוסס-טקסט (כמו JSON), ‏ Protobuf מציע חילופי נתונים יעילים יותר מבחינת מהירות המרת הנתונים וגודל הקוד, ולכן הוא מתאים יותר לשימוש בסביבות ניידות. בנוסף, התחביר התמציתי של הגדרות ההודעות והשירותים ב-Protobuf מקל מאוד על הגדרת מודל נתונים ופרוטוקולים של אפליקציות עבור האפליקציה שלכם.

סקירה כללית של השימוש

כדי להשתמש ב-gRPC באפליקציות ל-Android, צריך לבצע ארבעה שלבים, כמו שמוסבר במדריך gRPC Basics - Android Java.

  • הגדרת שירותי RPC באמצעות Protocol Buffers ויצירת ממשקי לקוח gRPC.
  • יוצרים ערוץ שמשמש כאמצעי לתקשורת בין לקוח לשרת באמצעות קריאות RPC.
  • יוצרים Stub של לקוח כנקודת הכניסה להפעלת קריאות RPC מצד הלקוח.
  • ביצוע קריאות RPC לשרת מרוחק כמו בביצוע קריאות לפרוצדורה מקומית.

לצורך הדגמה, הבייטים מועברים כטקסט פשוט בדוגמה שמופיעה כאן. עם זאת, האפליקציה שלכם צריכה תמיד להצפין נתונים ברשת בסביבת ייצור.‫gRPC מספקת תמיכה בהצפנת SSL/TLS וגם בהחלפת אסימוני OAuth (OAuth2 עם שירותי Google) לצורך אימות. פרטים נוספים זמינים במאמרים בנושא TLS ב-Android ושימוש ב-OAuth2.

תחבורה

פרוטוקול gRPC מספק שתי אפשרויות להטמעת Transport ללקוחות Android:‏ OkHttp ו-Cronet.

בחירת אמצעי תחבורה (מתקדם)

  • OkHttp
    ‫OkHttp היא חבילת פרוטוקולים קלה שנועדה לשימוש בנייד.
    זוהי שיטת התעבורה שמוגדרת כברירת מחדל ב-gRPC להפעלה בסביבת Android. כדי להשתמש ב-OkHttp כהעברת gRPC באפליקציה, צריך ליצור את הערוץ באמצעות AndroidChannelBuilder, שעוטף את OkHttpChannelBuilder וירשום ניטור רשת במערכת ההפעלה Android כדי להגיב במהירות לשינויים ברשת. דוגמה לשימוש אפשר למצוא ב-gRPC-Java AndroidChannelBuilder.
  • ‫Cronet (ניסיוני)
    Cronet היא חבילת רשת של Chromium שמוצגת כספרייה לנייד. הוא מציע תמיכה חזקה בנטוורקינג עם פרוטוקול QUIC מתקדם, שיכול להיות יעיל במיוחד בסביבות רשת לא אמינות. מידע נוסף על Cronet זמין במאמר ביצוע פעולות ברשת באמצעות Cronet. כדי להשתמש ב-Cronet כהעברה של gRPC באפליקציה, צריך ליצור את הערוץ באמצעות CronetChannelBuilder. דוגמה לשימוש מופיעה במאמר gRPC-Java Cronet Transport.

באופן כללי, אנחנו ממליצים לאפליקציות שמטרגטות גרסאות עדכניות של SDK להשתמש ב-Cronet, כי הוא מציע מחסנית רשת חזקה יותר. החיסרון בשימוש ב-Cronet הוא העלייה בגודל קובץ ה-APK, כי הוספת התלות הבינארית של Cronet תוסיף יותר מ-1MB לגודל האפליקציה, לעומת כ-100KB ב-OkHttp. החל מ-GMSCore גרסה 10, אפשר לטעון עותק עדכני של Cronet מ-Google Play Services. יכול להיות שגודל ה-APK כבר לא יהיה בעיה, אבל במכשירים שלא מותקנת בהם הגרסה האחרונה של GMSCore, יכול להיות שעדיין עדיף להשתמש ב-OkHttp.