۲۷ مهر ۱۴۰۴
خیلی مختصر و ساده با پکیج استاندارد RPC که در گولنگ ارائه شده است آشنا میشویم و یاد میگیریم چطور برای ارتباط بین سرویس ها از RPC استفاده کنیم.
RPC یا Remote Procedure Call, یک روش برای ایجاد ارتباط بین سرویس ها است. روش های دیگری نیز وجود دارد برای مثال:
معمولا در هنگام استفاده از RPC ترجیح بر این است که اطلاعات به صورت باینری انتقال پیدا کنند تا پهنای باند کمتری مصرف شود و انتقال اطلاعات با سرعت بیشتری انجام شود. روش های مختلفی برای تبدیل اطلاعات به باینری وجود دارد, برای مثال میتوان از پروتو بافر (protobuffer) برای تبدیل اطلاعات به باینری و بلعکس استفاده کرد.
در گولنگ با استفاده از کتابخانه ی استاندارد net/rpc میتوانیم سرور و کلاینت ایجاد کنیم تا با یکدیگر تبادل اطلاعات کنند. در پکیج net/rpc به صورت پیش فرض داده ها با فرمت gob به باینری تبدیل میشوند. اما این قابلیت نیز وجود دارد که شما از فرمت دلخواه خود برای اینکد (encode) و دیکد کردن (decode) اطلاعات استفاده کنید.
اگه میخواهید راجب gob بیشتر بدونید میتونید توی پست قبلیمون راجبش مطالعه کنید.
از پکیج RPC که به صورت استاندارد توسط گولنگ ارائه میشه, میتوان برای ارتباط بین سرویس ها بر روی HTTP یا TCP استفاده کرد.
در گولنگ, برای پیاده سازی RPC حداقل باید سه مورد رو در نظر داشته باشیم:
ایجاد یک سرویس مناسب برای RPC
RPC سرور
RPC کلاینت
پیاده سازی یک روش استاندارد بین سرور و کلاینت برای اینکد کردن و دیکد کردن اطلاعات
برای ایجاد یک سرویس RPC باید یک دیتا تایپ ایجاد کنیم که یکسری متد داشته باشد. این متدها را میتوان با استفاده از RPC اجرا کرد.
دیتا تایپ و متدها باید دارای شرایط زیر باشند:
دیتا تایپ باید خارج از پکیج فعلی آن قابل دسترسی باشد (پابلیک باشد)
متدهایی که قرار است توسط RPC اجرا شوند باید خارج از پکیج فعلی قابل دسترسی باشند (پابلیک باشند)
متدهایی که قرار است توسط RPC اجرا شوند باید دو آرگومان داشته باشند. این آرگومان ها نیز باید دارای دیتا تایپ پابلیک باشند.
آرگومان اول متد, نمایندهی مقدار یا مقادیری است که متد به عنوان ورودی قبول میکند. آرگومان دوم متد, باید یک اشارهگر (pointer) باشد که پاسخ برگشتی یا خروجی تابع درون این آرگومان قرار میگیرد.
متد باید یک مقدار از نوع error را برگرداند.
به عنوان مثال یک دیتاتایپ با نام Arith ایجاد میکنیم و دو متد با نامهای Multiply و Divide به آن اضافه میکنیم:
تابع Multiply عملیات ضرب را بر روی دو عدد انجام میدهد و خروجی را برمیگرداند.
تابع Devide دو عدد به عنوان ورودی قبول میکند, عدد اول را بر دومی تقسیم میکند و در نهایت خارج قسمت و باقیمانده را برمیگرداند.
در مثال بالا دیتا تایپ Arith دو متد دارد که این متدها هردو دارای دو آرگومان هستند. آرگومان اول هردو متد, یک اشاره گر از نوع Args که خود یک struct دارای دو مقدار عددی است. بنابراین به عنوان ورودی میتوان دو عدد را درون متغیری از نوع Args ذخیره کرد و سپس متغیر را به متدها پاس داد.
در نهایت, خروجی یا مقدار بازگشتی از هر متد نیز درون پارامتر دوم آن متد قرار میگیرد.
در گولنگ با استفاده از پکیج استاندارد net/rpc میتوانیم به راحتی یک RPC سرور بر روی پروتکل های TCP یا HTTP ایجاد کنیم.
برای ایجاد سرور TCP به شکل زیر میتونیم عمل کنیم:
در مثال بالا یک پوینتر از روی Arith ساختیم و سپس اون رو با استفاده از متد Register به سرور RPC معرفی کردیم. و در نهایت بر روی پورت 1234 سرور RPC رو اجرا کردیم.
حالا با ایجاد یک کلاینت RPC میتونیم دستورات رو به صورت sync یا async اجرا کنیم:
دیتا تایپ Arith باید در هردو طرف سرور و کلاینت به اشتراک گذاشته شود تا به صورت صحیح بتوان تبادل اطلاعات انجام داد.
برای ایجاد یک RPC سرور بر روی HTTP میتونیم مثل زیر عمل کنیم:
در مثال بالا یک سرور اصلی ایجاد کردیم و یک سرور برای خطایابی! در حالتی که از HTTP استفاده کنید به صورت پیش فرض یک سرور برای خطایابی پیاده سازی شده است که میتوان از آن برای محیط توسعه استفاده کرد. در مثال بالا سرور دیباگ را بر روی پورت 1235 اجرا کردیم. سرور دیباگ در مسیر http://localhost:1235/debug/rpc یکسری اطلاعات درباره ی RPC متد های موجود و تعداد کال های انجام شده به ما میدهد.
در قدم بعدی با ایجاد یک کلاینت RPC میتونیم دستورات رو به صورت sync یا async اجرا کنیم:
دقت کنید که دیتا تایپ Arith و همچنین دیتا تایپ استفاده شده در آرگومانهای متدهای آن باید بین سرور و کلاینت به اشتراک گذشته شوند تا بتوان به درستی دیتا را به باینری تبدیل کرد و از حالت باینری نیز خارج کرد.
پکیج net/rpc به صورت پیش فرض با استفاده از فرمت gob اطلاعات را به باینری تبدیل میکند اما این امکان نیز وجود دارد که شما از فرمتهای دلخواه خود استفاده کنید. مثلا میتوانید از protobuf (یا protobuffer) و یا از json استفاده کنید.
منابعی که برای نوشتن این پست مورد استفاده قرار گرفته است:
نمونه کدهای موجود در این پست را میتوانید از رپازیتوری گیت هاب ما دریافت کنید.
قسمت قبل: تبدیل داده ها به باینری با استفاده از Gob | گولنگ به زبان ساده
قسمت بعد: به زودی…