פיתוח שירות gRPC עם C#

1. סקירה כללית

gRPC הוא framework וערכת כלים של Google לניהול מרחוק (RPC) ללא שפה. היא מאפשרת להגדיר שירות באמצעות מאגרי פרוטוקולים, ערכה של כלים ושפה בינאריים במיוחד לביצוע סריאליזציה. לאחר מכן ניתן ליצור stubs אידיומטיים של לקוח ושרת מהגדרת השירות במגוון שפות.

ב-Codelab הזה תלמדו איך לפתח שירות C# שחושף API באמצעות framework של gRPC. אפשר ליצור אינטראקציה עם השירות הזה באמצעות לקוח מסוף שנכתב ב-C# , עם תיאור של השירות זהה לזה של השירות.

מה תלמדו

  • השפה של מאגר הנתונים הזמני של הפרוטוקולים.
  • איך מטמיעים שירות gRPC באמצעות #C.
  • איך מטמיעים לקוח gRPC באמצעות #C.
  • איך מעדכנים שירות gRPC.

למה תזדקק?

איך תשתמשו במדריך הזה?

לקריאה בלבד לקרוא אותו ולבצע את התרגילים

איזה דירוג מגיע לחוויה שלך עם Google Cloud Platform?

מתחילים בינונית בקיאים

2. הורדה ויצירה של דוגמאות C# של gRPC

הורדת דוגמאות

מורידים את המאגר לדוגמה של gRPC C# כקובץ ZIP ומחלצים אותו.

לחלופין, אפשר לשכפל את מאגר ה-Git שלו.

git clone https://github.com/meteatamel/grpc-samples-dotnet.git

בכל מקרה, צריכה להיות לכם תיקייה grpc-samples-dotnet עם התוכן הבא:

d056832ff4ce0c8f.png

יוצרים את הפתרון

תיקיית האפליקציה לדוגמה מכילה את GrpcSamples.sln, פתרון של Visual Studio. לוחצים לחיצה כפולה כדי לפתוח את הפתרון ב-Visual Studio. אמור להופיע פתרון עם מספר פרויקטים.

61da9ddc86c08019.png

אנחנו נעבור על הפרויקטים בצורה מפורטת יותר בקטע הבא, אבל קודם כל, בואו נבנה את הפרויקט. כדי לפתח את הפתרון, צריך לעבור אל Build > Build Solution או Ctrl + Shift + B. הפעולה הזו תוריד את כל יחסי התלות מ-NuGet ואז תרכיב את האפליקציה.

בסוף אמורה להופיע הודעת Build succeeded בפלט של מסוף Visual Studio.

3. עיון בדוגמה של ' הודעת פתיחה'

Pereter הוא דגימה פשוטה של gRPC שבה לקוח שולח בקשה עם שם והשרת מגיב עם הודעה ואחריה השם. יש פרויקט Grareter שכולל את הגדרת השירות המשותפת (קובץ פרוטו) שעליה מבוססים הלקוח והשרת.

פרויקט הודעת הפתיחה

זהו הפרויקט המשותף בין הלקוח לשרת. יש לו greeter.proto, שהוא הגדרת השירות של gRPC שהלקוח והשרת משתמשים בו. הגדרת השירות מגדירה שירות gRPC בשם GreetingService, ויש לו שיטת greeting שמקבלת את HelloRequest כקלט ואת HelloResponse כפלט.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
}

זוהי שיטה אונרית (כלומר, ללא סטרימינג) שבה הלקוח שולח בקשה יחידה ומקבל תגובה אחת מהשרת. כדאי לעיין בשאר התכנים של greeter.proto. בפרויקט הזה יש גם סקריפט בשם generate_protos.bat שיכול לשמש ליצירת stubs של לקוח ושרת מקובץ ה-proto. הפרויקט כבר מכיל קטעים שנוצרו על ידי לקוח ושרת, כך שאתם לא צריכים ליצור אותם בעצמכם. עם זאת, אם משנים משהו בקובץ הגדרת השירות, צריך להריץ את הסקריפט הזה כדי ליצור מחדש את ה-stubs.

שרת קבלת הודעות

זהו הפרויקט של שרת gRPC. Program.cs היא נקודת הכניסה הראשית שבה מוגדרים ההטמעה של השקע והשרת. הכיתה החשובה היא GreeterServiceImpl.cs. יש לו method greeting שבה הפונקציונליות מוטמעת בפועל.

public override Task<HelloResponse> greeting(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Hello " + request.Name });
}

לקוח בונוס

זהו צד הלקוח של שירות gRPC. נקודת הכניסה שלו היא גם Program.cs. הוא יוצר ערוץ כדי לדבר עם השרת, ואז יוצר לקוח עם הערוץ מה-stub שנוצר. לאחר מכן הוא יוצר בקשה ושולח אותה לשרת באמצעות ה-stub של הלקוח.

4. הרצת דוגמת 'הודעת פתיחה'

קודם צריך להפעיל את שרת 'הודעות פתיחה'. פותחים שורת פקודה, עוברים לתיקייה bin > Debug של שרת Grareter ומריצים את קובץ ההפעלה. אתם אמורים לראות שהשרת מאזין.

> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...

לאחר מכן, הפעילו את לקוח קבלת הפנים. בשורת פקודה נפרדת, עוברים לתיקייה bin > Debug ב-Greeter Server ומריצים את קובץ ההפעלה. אתם אמורים לראות שהלקוח שולח את הבקשה ומקבל תגובה מהשרת.

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
Press any key to exit...

5. עדכון דוגמת העיצוב של הודעת הפתיחה

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

השלב הראשון הוא עדכון קובץ הגדרת השירות greeter.proto.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
    
    rpc goodbye(HelloRequest) returns (HelloResponse);
}

בשלב הבא צריך ליצור מחדש את ה-stubs של הלקוח והשרת. בשורת הפקודה, מריצים את generate_protos.bat. אחרי יצירת ה-stubs, יכול להיות שיהיה צורך לרענן את הפרויקטים ב-Visual Studio כדי לקבל את הקוד המעודכן.

לבסוף, מעדכנים את קוד הלקוח ואת קוד השרת כדי לנצל את השיטה החדשה. בשירות, מעדכנים את GreeterServiceImpl.cs ומוסיפים שיטת goodbye חדשה.

public override Task<HelloResponse> goodbye(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Goodbye " + request.Name });
}

בלקוח, מבצעים קריאה ל-method goodbye ב-Program.cs.

response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: " 
                       + response.Greeting);

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

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
GreeterClient received response: Goodbye Mete - on C#
Press any key to exit...

6. עיון בדוגמה של Chat

בפתרון יש גם פרויקטים של ChatServer ו-ChatWindowsClient. כפי שמרמז השם, זהו צמד לקוח ושרת לאפליקציית צ'אט פשוטה. לפרויקט Chat יש קובץ הגדרת שירות בשם chat.proto. היא מגדירה ChatService באמצעות method chat.

service ChatService {
 rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}

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

אתם יכולים לעיין לעומק בדוגמה, לפתח ולהריץ אותה כדי לראות איך היא עובדת כתרגיל.

7. מעולה!

אילו נושאים דיברנו?

  • שפת מאגר הנתונים הזמני של הפרוטוקולים.
  • איך מטמיעים שירות gRPC באמצעות #C.
  • איך מטמיעים לקוח gRPC באמצעות #C.
  • איך מעדכנים שירות gRPC.

השלבים הבאים