در این روش، کلاینت درخواستهای خود را برای یک مسیریاب ارسال میکند سپس مسیریاب Service Registry را برای یافتن آدرس نمونههای ثبت شده از سرویس هدف جستجو میکند.در پایان بعد از یافتن نمونههای سرویس با یک الگوریتم توزیع مناسب، نمونهای از سرویسانتخاب شده و درخواست برای پردازش به آن سرویس ارسال میشود. ثبت و حذف سرویسها در این روش هم، مانند پیاده سازی توسط کلاینت انجام میشود.
به عنوان نمونهای از پیاده سازی یک مسیریاب میتوان بهAWS Elastic Load Balancing اشاره کرد. برای استفاده از این سیستم، درخواستهای HTTP یا TCP به ELB ارسال میشود و با توجه به نمونههای ثبت شده از سرویسها متفاوت درخواستها بین آنها توزیع میشود.
برخی از محیطهای توزیع مانند Kubernetes یک پروکسی ایجاد میکنند که مسئولیت Server-Side Load Balancer را انجام میدهند. در این روش کلاینتها درخواستهای خود را برای Proxy ارسال میکنند و proxy به صورت هوشمند درخواست را برای سرویسهای در دسترس ارسال میکند. پیاده سازی الگوی Service Discovery سمت سرور هم مانند هر روش دیگری مزایا و معایب خودش را دارد که در ادامه بررسی خواهیم کرد.
۴- بررسی دقیق Service Registry:
همانطور که قبلا بیان شد قلب الگوی Service Discovery، دیتابیس آدرسها یا Service Registry است. Service Registry دیتابیسی است که آدرس دقیق هر نمونه از سرویسها را نگهداری میکند. با توجه به نقش مهم این بخش، Service Registry باید همیشه در دسترس باشد و همیشه به روز باشد. برای افزایش بهرهوری، کلاینتها میتوانند آدرسهای به دست آمده از Service Registry را کش کنند، اما با توجه به اینکه این اطلاعات دائما به روز میشود، باید روالی برای به روز رسانی دادههای کش شده جهت جلوگیری از بروز مشکل سمت کلاینت در نظر گرفته شود.
همانطور که قبلا ذکر شد Netflix Eureka یک نمونه خوب از پیاده سازی Service Registry است. این ابزار یک REST API قوی برای ثبت و مدیریت آدرس سرویسها ارائه میکند. برای ثبت یک آدرس جدید باید یک درخواست POST به Eureka ارسال کنیم. برای پیاده سازی الگوی heartbeat و زنده ماندن سرویس به صورت پیشفرض سرویسها باید هر ۳۰ ثانیه یک درخواست PUT برای Eureka ارسال کنند. در صورتی که مدتی بیش از ۳۰ ثانیه بگذرد و درخواست PUT ارسال نشود یا اینکه یک درخواست DELETE برای Eureka ارسال شود، سرویس از پایگاهداده حذف میشود. اگر با سرویسهای REST آشنا باشید احتمالا تا الان حدس زدهاید که برای دریافت یک آدرس باید یک درخواست GET برای Eureka ارسال کنیم. با توجه به اهمیت Service Registry و نیاز به دردسترس بود همیشگی این سرویس میتوان از روالهای clustering همراه با Eureka استفاده کرد. پیشنهاد میکنم حتما برای آشنایی بیشتر با Eureka به مستندات آن مراجعه کنید اما اگر به هر دلیلی تمایل داشتید از ابزار دیگری استفاده کنید میتوانید از موارد ذیل استفاده کنید:
اولین گزینه Etcd است. یک پایگاه داده Key-Value و توزیع شده که برای نگهداری تنظیمات و Service discovery استفاده میشود. به عنوان یکی از پروژههای مهمی که از این ابزار استفاده میکند Kubernetes را میتوان نام برد.
به عنوان دومین ابزار مهم در این دسته میتوان از Consul نام برد. این سیستمها مانند بقیه موارد این دسته امکان ثبت و مدیریت سرویسها را به کمک API فراهم میکند. به کمک این ابزار و امکانات آن میتوانید وضعیت سلامتی و به روزبودن سرویسهای خود را نیز تحت نظر قرار دهید.
و آخرین ابزاری که در این قسمت قابل بررسی است Apache ZooKeeper نام دارد. این ابزار هم یکی از موفقترین نمونههای این دسته است که ابتدا به عنوان بخشی از پروژه Hadoop معرفی شد و با گذشت زمان به سرویسی مجزا تبدیل شد.
همانطور که قبلا هم عنوان شد اگر از برخی زیرساختها مثل Kubernetes یا AWS استفاده کنیم، نیازی به ابزار جداگانه برای Service Registry نداریم این الگو به صورت توکار توسط زیرساخت پشتیبانی میشود.
حال که با کلیات Service Registry و ابزارهای آن آشنا شدیم بیاید نگاهی به انواع روشهای ثبت و مدیریت آدرس سرویسها بیاندازیم.
۵- انواع روشهای مدیریت سرویسها:
همانطور که قبلا توضیح داده شد، باید امکانی داشته باشیم که نمونههای جدید سرویسها را در Service Registry ثبت کنیم و در مواقعی که نیاز داریم نمونههای ثبت شده را از دیتابیس حذف کنیم. این کارها را به روشهای متفاوتی میتوانیم انجام دهیم. اولین گزینه ثبت و مدیریت آدرس نمونه سرویسها توسط خود سرویسها است که به این روش Self Registration گفته میشود. اما این کار میتواند توسط یک سرویس دیگر انجام شود که به این روش نیز اصطلاحا third-party registration گفته میشود. بیایید باهم این روشها را دقیقتر بررسی کنیم.
۵-۱- الگوی Self-Registration:
هنگامی که از این الگو استفاده میکنیم، هر سرویس مسئول ثبت و حذف آدرس خود در Service Registry است. در صورت نیاز درخواستهای heartbeat نیز باید توسط خود سرویسها ارسال شود تا از حذف ناخواسته سرویس از Service Registry جلوگیری کند.