C# দিয়ে একটি gRPC পরিষেবা তৈরি করা

১. সংক্ষিপ্ত বিবরণ

gRPC হলো গুগলে তৈরি একটি ভাষা-নিরপেক্ষ, প্ল্যাটফর্ম-নিরপেক্ষ রিমোট প্রসিডিউর কল (RPC) ফ্রেমওয়ার্ক এবং টুলসেট। এটি আপনাকে প্রোটোকল বাফার্স (Protocol Buffers) ব্যবহার করে একটি সার্ভিস সংজ্ঞায়িত করতে দেয়, যা একটি অত্যন্ত শক্তিশালী বাইনারি সিরিয়ালাইজেশন টুলসেট ও ভাষা। এরপর এটি আপনাকে আপনার সার্ভিস ডেফিনিশন থেকে বিভিন্ন ভাষায় প্রচলিত ক্লায়েন্ট এবং সার্ভার স্টাব তৈরি করতে দেয়।

এই কোডল্যাবে, আপনি শিখবেন কীভাবে gRPC ফ্রেমওয়ার্ক ব্যবহার করে একটি API প্রদানকারী C# সার্ভিস তৈরি করতে হয়। আপনি এই সার্ভিসটির সাথে একটি C# কনসোল ক্লায়েন্টের মাধ্যমে ইন্টারঅ্যাক্ট করবেন, যেটি সার্ভিসটির মতোই একই সার্ভিস ডেসক্রিপশন ব্যবহার করে।

আপনি যা শিখবেন

  • প্রোটোকল বাফার ভাষা।
  • C# ব্যবহার করে কীভাবে একটি gRPC সার্ভিস বাস্তবায়ন করা যায়।
  • C# ব্যবহার করে কীভাবে একটি gRPC ক্লায়েন্ট বাস্তবায়ন করা যায়।
  • gRPC সার্ভিস কীভাবে আপডেট করবেন

আপনার যা যা লাগবে

আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?

শুধু পুরোটা পড়ুন এটি পড়ুন এবং অনুশীলনগুলো সম্পূর্ণ করুন।

গুগল ক্লাউড প্ল্যাটফর্মের সাথে আপনার অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?

শিক্ষানবিশ মধ্যবর্তী দক্ষ

২. gRPC C# স্যাম্পলগুলো ডাউনলোড ও বিল্ড করুন।

নমুনা ডাউনলোড করুন

gRPC C# স্যাম্পল রিপোজিটরিটি একটি জিপ ফাইল হিসেবে ডাউনলোড করে এক্সট্র্যাক্ট করুন।

বিকল্পভাবে, আপনি এর গিট রিপোজিটরি ক্লোন করতে পারেন।

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

যাই হোক, আপনার grpc-samples-dotnet নামের একটি ফোল্ডার থাকা উচিত, যার মধ্যে নিম্নলিখিত বিষয়বস্তু থাকবে:

d056832ff4ce0c8f.png

সমাধানটি তৈরি করুন

স্যাম্পল অ্যাপ্লিকেশন ফোল্ডারটিতে GrpcSamples.sln নামক একটি ভিজ্যুয়াল স্টুডিও সলিউশন রয়েছে। ভিজ্যুয়াল স্টুডিওতে সলিউশনটি খুলতে এটিতে ডাবল ক্লিক করুন। আপনি বেশ কয়েকটি প্রজেক্টসহ একটি সলিউশন দেখতে পাবেন।

61da9ddc86c08019.png

আমরা পরবর্তী বিভাগে প্রজেক্টগুলো আরও বিস্তারিতভাবে আলোচনা করব, কিন্তু প্রথমে, চলুন প্রজেক্টটি বিল্ড করি। সলিউশনটি বিল্ড করতে Build > Build Solution এ যান অথবা Ctrl + Shift + B । এটি NuGet থেকে সমস্ত ডিপেন্ডেন্সি ডাউনলোড করবে এবং তারপর অ্যাপ্লিকেশনটি কম্পাইল করবে।

সবশেষে, আপনি ভিজ্যুয়াল স্টুডিও কনসোল আউটপুটে একটি Build succeeded বার্তা দেখতে পাবেন।

৩. গ্রিটার নমুনাটি অন্বেষণ করুন

Greeter হলো একটি সহজ gRPC নমুনা, যেখানে ক্লায়েন্ট একটি নামসহ অনুরোধ পাঠায় এবং সার্ভার নামটিসহ একটি বার্তা পাঠিয়ে সাড়া দেয়। একটি Greeter প্রজেক্ট রয়েছে, যাতে সাধারণ সার্ভিস ডেফিনিশন (প্রোটো ফাইল) অন্তর্ভুক্ত আছে, যার উপর ভিত্তি করে ক্লায়েন্ট এবং সার্ভার তৈরি।

গ্রিটার প্রজেক্ট

এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে ব্যবহৃত একটি সাধারণ প্রজেক্ট। এতে একটি greeter.proto ফাইল রয়েছে, যা ক্লায়েন্ট ও সার্ভার উভয়ের ব্যবহৃত gRPC সার্ভিস ডেফিনিশন। এই সার্ভিস ডেফিনিশনটি GreetingService নামের একটি gRPC সার্ভিসকে সংজ্ঞায়িত করে এবং এতে একটি 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 ফাইলটিও রয়েছে। এটি সার্ভারের সাথে যোগাযোগের জন্য একটি চ্যানেল তৈরি করে এবং তারপর জেনারেটেড স্টাব থেকে চ্যানেলটি ব্যবহার করে একটি ক্লায়েন্ট তৈরি করে। এরপর এটি একটি রিকোয়েস্ট তৈরি করে এবং ক্লায়েন্ট স্টাব ব্যবহার করে সেটি সার্ভারে পাঠিয়ে দেয়।

৪. Greeter নমুনাটি চালান

প্রথমে, Greeter সার্ভারটি চালু করুন। একটি কমান্ড প্রম্পট খুলুন এবং Greeter সার্ভারের bin > Debug ফোল্ডারে গিয়ে এক্সিকিউটেবল ফাইলটি চালান। আপনি দেখবেন সার্ভারটি লিসেনিং অবস্থায় আছে।

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

এরপর, Greeter ক্লায়েন্টটি চালান। একটি আলাদা কমান্ড প্রম্পটে, Greeter সার্ভারের bin > Debug ফোল্ডারে যান এবং এক্সিকিউটেবল ফাইলটি চালান। আপনি দেখতে পাবেন যে ক্লায়েন্টটি অনুরোধ পাঠাচ্ছে এবং সার্ভার থেকে প্রতিক্রিয়া পাচ্ছে।

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

৫. গ্রিটার নমুনাটি আপডেট করুন

চলুন দেখি আমাদের সার্ভিস আপডেট করলে কেমন হয়। আমাদের gRPC সার্ভিসে goodbye নামে একটি নতুন মেথড যোগ করুন, যা ক্লায়েন্টকে hello-এর পরিবর্তে goodbye রিটার্ন করবে।

প্রথম ধাপ হলো greeter.proto.

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

এরপর, আপনাকে ক্লায়েন্ট এবং সার্ভার স্টাবগুলো পুনরায় তৈরি করতে হবে। কমান্ড প্রম্পটে generate_protos.bat চালান। স্টাবগুলো তৈরি হয়ে গেলে, আপডেট করা কোড পেতে আপনাকে আপনার ভিজ্যুয়াল স্টুডিও প্রজেক্টগুলো রিফ্রেশ করতে হতে পারে।

অবশেষে, নতুন পদ্ধতিটির সুবিধা নিতে ক্লায়েন্ট এবং সার্ভার কোড আপডেট করুন। সার্ভিসে, GreeterServiceImpl.cs আপডেট করুন এবং একটি নতুন goodbye মেথড যোগ করুন।

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

ক্লায়েন্টে, Program.cs ফাইলের 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...

৬. চ্যাটের নমুনাটি অন্বেষণ করুন

সলিউশনটিতে একটি ChatServer এবং একটি ChatWindowsClient প্রজেক্টও রয়েছে। নাম থেকেই বোঝা যায়, এটি একটি সাধারণ চ্যাট অ্যাপ্লিকেশনের জন্য ক্লায়েন্ট ও সার্ভারের একটি জোড়া। Chat প্রজেক্টটিতে chat.proto নামের একটি সার্ভিস ডেফিনিশন ফাইল আছে। এটিতে একটি chat মেথডসহ একটি ChatService সংজ্ঞায়িত করা হয়েছে।

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

এখানে গুরুত্বপূর্ণ বিষয় হলো, আগত এবং বহির্গামী উভয় চ্যাট বার্তাই ‘ stream কীওয়ার্ড দিয়ে চিহ্নিত করা হয়। এটি মূলত সংযোগটিকে একটি দ্বিমুখী স্ট্রিমে পরিণত করে, যেখানে ক্লায়েন্ট এবং সার্ভার যেকোনো সময় একে অপরকে বার্তা পাঠাতে পারে; যা একটি চ্যাট অ্যাপ্লিকেশনের জন্য নিখুঁত সমাধান।

অনুশীলন হিসেবে আপনি নমুনাটি আরও ভালোভাবে খতিয়ে দেখতে পারেন এবং এটি কীভাবে কাজ করে তা দেখার জন্য বিল্ড ও রান করতে পারেন।

৭. অভিনন্দন!

আমরা যা আলোচনা করেছি

  • প্রোটোকল বাফার ল্যাঙ্গুয়েজ।
  • C# ব্যবহার করে কীভাবে একটি gRPC সার্ভিস বাস্তবায়ন করা যায়।
  • C# ব্যবহার করে কীভাবে একটি gRPC ক্লায়েন্ট বাস্তবায়ন করা যায়।
  • gRPC সার্ভিস কীভাবে আপডেট করবেন

পরবর্তী পদক্ষেপ