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

1. ภาพรวม

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

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

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

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

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

โปรเจ็กต์ Greeter

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

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

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

เซิร์ฟเวอร์ Greeter

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

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

ไคลเอ็นต์ Greeter

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

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

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

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

จากนั้นเรียกใช้ไคลเอ็นต์ Greeter ในพรอมต์คำสั่งแยกต่างหาก ให้ไปที่โฟลเดอร์ 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. อัปเดตตัวอย่าง Greeter

มาดูกันว่าการอัปเดตบริการของเราเป็นอย่างไร เพิ่มเมธอดใหม่ลงในบริการ gRPC ของเราชื่อ "goodbye" ซึ่งจะแสดงผล "goodbye" แทน "hello" ให้กับไคลเอ็นต์

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

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

จากนั้นคุณต้องสร้างสตับไคลเอ็นต์และเซิร์ฟเวอร์ใหม่ เรียกใช้ generate_protos.bat ใน Command Prompt เมื่อสร้าง Stub แล้ว คุณอาจต้องรีเฟรชโปรเจ็กต์ 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

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