مفهوم RPC به همراه مثال gRPC در اندروید

rpc programmingدر محاسبات توزیع شده ، یک فراخوان از راه دور RPC زمانی است که یک برنامه کامپیوتری باعث می شود یک رویه (زیر برنامه) در فضای آدرس دیگری (معمولاً در رایانه دیگری در شبکه مشترک) اجرا شود ، به گونه ای کدنویسی شود که گویی درون برنامه خودمان است، بدون اینکه برنامه نویس به طور صریح جزئیات تعامل از راه دور را رمزگذاری کند. به این معنی که برنامه نویس اساساً همان کد را می نویسد ، چه زیرروال محلی برنامه اجرا باشد ، چه از راه دور. این نوعی تعامل بین سرویس گیرنده و سرور است (تماس گیرنده مشتری است ، مجری آن سرور است) ، که معمولاً از طریق سیستم ارسال پیام و پاسخ درخواست اجرا می شود.در الگوی برنامه نویسی شی گرا ، RPC ها با فراخوانی متد از راه دور نشان داده می شوند. مدل RPC حاکی از سطحی از شفافیت مکان است.RPC یک پروتکل درخواست و پاسخ است. RPC توسط سرویس گیرنده آغاز می شود ، که برای اجرای یک رویه مشخص با پارامترهای ارائه شده ، یک پیام درخواست به یک سرور راه دور شناخته شده ارسال می کند. سرور راه دور پاسخی برای سرویس گیرنده ارسال می کند و برنامه به روند خود ادامه می دهد. در حالی که سرور در حال پردازش تماس است ، سرویس گیرنده مسدود شده است (منتظر می ماند تا سرور پردازش را قبل از شروع مجدد اجرا به پایان برساند) ، مگر اینکه مشتری یک درخواست ناهمزمان مانند XMLHttpRequest را به سرور ارسال کند.ترتیب وقایع کلاینت (متدها- تعریف IDL- مارشالینگ - درگاه خروجی)1- استاب فراخوانی می شود، این فراخوان یک فراخوان رویه محلی است که پارامترهای آن به روش عادی روی پشته رانده می شوند.2- استاب مشتری پارامترها را در یک پیام قرار داده و برای ارسال پیام یک تماس سیستمی برقرار می کند. بسته بندی پارامترها را مارشالینگ می نامند.3- سیستم عامل کلاینت پیام را از به سرور می فرستد.4- سرور بسته های ورودی را به اسکلت سرور منتقل می کند.5- سرور پارامترهای پیام را باز می کند. باز کردن بسته بندی پارامترها unmarshalling نامیده می شود.6- سرانجام، سرور متدها خواسته شده را فراخوانی می کند. پاسخ ، همان مراحل را در جهت معکوس دنبال می کند.سازوکارهای تماس استانداردبرای دسترسی کلاینت های مختلف به سرورها ، تعدادی سیستم استاندارد RPC ایجاد شده است. اکثر اینها از زبان توصیف رابطIDL) ) استفاده می کنند تا سیستم عامل های مختلف بتوانند با RPC تماس بگیرند. سپس می توان از پرونده های IDL برای ایجاد کد جهت ایجاد ارتباط بین سرویس گیرنده و سرورها استفاده کرد.تعاریف مرتبطمحاسبات توزیع شده :رشته ای از علوم کامپیوتر است که سیستم های توزیع شده را مطالعه می کند. سیستم توزیع شده سیستمی است که اجزای آن (متد ها ، داده ها ، و محاسبات مخصوص و...) بر روی شبکه های مختلف بر روی سیستم های دیگر قرار دارند که با انتقال پیام به یکدیگر ارتباط برقرار کرده و اقدامات خود را هماهنگ می کنند.استاباستاب در محاسبات توزیع شده قطعه ای از کد است که پارامترهای منتقل شده بین کلاینت و سرور را طی یک تماس از راه دور (RPC) تبدیل می کند. استاب تبدیل پارامترها را از طریق زبان شرح ارتباط IDL انجام می دهند ، بنابراین یک تماس رویه از راه دور مانند یک تماس عملکرد محلی برای رایانه از راه دور به نظر می رسد. در استاب مجموعه ای از اطلاعات با نام سرفایل یا هدر ، بین سرور و کلاینت ردوبدل میشود که به درک برنامه از نوع داده ها ، نوع درخواست، زمان و... کمک میکند.اسکلت یا skeletonشی سمت سرور که در ارتباطات شی توزیع شده شرکت می کند به عنوان اسکلت شناخته می شود (یا استاب: اصطلاح در اینجا از آن اجتناب می شود). یک اسکلت به عنوان دروازه اشیا سمت سرور عمل می کند و کلیه درخواست های ورودی مشتری از طریق آن هدایت می شود.مارشالینگ و آنمارشالینگ :مارشال سازی فرآیند تبدیل اشیاء حافظه به یک قالب داده مناسب برای ذخیره سازی یا انتقال است و معمولاً هنگامی که داده ها باید بین قسمتهای مختلف یک برنامه یا به برنامه دیگری منتقل شوند ، از آن استفاده می شود.مانند تبدیل یک کلاس به یک فایل json یا .xml در برخی زبانها مانند جاوا و پایتون، این اصطلاح برای نوع خاصی از "سریال سازی" (تبدیل شی به بایت و برعکس ) استفاده می شودIDLاز IDL ها معمولاً در نرم افزار تماس از راه دور استفاده می شود. در این موارد ممکن است ماشین های موجود در دو انتهای پیوند از سیستم عامل های مختلف و زبان های رایانه ای استفاده کنند. IDL ها پلی بین دو سیستم مختلف ارائه می دهند.نمونه های معروف ان : JSON – protocol buffer – xml و...پروتکل بافر (protocol buffer)نوع جدیدی از : IDLیک مکانیزم قابل توسعه مستقل از زبان و پلت فرم، جهت سریال سازی داده های ساخت یافته است. در این سیستم ما یک فایل با پسوند proto. که در آن توصیفی از ساختار داده ای را که می خواهیم ذخیره کنیم (طرح از پیش تعریف شده) می نویسیم. کامپایلرprotoc یک کلاس ایجاد می کند که رمزگذاری و تجزیه خودکار داده های بافر را با یک قالب باینری کارآمد پیاده سازی می کند. کلاس تولید شده ، setter & getter را برای فیلدهایی که بافر را تشکیل می دهند فراهم می کند و از جزئیات خواندن و نوشتن بافر به عنوان یک واحد مراقبت می کند.پیاده سازی RPCدر android با gRPCتعریف gRPCgRPC یک چارچوب RPC مدرن ، منبع باز و با عملکرد بالا است که می تواند در هر محیطی اجرا شود. این برنامه می تواند با پشتیبانی قابل جابجایی برای توازن بار ، ردیابی ، بررسی سلامت و احراز هویت ، خدمات را در مراکز داده و از طریق آنها متصل کند. همچنین برای اتصال دستگاهها ، برنامه های تلفن همراه در بروزترین نسخه های منتشرشده قابل استفاده است.چون این یک RPC است، باعث می شود درخواستهای مرتبط با شبکه دقیقا مشابه درخواست های محلی بنظر برسد و تعامل با سرور محدود به متد های منبع HTTP نخواهد شد و کد طبیعی تر به نظر می رسد.این روش باعث کاهش استفاده از منابع می شود و برای دستگاه هایی که مصرف باتری در انها مهم است بسیار بهینه است. با استفاده از قابلیت جریان سازی داخلی این روش ، سرویس گیرنده و سرور می توانند پیام ها را به طور همزمان بخوانند و بنویسند و بدون ردیابی شناسه منابع ، مشترک یکدیگر شوند. این باعث انعطاف پذیری بیشتر اجرای برنامه شما می شود.gRPC با استفاده از بافرها به عنوان روش سریال سازی و معکوس سریال سازی، با پلاگین بهینه سازی شده برای محیط های مختلف عرضه شده است.در مقایسه با قالب مبتنی بر متن مانند JSON)) ، Protobuf از نظر سرعت مارشال سازی و اندازه کد ، تبادل داده کارآمدتری را ارائه می دهد که استفاده از آن را در محیط های تلفن همراه مناسب تر می کند.نمای کلی استفادهاستفاده از gRPC برای برنامه های Android شامل چهار مرحله است:1 - تعریف سرویس RPC با پروتکل بافر و ایجاد رابط های سرور و کلاینت gRPC.translatIDL.protoservice Translator{ rpc Translate (TranslateRequest) returns (TranslateResponse){} } message TranslateRequest{ string text = 1; } message TranslateResponse{ string text = 1; }2 - کانالی که به عنوان واسطه ای برای تماس های RPC بین کلاینت و سرور باشد.TranslateChannel.ktprivate fun channel(): ManagedChannel { val builder = ManagedChannelBuilder.forAddress((&quothttps://www.google.com&quot) return builder.executor(Dispatchers.IO.asExecutor()).build() }3 - یک Stub به عنوان نقطه ورود برای شروع تماس های RPCMainActivity.ktprivate val translator by lazy { TranslatorGrpc.newBlockingStub(channel()) }4 - مشابه صدا زدن متدهای درون برنامه، فراخوانی RPC و صدا زدن متدهای روی سرور:val request = TranslateRequest.newBuilder().setText(text).build() val response = translator.translate(request) tvResponse.text = response.textبا gRPCمی توانیم سرویس خود را یک بار در یک پرونده .proto تعریف کنیم و کلاینت و سرور را به هر زبان پشتیبانی شده از gRPCتولید کنیم که به نوبه خود در محیط هایی از سرورهای داخل یک مرکز داده بزرگ تا گوشی شما قابل اجرا است - تمام پیچیدگی های ارتباط بین زبان ها و محیط های مختلف توسط gRPC انجام می شود.همچنین از تمام مزایای کار با بافر پروتکل ، از جمله سریال سازی کارآمد ، IDL ساده و به روزرسانی آسان رابط بهره مند می شویم.فایل .proto بیان تمام نیازمندی های برنامه ماست و نمونه ی کلاینت و سرور دقیقا مشابه یکدیگر می باشند.کافیست در کلاینت تعریف کنیم و آن را به پوشه پروژه سرور، که با پی اچ پی ران میشود کپی کنیم یا برعکس!