การสร้างบริการ gRPC ด้วย C#

1. ภาพรวม

gRPC เป็นเฟรมเวิร์กและชุดเครื่องมือสำหรับการเรียกกระบวนการทำงานจากระยะไกล (RPC) แบบกลางๆ และเป็นกลางทางภาษาซึ่งพัฒนาที่ Google เครื่องมือนี้จะช่วยให้คุณกำหนดบริการโดยใช้ Protocol Buffers ซึ่งเป็นชุดเครื่องมือและภาษาที่เรียงลำดับแบบไบนารีที่มีประสิทธิภาพเป็นพิเศษ จากนั้นจะให้คุณสร้างสตับเซิร์ฟเวอร์และไคลเอ็นต์ที่มีลักษณะเฉพาะจากคำจำกัดความของบริการในภาษาต่างๆ

ใน Codelab นี้ คุณจะได้ดูวิธีสร้างบริการ C# ที่แสดง API โดยใช้เฟรมเวิร์ก gRPC คุณโต้ตอบกับบริการนี้โดยใช้ไคลเอ็นต์คอนโซลที่เขียนด้วย C# ซึ่งใช้คำอธิบายบริการเดียวกันกับบริการ

สิ่งที่คุณจะได้เรียนรู้

  • ภาษาโปรโตคอลบัฟเฟอร์
  • วิธีใช้บริการ gRPC โดยใช้ C#
  • วิธีใช้งานไคลเอ็นต์ gRPC โดยใช้ C#
  • วิธีอัปเดตบริการ gRPC

สิ่งที่ต้องมี

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านเท่านั้น อ่านและทำแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้งาน Google Cloud Platform อย่างไร

มือใหม่ ระดับกลาง ผู้ชำนาญ

2. ดาวน์โหลดและสร้างตัวอย่าง gRPC C#

ดาวน์โหลดตัวอย่าง

ดาวน์โหลดที่เก็บตัวอย่าง 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 เพื่อสร้างโซลูชัน การดำเนินการนี้จะดาวน์โหลดทรัพยากร Dependency ทั้งหมดจาก NuGet แล้วคอมไพล์แอปพลิเคชัน

สุดท้าย คุณควรเห็นข้อความ Build succeeded ในเอาต์พุตของคอนโซล Visual Studio

3. สำรวจตัวอย่าง Greeter

Greeter คือตัวอย่าง gRPC แบบง่ายที่ไคลเอ็นต์ส่งคำขอที่มีชื่อ และเซิร์ฟเวอร์จะตอบกลับด้วยข้อความตามด้วยชื่อ มีโปรเจ็กต์ Greeter ที่มีคำจำกัดความของบริการทั่วไป (ไฟล์โปรโต) ที่ไคลเอ็นต์และเซิร์ฟเวอร์ใช้อยู่

โปรเจ็กต์ Geeter

ซึ่งเป็นโปรเจ็กต์ทั่วไปที่แชร์ระหว่างไคลเอ็นต์กับเซิร์ฟเวอร์ โดยมี greeter.proto ซึ่งเป็นคำจำกัดความของบริการ gRPC ที่ไคลเอ็นต์และเซิร์ฟเวอร์ใช้ คำจำกัดความของบริการกำหนดบริการ gRPC ที่เรียกว่า GreetingService และมีเมธอด greeting ที่ใช้ HelloRequest เป็นอินพุตและ HelloResponse เป็นเอาต์พุต

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

ซึ่งเป็นวิธีแบบเดี่ยว (กล่าวคือ ไม่มีสตรีมมิง) ที่ไคลเอ็นต์จะส่งคำขอเดียวและรับการตอบกลับรายการเดียวจากเซิร์ฟเวอร์ คุณจะสำรวจเนื้อหาที่เหลือของ greeter.proto. ได้ โปรเจ็กต์นี้ยังมีสคริปต์ชื่อ generate_protos.bat ที่ใช้สร้างสตับไคลเอ็นต์และเซิร์ฟเวอร์จากไฟล์โปรโตได้ด้วย โปรเจ็กต์มีสตับไคลเอ็นต์และเซิร์ฟเวอร์ที่สร้างขึ้นแล้ว คุณจึงไม่จําเป็นต้องสร้างสตับเซิร์ฟเวอร์เอง อย่างไรก็ตาม หากคุณเปลี่ยนแปลงบางอย่างเกี่ยวกับไฟล์คำจำกัดความของบริการ คุณจะต้องเรียกใช้สคริปต์นี้เพื่อสร้างสตับใหม่

เซิร์ฟเวอร์ทักทาย

โปรเจ็กต์นี้สำหรับเซิร์ฟเวอร์ gRPC Program.cs คือจุดแรกเข้าหลักที่มีการติดตั้งใช้งานพอร์ตและเซิร์ฟเวอร์ ชั้นเรียนที่สำคัญคือ GreeterServiceImpl.cs มีเมธอด greeting ที่มีการติดตั้งใช้งานฟังก์ชันจริง

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

ไคลเอ็นต์คำทักทาย

นี่คือฝั่งไคลเอ็นต์ของบริการ gRPC และยังมี Program.cs เป็นจุดแรกเข้าอีกด้วย สร้างแชแนลเพื่อพูดคุยกับเซิร์ฟเวอร์ แล้วสร้างไคลเอ็นต์ด้วยแชแนลจากสตับที่สร้างขึ้น จากนั้นจะสร้างคำขอและส่งไปยังเซิร์ฟเวอร์โดยใช้สตับไคลเอ็นต์

4. เรียกใช้ตัวอย่าง Greeter

ขั้นแรก ให้เริ่มต้นเซิร์ฟเวอร์ Greeter เปิด Command Prompt แล้วไปยังโฟลเดอร์ bin > Debug ของเซิร์ฟเวอร์ Greeter และเรียกใช้ไฟล์สั่งการ คุณควรเห็นเซิร์ฟเวอร์ที่รอการเชื่อมต่ออยู่

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

จากนั้นให้เรียกใช้ Greeter Client ใน Command Prompt แยกต่างหาก และไปที่โฟลเดอร์ bin > Debug ของเซิร์ฟเวอร์ Greeter และเรียกใช้ไฟล์สั่งการ คุณควรเห็นไคลเอ็นต์ส่งคำขอและได้รับการตอบกลับจากเซิร์ฟเวอร์

> 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. อัปเดตตัวอย่าง Greeter

มาดูกันว่าการอัปเดตบริการของเราเป็นอย่างไร เพิ่มวิธีการใหม่ลงในบริการ gRPC ที่เรียกว่าลาก่อนที่ส่งคืนการลาแทนการทักทายลูกค้า

ขั้นตอนแรกคือการอัปเดตไฟล์การกำหนดบริการ greeter.proto.

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

ขั้นตอนต่อไป คุณจะต้องสร้างไคลเอ็นต์และสตับเซิร์ฟเวอร์ใหม่ เรียกใช้ generate_protos.bat ใน Command Prompt เมื่อสร้างสตับแล้ว คุณอาจต้องรีเฟรชโปรเจ็กต์ Visual Studio เพื่อรับโค้ดที่อัปเดต

ขั้นตอนสุดท้าย ให้อัปเดตโค้ดของไคลเอ็นต์และเซิร์ฟเวอร์เพื่อใช้ประโยชน์จากวิธีการใหม่นี้ ในบริการ ให้อัปเดต GreeterServiceImpl.cs และเพิ่มเมธอด goodbye ใหม่

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

ในไคลเอ็นต์ ให้เรียกใช้เมธอด 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 ด้วยเมธอด chat

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

สิ่งสำคัญก็คือข้อความแชททั้งขาเข้าและขาออกจะมีการทำเครื่องหมายด้วยคีย์เวิร์ด stream ซึ่งจะเปลี่ยนการเชื่อมต่อเป็นสตรีมแบบ 2 ทิศทาง โดยไคลเอ็นต์และเซิร์ฟเวอร์สามารถส่งข้อความถึงกันได้ทุกเมื่อ โซลูชันที่สมบูรณ์แบบสำหรับแอปพลิเคชันแชท

คุณสามารถสำรวจตัวอย่างเพิ่มเติม สร้าง และเรียกใช้เพื่อดูว่าตัวอย่างทำงานอย่างไรในรูปแบบแบบฝึกหัด

7. ยินดีด้วย

หัวข้อที่ครอบคลุม

  • ภาษาบัฟเฟอร์ของโปรโตคอล
  • วิธีใช้บริการ gRPC โดยใช้ C#
  • วิธีใช้งานไคลเอ็นต์ gRPC โดยใช้ C#
  • วิธีอัปเดตบริการ gRPC

ขั้นตอนถัดไป