سالهاست که ما در حال ساختن سیستمها بودهایم و در آن بهتر شدهایم. چندین فنآوری، الگوهای معماری و بهترین شیوهها در طی آن سالها ظهور کردهاند. میکروسرویس ها یکی از آن الگوهای معماری است که از دنیای طراحی مبتنی بر دامنه، تحویل مداوم، اتوماسیون پلتفرم و زیرساخت، سیستم های مقیاس پذیر، برنامه نویسی چند زبانه و پایداری پدید آمده است.
میکروسرویس چیست؟
میکروسرویس ها (Microservices) یک رویکرد معماری و سازمانی برای توسعه نرمافزار هستند که در آن نرمافزار از سرویسهای مستقل کوچکی تشکیل شده است که از طریق APIهای کاملاً تعریف شده ارتباط برقرار میکنند. این سرویس ها متعلق به تیم های کوچک و مستقل هستند.
معماریهای میکروسرویس، برنامهها را آسانتر و سریعتر توسعه میدهند، نوآوری را ممکن میسازد و زمان ورود به بازار را برای ویژگیهای جدید تسریع میکند.
در معماری میکروسرویس ها، در آن یک برنامه کاربردی بزرگ از اجزا یا خدمات مدولار ساخته می شود. هر ماژول از یک وظیفه یا هدف تجاری خاص پشتیبانی می کند و از یک رابط ارتباطی کاملاً تعریف شده مانند رابط برنامه نویسی برنامه (API) برای برقراری ارتباط با ماژول ها و خدمات دیگر استفاده می کند. معماری میکروسرویس به طور گسترده از کانتینرهای مجازی و فناوریهای شبکه استفاده میکند و به دلیل توسعه ماژول ساده، استقرار و مقیاسپذیری آن، ویژگیهایی که بهویژه برای توسعه برنامههای کاربردی برای ابرهای عمومی مدرن مناسب هستند، مورد توجه قرار میگیرد.
معماری میکروسرویس یک انحراف قابل توجه از معماری های کاربردی یکپارچه سنتی (monolith) است که در آن همه ویژگی ها و عملکردهای اصلی برنامه در یک برنامه اجرایی واحد کدگذاری می شوند. مارتین فاولر، توسعهدهنده و نویسنده نرمافزار، با ترویج ایده تجزیه خدمات در معماری سرویسگرا (SOA) به میکروسرویسها اعتبار دارد.
پس از اینکه معماری میکروسرویس ها تکامل پیدا کردند معماری میکروفرانت اند نیز تکامل پیدا کردن، جهت کسب اطلاعات بیشتر این مقاله را بررسی کنید.
حال بیاید ببینیم میکروسرویس ها چگونه کار می کنند و اعماق این معماری را بررسی کنیم.
میکروسرویس ها چگونه کار می کنند؟
در معماری میکروسرویس، یک برنامه کاربردی به وظایف و خدمات (سرویس ها) مجزا تقسیم می شود. هر وظیفه یا سرویس به طور مستقل ایجاد می شود و هر یک فرآیند منحصر به فرد را اجرا می کند و معمولاً پایگاه داده خود را مدیریت می کند. یک سرویس میتواند هشدارها، ثبت دادهها، پشتیبانی از رابطهای کاربری (UIs)، مدیریت شناسایی یا احراز هویت کاربر، و انجام کارهای محاسباتی و پردازشی دیگر را ایجاد کند.
در مقایسه، یک معماری یکپارچه سنتی ممکن است شامل همان دسته بندی اساسی از وظایف و خدمات مورد نیاز برای انجام هدف برنامه باشد. اما این توابع همه در یک برنامه اجرایی واحد، بزرگ و همه کاره قرار دارند. یک اپلیکیشن میکروسرویس را می توان برای انجام بسیاری از کارهای مشابهی که قبلاً توسط طرح های کاربردی یکپارچه انجام می شد، طراحی و مونتاژ کرد.
پارادایم میکروسرویس ها رویکرد غیرمتمرکز تری را برای ساختن نرم افزار به تیم های توسعه ارائه می دهد. هر سرویس را می توان جدا کرد، بازسازی کرد، آزمایش کرد، مجدداً مستقر کرد و به طور مستقل مدیریت کرد. به عنوان مثال، اگر برنامه ای به درستی گزارش تولید نمی کند، می توان مشکل را در یک سرویس خاص ردیابی کرده و سپس آن سرویس را بدون نیاز به سرویس های دیگر تست، راه اندازی مجدد، وصله و باز استقرار مجدد در صورت نیاز انجام داد.
ویژگی های معماری و طراحی میکروسرویس ها
معماری میکروسرویس ها از اجزا و خدمات مجزا تشکیل شده است. ارتباطات و تبادل داده آنها عملکرد یک برنامه کامل را ایجاد می کند. ویژگی های معمول طراحی و معماری میکروسرویس ها شامل موارد زیر است:
اجزای منحصر به فرد. سرویسها بهعنوان مؤلفههای جداگانه طراحی و به کار گرفته میشوند که با هم کار میکنند تا یک عملکرد خاص را انجام دهند یا یک نیاز خاص را برطرف کنند.
غیر متمرکز. اجزای میکروسرویس منحصر به فرد وابستگیهای کمی دارند، اگر چه اتصال شل نیاز به ارتباط مکرر و گسترده بین اجزا دارد.
ارتجاعی. خدمات برای حداکثر تحمل خطا طراحی شده اند. یک خرابی یک سرویس نباید کل برنامه را غیرفعال کند. این اغلب مستلزم طراحی نرمافزار عالی و شیوههای مهندسی قابلیت اطمینان سایت (SRE) و همچنین استقرار اضافی و تکنیکهای شکستخوردگی و مقیاسپذیری بالا است.
مبتنی بر API. یک معماری میکروسرویس به APIها و دروازههای API برای تسهیل ارتباط بین اجزا و سایر برنامهها متکی است.
جداسازی داده ها. هر سرویس به پایگاه داده یا حجم ذخیره سازی خود دسترسی دارد.
اتوماسیون. اجزای برنامه microservice ها می تواند بسیار زیاد باشد، و استقرار دستی می تواند دشوار باشد. میکروسرویسها برای استقرار و مقیاسبندی اجزا به فناوریهای اتوماسیون و هماهنگسازی متکی هستند.
مزایای معماری میکروسرویس ها
طراحیها و استقرار میکروسرویسها به لطف ابر، کانتینریسازی و سیستمهای hyperconnected رشد کردهاند. معماری میکروسرویس چندین مزیت دارد:
استقلال. هر ماژول یا سرویس میکروسرویس را می توان با استفاده از زبان ها و ابزارهای مختلف توسعه داد و بر روی پلتفرم های مختلف مستقر کرد. تنها ارتباط بین اجزای میکروسرویس API است که از طریق آن در سراسر یک شبکه ارتباط برقرار می کنند. این انعطاف پذیری را برای توسعه برنامه به ارمغان می آورد.
چرخه های زندگی. این استقلال توسعه و استقرار به این معنی است که تیمهای توسعه مختلف معمولاً اجزای میکروسرویس را از طریق pipeline یکپارچهسازی و توسعه مستمر (CI/CD) میسازند و نگهداری میکنند. این چابکی توسعه بیشتری را ارائه می دهد و می تواند زمان ورود به بازار را افزایش دهد. همچنین زمان و الزامات تست را کاهش میدهد زیرا فقط ماژول تست میشود، اگر نیازی به آزمایش رگرسیون کل برنامه نباشد، نیازی به آزمایش رگرسیون کمی وجود دارد.
ایزوله سازی. از آنجایی که هر جزء از یک برنامه میکروسرویس به طور مستقل عمل می کند، نظارت بر سلامت و عملکرد هر جزء و نظارت بر عملکرد برنامه بزرگتر بسیار آسان تر است. این جداسازی همچنین شناسایی و رفع عیوب مانند راه اندازی مجدد یک ماژول خراب را آسان تر می کند.
مقیاس پذیری. برای مقیاسبندی یک برنامه سنتی یکپارچه، باید یک نسخه جدید از کل برنامه را مستقر کرد. در یک برنامه میکروسرویس، فقط اجزای مرتبط باید مقیاس شوند. استقرار و توازن بارگذاری چند کانتینر به جای یک برنامه یکپارچه کامل، سریعتر و کممصرفتر از منابع است.
سرعت. هر جزء میکروسرویس کوچک است و به توسعه دهندگان این امکان را می دهد تا در زمان بسیار کمتری نسبت به طراحی برنامه های کاربردی یکپارچه سنتی، یک جزء را طراحی، کدنویسی، آزمایش و به روز کنند.
قابلیت استفاده مجدد. اجزای برنامه مدولار قابل استفاده مجدد توسط برنامه های کاربردی دیگر هستند، که باعث سهولت بیشتر سرمایه گذاری در طراحی اپلیکیشن و سرعت بخشیدن به بازه های زمانی توسعه می شود.
سازگاری کانتینر. اجزای Microservices برای استقرار و مدیریت در کانتینرهای مجازی، با استفاده از کانتینر و فناوریهای ارکستراسیون به خوبی اثبات شده مانند Docker و Kubernetes مناسب هستند.
میکروسرویس ها در مقابل معماری یکپارچه (monolithic)
معماری یکپارچه یک برنامه واحد است. این شامل تمام کاربردها یا منطق عملیاتی مورد نیاز برای انجام کار در یک استک منسجم واقع در یک سرور اصلی واحد در مرکز داده است. این همیشه یک راه منطقی و کارآمد از نظر حافظه برای ساخت برنامه ها بوده است، اما برای بسیاری از برنامه های کاربردی مدرن و نیازهای تجاری کافی نیست. ما در مقاله میکروسرویس ها در مقابل monolith به صورت عمیق مقایسه کردیم. بیایید معاوضههای معماری یکپارچه و میکروسرویس را با هم مقایسه کنیم.
تفاوت های کلیدی
برنامه های کاربردی یکپارچه، موجودیت های همه در یک چیز در نظر گرفته می شوند که در آن کل برنامه به عنوان یک پایگاه کد واحد ساخته، تست و مستقر می شود. کاربران از طریق رابط برنامه سمت سرویس کلاینت یا لایه ارائه به برنامه دسترسی دارند. تعاملات و کوئری های کاربر مطابق با برنامه های کاربردی و منطق تجاری مبادله می شوند که دسترسی به پایگاه داده، پردازش داده ها و نحوه بازگرداندن نتایج به کلاینت را تعیین می کند. هیچ برنامه یکپارچه ای وجود ندارد یا بدون وابستگی اجرا می شود - فقط بیشتر "کار" خاص برنامه در یک نهاد نرم افزاری واحد انجام می شود.
یک معماری میکروسرویس، منطق زیربنایی را به مجموعه ای از وظایف یا سرویس های مختلف تجزیه می کند، که هر کدام می توانند به طور جداگانه توسعه یافته و مستقر شوند و از طریق یک API ارتباط برقرار کنند. کاربران از طریق یک برنامه سمت کلاینت یا پورتال وب با برنامه تعامل دارند. رابط درخواست های کلاینت را به سرویس های مربوطه توزیع می کند و نتایج را به کاربر برمی گرداند. یک برنامه میکروسرویس همچنین شامل وابستگی هایی مانند هسته سیستم عامل مشترک (OS)، موتورهای هماهنگ سازی کانتینر و اعتبار دسترسی به پایگاه داده است.
مزایا در مقابل معایب
طراحیهای معماری یکپارچه لزوماً پیچیده نیستند، اما ساخت برنامههای پیچیده با نقاط ادغام بسیاری در یک معماری یکپارچه، نقاط احتمالی شکست را معرفی میکند، مانند باگ های نرمافزاری یا خطاهای سختافزاری که میتواند منجر به توقف طولانی مدت و مداخله انسانی شود. برنامه های کاربردی یکپارچه برای کدنویسی، ساخت و آزمایش بسیار بزرگ و زمان بر هستند. کاربردهای یکپارچه نیز مقیاس خوبی ندارند. برای مثال، اگر یک برنامه برای رسیدگی به درخواستهای کاربر به قدرت محاسباتی بیشتری نیاز دارد، یک نمونه جدید از آن برنامه، و تمام وابستگیهای آن، باید در سرور دیگری مستقر شود.
در مقیاس، میکروسرویسها سطحی از کارایی را ارائه میکنند که کاربردهای سنتی یکپارچه نمیتوانند. هنگامی که یک عملکرد میکروسرویس به قدرت محاسباتی بیشتری نیاز دارد، تنها آن میکروسرویس با افزودن نمونههای بیشتری از آن سرویس از طریق متعادلکننده بار برای اشتراکگذاری ترافیک شبکه، مقیاسبندی میشود. علاوه بر این، ابزارهای هماهنگسازی و اتوماسیونی که برای استقرار و مدیریت سرویسها استفاده میشوند، میتوانند تشخیص دهند که یک سرویس خراب میشود یا پاسخگو نمیشود و بهطور خودکار یک سرویس مشکلدار را مجدداً راهاندازی میکند. در نهایت، یک میکروسرویس واحد حاوی کد کمتر و توابع کمتری برای آزمایش است و برای جستجوی پیامدهای ناخواسته تغییرات یا بهروزرسانیها، به آزمایش رگرسیون بسیار کمتری نیاز دارد. این عوامل می توانند توسعه و نگهداری خدمات را سرعت بخشند.
میکروسرویس ها نیز چالش هایی دارند. با تکثیر خدمات فردی، پیچیدگی محیط میکروسرویس ها چند برابر می شود. هر سرویس به عملکرد و یکپارچگی شبکه بستگی دارد و هر سرویس فردی باید به مدیریت، ثبت گزارش، نظارت و ابزارهای دیگر متصل شود.
معماری های کاربردی ترکیبی و مدولار
گذر از معماری های کاربردی یکپارچه (monolithic) به میکروسرویس ها می تواند برای توسعه دهندگان مشکل ساز باشد. یک پایگاه کد یکپارچه ممکن است به خوبی به خدمات فردی مرتب تجزیه نشود. به عنوان یک جایگزین، یک مدل میکروسرویس ترکیبی را در نظر بگیرید، که یک برنامه قدیمی را با ترکیبی از کدها و سرویسهای یکپارچه بهروزرسانی میکند که همگی از طریق کانتینرهای مبتنی بر ابر مستقر شدهاند.
گزینه دیگر یک معماری یکپارچه مدولار است که به دنبال تعادل مقیاس پذیری، سرعت و پیچیدگی عملیاتی است. این رویکرد کد را به ماژولهای ویژگی جداگانه تقسیم میکند، که وابستگیها را محدود میکند و ذخیرههای داده را جدا میکند، اما ارتباطات سادهتر، کپسولهسازی منطقی و قابلیت استفاده مجدد یک معماری یکپارچه را حفظ میکند.
اجزاء و عملکرد معماری میکروسرویس ها
برنامه های کاربردی سنتی به صورت یک بلوک کد طراحی و ساخته می شوند. معماری میکروسرویس یک برنامه کاربردی را به صورت مجموعه ای از خدمات یا اجزای نرم افزاری مستقل اما مرتبط بیان می کند که می توانند به طور مستقل توسعه، آزمایش و مستقر شوند، یا حتی به عنوان پروژه های نرم افزاری جداگانه. این سرویس ها با استفاده از پروتکل های سبک وزن مانند پروتکل انتقال ابرمتن (HTTP) و انتقال وضعیت نمایندگی (REST) از طریق API ها در سراسر یک شبکه با یکدیگر ارتباط برقرار می کنند. از طریق این فرآیند، کاربرد بیشتری ظاهر می شود.
معماری میکروسرویس از چندین ویژگی یا عملکرد اصلی تشکیل شده است. علاوه بر خدمات فردی، اجزای معمولی معماری میکروسرویس ها شامل API ها، کانتینرها، مش خدمات، مفاهیم SOA و ابر می باشد.
میکروسرویس ها و API ها
API ها و میکروسرویس ها فناوری های متفاوت اما مکمل یکدیگر هستند. API ها ادغام و ارتباط بین سرویس های مختلف را در معماری میکروسرویس ها تسهیل می کنند و خدمات را قادر می سازند تا نتایج را از یکدیگر درخواست و دریافت کنند. این قابلیت همکاری عملکرد کلی برنامه را ارائه می دهد.
در قلب این ساختار یک دروازه API قرار دارد که تماس های API را بین سرویس ها و کلاینت ها خارجی مدیریت، سازماندهی و توزیع می کند. دروازهها همچنین امنیت API، نظارت و تعادل بار را مدیریت میکنند. تخلیه چنین سربار اداری، میکروسرویس ها را چابک و سبک نگه می دارد.
میکرو سرویس ها و کانتینرها
کانتینر یک بسته نرم افزاری فردی و اجرایی است که شامل تمام وابستگی های مورد نیاز برای عملکرد مستقل است. کانتینرها از بقیه نرم افزارهای اطرافشان جدا می شوند و کانتینرهای زیادی را می توان در همان محیط به کار گرفت. در معماری میکروسرویس ها، هر سرویس به صورت جداگانه تحت محیط یکسانی مانند سرورهای مشابه یا مرتبط قرار می گیرد.
میکروسرویس ها تقریباً همیشه با کانتینرهای مجازی مرتبط هستند، که ساختارهایی هستند که برای بسته بندی خدمات و وابستگی های آنها استفاده می شوند. کانتینرها می توانند یک هسته سیستم عامل مشترک را به اشتراک بگذارند که به آنها امکان می دهد در سرورها در تعداد بسیار بیشتری در مقایسه با ماشین های مجازی سنتی (VM) وجود داشته باشند. کانتینرها همچنین می توانند به سرعت چرخیده و در عرض چند ثانیه از کار بیفتند.
اگرچه کانتینرها برای میکروسرویس ها مورد نیاز نیستند، اما میکروسرویس ها را کاربردی می کنند. نمونههای کوچک و کم منابع کانتینرها برای پایگاههای کد کوچک موجود در میکروسرویسها مناسب هستند. ایجاد سریع و تخریب آنها را مقیاس پذیر و موقت یا اثیری می کند. ابزارهای مدرن ارکستراسیون کانتینر، مانند Kubernetes، از توانایی شناسایی و راه اندازی مجدد کانتینرهای شکست خورده با حداقل دخالت انسان پشتیبانی می کنند.
در مقایسه، یک VM معمولی به یک سیستم عامل کامل، درایورها و سایر عناصر نیاز دارد. یک میکروسرویس را می توان در VM مستقر کرد. این می تواند ایزوله سازی اضافی را ایجاد کند، اما همچنین باعث ایجاد افزونگی و هزینه های غیر ضروری می شود. چرا 10 تا 20 مجوز سیستم عامل برای ماشین های مجازی برای ایجاد یک برنامه واحد مستقر و پرداخت می شود؟ ماشین های مجازی برای کاربردهای یکپارچه کامل از نظر هزینه و منابع کارآمدتر هستند.
تزریق وابستگی در مقابل وارونگی کنترل
میکروسرویس ها و مش سرویس ها
اگرچه API ها به عنوان چسب ضرب المثل برای ارتباط بین سرویس ها عمل می کنند، منطق واقعی حاکم بر ارتباطات چالش دیگری است. امکان کدگذاری منطق ارتباطی در هر سرویس در یک برنامه معمولاً پیچیده، اگرچه دشوار است.
از سوی دیگر، معماری میکروسرویس ها اغلب به یک شبکه خدماتی برای انتزاع ارتباطات سرویس به سرویس به دور از سرویس ها و در لایه دیگری از زیرساخت متکی است. این کانتینرهای پروکسی، که کانتینرهای سایدکار نیز نامیده میشوند، ایجاد میکند که به یک یا چند سرویس مربوط میشوند و در صورت لزوم ترافیک مسیری را طی میکنند، در حالی که این سرویسها به عملیات خود ادامه میدهند. یک برنامه میکروسرویس میتواند از پراکسیهای متعددی برای مدیریت سرویسهای مختلف یا مجموعهای از خدمات مرتبط استفاده کند.
میکروسرویس ها و SOA
شباهت هایی بین میکروسرویس ها و معماری سرویس گرا وجود دارد، اما آنها یکسان نیستند. SOA یک رویکرد توسعه نرم افزار است که بر ترکیب اجزا یا خدمات نرم افزار قابل استفاده مجدد متمرکز است. یک رابط مشترک به سرویسها اجازه میدهد تا در یک گذرگاه خدمات سازمانی با یکدیگر همکاری کنند، اما به دانش کمی در مورد نحوه عملکرد هر سرویس نیاز دارد. اجزای SOA اغلب به زبان نشانه گذاری توسعه پذیر (XML) و پروتکل دسترسی به اشیاء ساده (SOAP) برای برقراری ارتباط متکی هستند.
مدل SOA برای سرویسهایی که عمدتاً تراکنشی و قابل استفاده مجدد در سیستمهای نرمافزاری بزرگ هستند، بهترین کار را دارد. SOA برای کدهای جدید یا بازسازیشده یا پروژههایی که شامل چرخههای توسعه و استقرار سریع و مداوم هستند، مناسب نیست، اینجاست که میکروسرویسها میدرخشند.
از برخی جهات، میکروسرویس ها تکامل یافته SOA هستند، اما به یکدیگر وابسته نیستند. تفاوت اصلی بین SOA و میکروسرویس ها دامنه است: SOA برای کار در کل شرکت طراحی شده است، در حالی که دامنه میکروسرویس ها به خود برنامه محدود می شود. SOA میتواند ریزسرویسها را با اجازه دادن به برنامهها و مؤلفهها با سایر سرویسهای قابل استفاده مجدد در سراسر یک سازمان تکمیل کند.
میکروسرویس ها و ابر
کانتینرها و ریزسرویس ها را می توان در هر مرکز داده یا تأسیسات هم مکان مستقر و هماهنگ کرد، اما آنها به زیرساختی نیاز دارند که برای رسیدگی به چنین حجمی از خدمات یکپارچه و مقیاس بندی سریع یا غیرقابل پیش بینی طراحی شده باشد. ابرهای عمومی محیطهای ایدهآلی را برای محاسبات بر اساس تقاضا و مقیاسپذیر، و همچنین موتورهای هماهنگسازی، دروازههای API، ساختارهای صدور مجوز پرداخت و سایر عناصری که به عنوان بلوکهای ساختمانی برای معماری میکروسرویس عمل میکنند، فراهم میکنند.
چالش های معماری میکروسرویس ها
اگرچه مزایای میکروسرویس قانعکننده است، پذیرندگان باید برخی از معایب احتمالی یک برنامه میکروسرویس را نیز ارزیابی کرده و به آن بپردازند.
پیچیدگی غیر ضروری. همه برنامه ها برای پارادایم میکروسرویس مناسب نیستند. سرمایهگذاری مورد نیاز برای اعمال تکنیکهای میکروسرویس در برنامههای کوچکتر و سادهتر ممکن است مزایای ارزشمندی به همراه نداشته باشد. ماهیت، پیچیدگی و دامنه هر پروژه را در نظر بگیرید و مزایا و معایب رویکرد میکروسرویس را قبل از انجام آن تعهد طراحی ارزیابی کنید.
کارایی. یک کانتینر میکروسرویس عملکرد محاسباتی عالی را برای وظیفه خود ارائه می دهد، اما بسیاری از آنها باید در سراسر شبکه ارتباط برقرار کنند تا برنامه کلی کار کند. ازدحام و تأخیر شبکه می تواند عملکرد را مختل کند و آن مزایای عملکرد فردی را خنثی کند. علاوه بر این، حجم میکروسرویسها برای پشتیبانی از برنامهها به مدیریت و کنترل شبکه اضافی نیاز دارد و میتواند به چندین نمونه متعادل کننده بار نیاز داشته باشد.
محدودیت های شبکه. مولفه های میکروسرویس بر روی یک شبکه مبتنی بر ارتباطات API متکی هستند. این میتواند بر شبکههای شرکتی موجود از نظر پهنای باند و تأخیر فشار زیادی وارد کند، که میتواند توسط برنامههای کاربردی میکروسرویسهای متعدد که همگی به طور همزمان در محیط و زیرساخت شرکت کار میکنند، بیشتر شود. برخی از پذیرندگان میکروسرویسها ممکن است برای پشتیبانی از نیازهای ارتباطی برنامههای میکروسرویس شلوغ به ارتقاء شبکه نیاز داشته باشند. علاوه بر این، آسیبپذیریهای شبکه و خطرات امنیتی میتوانند به راحتی در محیطهای میکروسرویس پیچیده تشدید شوند.
مانیتورینگ. یک محیط برنامه میکروسرویس می تواند بسیار پیچیده باشد و تمام اجزای مستقر شده برای ساخت برنامه باید نظارت و گزارش شوند. این چالش به دلیل ماهیت اثیری آن اجزا تشدید می شود، که باید در حین استقرار و حذف آنها نظارت شود. این نیاز به سطح بالایی از نظارت بر سلامت و عملکرد و همچنین اتوماسیون و هماهنگی دارد.
امنیت. امنیت برنامه برای محافظت از دسترسی به نرم افزار و داده های اساسی حیاتی است، اما امنیت با میکروسرویس ها دشوارتر است. APIها باید با هر تماسی مجوز و احراز هویت کنند و هر مؤلفه باید سرویس را در برابر نفوذ سخت کند. ابزارها و فرآیندهای امنیتی باید در یک محیط میکروسرویس پیچیده و قابل تغییر نظارت و گزارش دهند. اتوماسیون گسترده ای برای اتصال پیکربندی امنیتی و نظارت به هر جزء میکروسرویس مورد نیاز است. علاوه بر این، هر ماژول مؤلفه باید وصلهها و بهروزرسانیهای مناسبی را دریافت کند تا امنیت پایدار در سراسر برنامه حفظ شود - که وقتی ماژولها توسط تیمهای مختلف در زمانبندیهای مختلف نگهداری میشوند، میتواند دشوار باشد.
فرهنگ. توسعه میکروسرویس ها نشان دهنده یک طرز فکر جدید در مورد نحوه طراحی، ساخت و اجرای برنامه های کاربردی سازمانی است. این بدان معناست که یک کسبوکار باید نه تنها ابزارها و فرآیندهای توسعهدهندهای را که استفاده میکند تنظیم کند، بلکه باید مهارتهای برنامهنویسی و فرهنگ تیمی را برای پشتیبانی از میکروسرویسها تقویت کند. توسعهدهندگان باید در حین کار بر روی سرویسهای مختلف با یکدیگر همکاری کنند و از پارادایمهای توسعه مستمر، شیوههای اتوماسیون فرآیند و گردش کار جامع و نظارت و امنیت استفاده کنند.
نقش میکروسرویس ها در DevOps
اگرچه میکروسرویس ها و DevOps دو مفهوم متفاوت هستند و به یکدیگر متکی نیستند، اما به دلیل همسویی طبیعی نزدیک بین این دو ایده، اغلب با هم مواجه می شوند.
DevOps وظایف بین برنامه و تیم عملیات سیستم را ترکیب می کند. افزایش ارتباطات بین توسعه دهندگان و کارکنان عملیات، تیم فناوری اطلاعات را قادر می سازد تا زیرساخت ها را بهتر ایجاد و مدیریت کنند. بودجههای پروژه DevOps اغلب شامل مواردی برای استقرار، برنامهریزی و مقیاسبندی ظرفیت، وظایف عملیاتی، ارتقاء و موارد دیگر میشود. توسعه دهندگان و تیم های کاربردی می توانند پایگاه های داده، سرورها، نرم افزار و سخت افزار مورد استفاده در تولید را مدیریت کنند.
Microservices یک پارادایم است که برای طراحی، ساخت و استقرار نرم افزار مدرن استفاده می شود. این شامل ایجاد، استقرار، نظارت و مدیریت بسیاری از مؤلفههای فردی است که کاربرد بیشتری را شامل میشود. از آنجایی که DevOps و سایر تکنیکهای چابک اغلب برای ساخت و استقرار نرمافزار استفاده میشوند، بسیاری از مؤلفههای درگیر در میکروسرویسها برای DevOps مناسب هستند. علاوه بر این، پشتیبانی چرخه عمر میکروسرویس ها نیازمند کار تیمی و همکاری بین تیم های توسعه و عملیات است که به نحوه عملکرد تیم های DevOps کمک می کند. تیمهای باتجربه DevOps برای استفاده از معماریهای میکروسرویس در پروژههای توسعه نرمافزار به خوبی مجهز هستند.
بهترین جایگزین های پست من در سال 2024
ملاحظات طراحی برای انتقال موفقیت آمیز میکروسرویس ها
بسیاری از پیادهسازیهای میکروسرویسها همچنان به الگوهای طراحی قدیمی پایبند هستند و با مانع مواجه میشوند. این بدان معنی است که معماران و توسعه دهندگان باید اصول و الگوهای طراحی جدید را اتخاذ کنند، پیامدهای دسترسی به پایگاه داده و پیامدهای شبکه را در نظر بگیرند و پیام رسانی کارآمد را بین سرویس ها پیاده سازی کنند. این یک سفارش بلند است که تحویل آن به زمان و تجربه نیاز دارد. ما در مقاله 10 تا از آنتی پترن ها در میکروسرویس ها به این موضوع کامل پرداختیم.
اصول طراحی
اصول طراحی معماری میکروسرویس ها به ساده کردن عملیات هر سرویس کمک می کند و اطمینان حاصل می کند که هر سرویس نتایج بهینه را برای برنامه کلی ارائه می دهد. رایج ترین آنها شامل اصول زیر است:
انسجام بالا. خدمات باید با حداقل ارتباطات با هم کار کنند تا از پهنای باند محدود شبکه حداکثر استفاده را ببرند.
کوپلینگ کم. خدمات باید وابستگی متقابل کمی داشته باشند. این امر تأثیر اختلالات را در صورت خرابی یک جزء و طراحی ماژول قابل استفاده مجدد به خوبی به حداقل می رساند.
محدوده مسئولیت واحد. یک سرویس باید حد و مرزهایی را تعیین کند تا منعکس کننده یک نیاز تجاری خاص باشد و فقط یک کار را انجام دهد. این ایده اجزای قابل استفاده مجدد را بیشتر می کند.
قابلیت اطمینان. خدمات را برای حداکثر تحمل خطا یا انعطاف پذیری طراحی کنید تا خطا در یک سرویس کل برنامه را غیرفعال نکند. این اغلب شامل استفاده از چندین سرویس یا خدمات اضافی می شود، به طوری که خرابی در یک مؤلفه، برنامه کلی را فلج نمی کند.
داده ها را به اشتراک نگذارید. ذخیره سازی و داده های مشترک یک وابستگی ناخواسته است. هر سرویس باید پایگاه داده یا حجم ذخیره سازی خود را داشته باشد یا بتواند به آن دسترسی داشته باشد.
از اتوماسیون استفاده کنید. از ابزارهای اتوماسیون مانند Kubernetes برای استقرار و مدیریت اجزای میکروسرویس، اغلب به عنوان بخشی از خط لوله CI/CD استفاده کنید.
از API ها استفاده کنید. API ها روشی برای تعامل و ارتباط بین سرویس ها هستند. طراحی و مدیریت خوب API برای برنامههای موفق میکروسرویس ضروری است.
نظارت کنید. از ابزارهای نظارتی برای نظارت و گزارش سلامت، عملکرد و مشکلات خدمات و مدیریت ترافیک برای بهترین عملکرد خدمات استفاده کنید.
الگوهای رفتاری
انعطافپذیری، یکپارچهسازی، کشف و ثبت چالشهایی برای هر معماری برنامهای است، به ویژه در مورد میکروسرویسها. در زیر برخی از الگوهای رایج طراحی معماری میکروسرویس ها وجود دارد که باید مورد توجه قرار گیرند:
طراحی دیسکاور. کلاینت ها نقطه پایانی که به یک برنامه میکروسرویس دسترسی دارند از کشف سمت سرویس کلاینت یا سرور برای یافتن یک سرویس در دسترس و ارسال درخواست استفاده می کنند.
طراحی ثبت نام. خدمات از ثبت نام خود یا ثبت شخص ثالث برای کمک به پیگیری خدمات مشغول و در دسترس استفاده می کنند.
طراحی جریان. معماران و توسعه دهندگان گردش کار را بین رابط کاربری جلویی و داده های پشتیبان از طریق الگوهای طراحی Model-View-Controller یا Model-View-ViewModel دیکته می کنند.
طراحی سگا. برخی از میکروسرویس ها به دستورالعمل های فرآیند متکی هستند و برخی دیگر عملکردهای واقعی را انجام می دهند که پیام رسانی منظم تر و بازیابی قابل اعتماد را امکان پذیر می کند.
طراحی قابلیت اطمینان. توسعهدهندگان اجازه میدهند چندین تماس (تلاش مجدد) یا قطع ارتباط با یک سرویس ناموفق (شکن مدار) انجام شود تا از انتقال خطاها بین سرویسها جلوگیری شود.
طراحی انتقالی. یک برنامه یکپارچه را به میکروسرویسها بازگردانید، مانند الگوی طراحی Strangler، برای کمک به بخشبندی یک برنامه قدیمی به عملکردهای خاص و ایجاد ماژول های جدا شده در برخی موارد، این نیاز به طراحی مجدد اساسی برنامه قدیمی برای تطبیق شیوههای ریزسرویسها دارد.
مفاهیم پایگاه داده
مدیریت دادهها برای میکروسرویسها صرفاً یک موضوع طراحی یا فناوری نیست، بلکه مجموعهای از ویژگیها یا اصولی است که از سازگاری، مقیاسبندی و انعطافپذیری برای کاربردهای میکروسرویس پشتیبانی میکند. الگوهای اساسی طراحی میکروسرویس ها شامل موارد زیر است:
پایگاه داده واحد در هر سرویس. هنگامی که یک سرویس را به یک پایگاه داده مرتبط می کنید، فقط یک پایگاه داده را به سرویس اختصاص دهید.
پایگاه داده مشترک اگر چندین سرویس یک پایگاه داده را به اشتراک بگذارند، تقاضای همزمانی به طور بالقوه می تواند باعث تضاد شود. یک پایگاه داده غیر سنتی، مانند NoSQL، می تواند اختلاف را کاهش دهد، اما برای بسیاری از انواع داده ها مناسب نیست.
طراحی سگا. مجموعهای از تراکنشها و تأییدیهها ایجاد کنید که به پایگاه داده اجازه میدهد از تراکنش خارج شود و به سیستم هشدار دهد که خطا رخ داده است.
طراحی مبتنی بر رویداد. از یک پایگاه داده ثابت برای ضبط و ذخیره سوابق تراکنش های مبتنی بر رویداد استفاده کنید.
الگوهای پیام رسانی
ارتباط بین خدمات می تواند چالش هایی را برای توسعه دهندگان و معماران ایجاد کند. رویکردهای پیام رسانی میکروسرویس زیر را در نظر بگیرید:
کوپلینگ سست در مقابل محکم. سرویسهای با پیوند ضعیف، وابستگیها را کاهش میدهند، اما اغلب پیامهای مکرر و جامعتری را میطلبند، در حالی که سرویسهای متصلشده میتوانند به ارتباطات کمتری نیاز داشته باشند اما وابستگیهای بیشتری دارند.
ارتباط ناهمزمان در مقابل ارتباط همزمان. یک کانال واحد و یک سبک درخواست/پاسخ در برنامه های کاربردی یکپارچه رایج است، اما کانال های ارتباطی متعدد و یک به چند کارآمدتر حتی ضروری برای برخی از برنامه های میکروسرویس هستند.
امنیت در داکر: 14 تکنیکی که باید بدانید
آپولوکلاینت در ری اکت: قدرت گراف کیوال
ابزارهایی برای استقرار و مدیریت میکروسرویس ها
به لطف هم افزایی با API ها، کانتینرها و فرآیندهای توسعه مستمر، میکروسرویس ها می توانند از بسیاری از ابزارهای مشابه برای طراحی، آزمایش، استقرار و مدیریت استفاده کنند.
Kubernetes استاندارد واقعی برای ارکستراسیون مبتنی بر کانتینر است، خواه یک شرکت از آن در محیط های محلی خود یا از طریق یک سرویس مبتنی بر ابر استفاده کند. سایر ابزارهای ارکستراسیون عبارتند از Docker Swarm and Compose و HashiCorp Nomad.
سازمانها میتوانند از میان طیف گستردهای از ابزارهای دیگر که شامل تست، استقرار، نظارت و مدیریت محیطهای میکروسرویس است، انتخاب کنند. نمونههایی از ابزارهایی که حوزههای آزمایش را در بر میگیرند عبارتند از Gatling، Hoverfly، Jaeger، Pact، Vagrant، VCR و WireMock. ابزارهای مدیریت API عبارتند از سواگر ، Postman و Tyk. ابزارهای چارچوب های معماری مناسب برای میکروسرویس ها و API های REST عبارتند از Goa و Kong.
با توجه به نیاز به ردیابی و حفظ هر یک از مؤلفههای سرویس یک برنامه کاربردی و تعاملات آنها، نظارت و مدیریت میکروسرویسها میتواند چالشبرانگیز باشد. این توابع شامل قابلیت مشاهده، تشخیص شکست و جمعآوری معیارها از لاگها برای شناسایی مسائل مربوط به عملکرد و پایداری است. نمونه هایی از ابزارهای نظارتی عبارتند از Sentry، Sensu و Sumo Logic. برخی از نمونههای ابزارهای جمعآوری گزارش عبارتند از Fluentd، Logstash، Ryslog و Loggly. برای تجسم لاگ، ابزارهایی شامل Scalyr، Graylog، Kibana و Sematext هستند.
مش سرویس لایه ای از زیرساخت است که به ارتباط بین خدمات فردی اختصاص داده شده است. هنگامی که صدها سرویس با یکدیگر ارتباط برقرار می کنند، تعیین اینکه چه سرویس هایی با یکدیگر تعامل دارند، پیچیده می شود. یک سرویس مش، مانند Linkerd و Istio، با ثبت رفتارهایی مانند تعادل بار آگاه از تأخیر یا کشف سرویس، این ارتباطات را سریعتر، ایمنتر، قابل مشاهدهتر و قابل اعتمادتر میکند. ارائه دهندگان بزرگ ابر خدمات جانبی را برای کمک به مدیریت میکروسرویس ها ارائه می دهند.
پیشرفتها در این فناوریها و سایر فناوریها مانند نظارت پیچیده و ثبت گزارش، پیچیدگی ریزسرویسها را کاهش داده و سازمانها و تیمهای توسعه را به پذیرش ادامه میدهند.
نتیجه
اکنون که به این موضوع پرداختیم که معماری میکروسرویس چیست، چرا میخواهید معماری میکروسرویس را به کار بگیرید، و درباره شروع کار فکر میکنید، میخواهم آخرین توصیهای را ارائه کنم: از کوچک شروع کنید.
هنگامی که به تازگی توسعه میکروسرویس ها را شروع کرده اید، با ملایمت فقط با یک یا دو سرویس شروع کنید، از آنها بیاموزید و با گذشت زمان و تجربه، موارد بیشتری را اضافه کنید.
برای شما بهترین موفقیت را در سفر به این مسیر مهیج معماری میکروسرویس ها آرزو می کنم.