منبع دقیق عبارت "میکروسرویس" نامشخص است، اما می توان گفت که آن را Martin Fowler، نویسنده و معمار نرم افزار معروف، در پست وبلاگی خود با عنوان "میکروسرویس" که در سال 2014 منتشر شد، معرفی کرد. در این پست وبلاگی، Fowler معماری میکروسرویس را بعنوان روشی برای ساخت و استقرار سامانه های نرم افزاری بعنوان یک مجموعه از خدمات جداگانه قابل استقرار، کوچک و ماژولار توصیف کرد.
مفهوم میکروسرویس به نوعی بخاطر عدم رضایت کافی از معماری monolithic در توسعه پذیری و پردازش های سریع به بازار آمد. با پیشرفت روز افزون تکنولوژی و همچنین افزایش درخواست نرم افزارهایی برای تمام جنبه های زندگی، نیاز بود که نرم افزارها بزرگتر شده و مهم تر از آن به سرعت، پاسخگوی تعداد زیادی درخواست باشند. میکروسرویس بعنوان راهی برای حل این مشکلات توصیف شد، با تقسیم یک برنامه monolithic بزرگ به خدمات کوچکتر که می تواند بصورت مستقل توسعه و مستقر شود.
اولین برنامه های مبتنی بر میکروسرویس توسط شرکت هایی مانند آمازون و نتفلیکس توسعه یافتند، که به عنوان پیشگامان در استفاده از این روش برای ساخت سیستم های نرم افزاری گسترش پذیر و flexible بودند. در این برنامه های اولیه، میکروسرویس برای بهبود گسترش پذیری و قابلیت اطمینان سیستم ها و تسریع روند توسعه و توزیع نرم افزار استفاده شد.
مارتین فاولر، دانشمند نرمافزار، نویسنده و سخنران مشهور در جامعه توسعه نرمافزار است. او برای تخصص خود در الگوهای طراحی نرمافزار و معماری شناخته میشود و نوشته های بینظیری در این زمینه دارد. از معروف ترین نوشته های او میتوان به "Refactoring: Improving the Design of Existing Code" و "Patterns of Enterprise Application Architecture" اشاره کرد که خواندن آنها برای هر توسعه دهنده و هر معمار نرم افزاری واجب است. همچنین او عضو پیشرو در توسعه روش های Agile است. مارتین فاولر به عنوان یکی از شخصیتهای مهم در صنعت توسعه نرمافزار است و به پیشرفت توسعه نرمافزار در چارچوب کارآمد، کمک زیادی کرده است.
حالا که به صورت خیلی خلاصه به مرور تاریخی ماکروسرویس ها پرداختیم، به سراغ توضیحات تکمیلی و فنی آن می رویم
میکروسرویس یک سبک معماری برای ساخت نرمافزارهای کاملاً مقیاس پذیر و flexible، بر پایه ایده تقسیم یک برنامه بزرگ و مونولیتیک به سرویسهای کوچکتر و مستقل، که با هم با استفاده از API ها در تعامل هستند، معرفی می شود.
هر میکروسرویس برای یک مسئولیت خاص طراحی می شود، مانند مدیریت کاربران یا پردازش پرداخت، و میتواند بدون وابستگی به سایر میکرسرویس ها، توسعه داده، منتشر شده و مدیریت شود. این روش در سالهای اخیر به دلیل مزایای زیادی که دارد، مانند راحتتر شدن نگهداری، دوره های سریعتر توسعه و منتشر شدن و بهتر شدن تحمل خطا، طرفداران زیادی پیدا کرده است. همچنین، میکروسرویسها میتوانند با زبانهای برنامه نویسی مختلف و بر روی پلتفرمهای مختلف اجرا شوند که این مسئله میتواند به توسعه چند تیم مختلف در کنار هم بر روی یک نرم افزار منجر شود که یکی از الزامات اصلی توسعه نرم افزاری در جهان فعلی ست.
اگر بخواهیم اشاره ای کوتاه و لیست مانند به مزایای اصلی این معماری داشته باشیم باید بگوییم:
برای ایجاد و راه اندازی موثر میکروسرویس ها، داشتن ارتباط و همکاری خوب بین تیم ها، API های تعریف شده و فرهنگ DevOps قوی که بر یکپارچه سازی مداوم، استقرار مستمر و نظارت تاکید دارد، مهم است. علاوه بر این، سازمانها باید وابستگیهای بین میکروسرویس ها و همچنین دادههایی را که تولید و مصرف میکنند را به دقت مدیریت کنند تا از ثبات و امنیت سیستم اطمینان حاصل شود.
همان طور که می بینید پیاده سازی ماکروسرویس نیازمند مجموعه ای از مفاهیم و عملکردهایی ست که تا قبل از آن انقدر مهم نبودند و یا حتی مطرح نشده بودند. یکی از مفاهیمی که ارتباط تنگاتنگی با پیاده سازی این معماری دارد، CI/CD یا یکپارچه سازی و استقرار مداوم است. بدون درک این مفهوم، درک ماکروسرویس ناقص است. پس گذری به آن بزنیم.
یکپارچه سازی و استقرار مداوم یا CI/CD یک روش توسعه نرم افزار است که هدف آن خودکارسازی ساخت، آزمایش و استقرار برنامه های کاربردی نرم افزار است. هدف CI/CD این است که سازمانها را قادر سازد تا بهروزرسانیها و ویژگیهای نرمافزار را به دفعات و با کیفیت بالاتر به مشتریان ارائه دهند.
در معماری میکروسرویس، CI/CD اهمیت ویژه ای دارد، زیرا هر میکروسرویس جزء مجزا و مستقلی از برنامه کلی است. با CI/CD، تیمها میتوانند فرآیند ساخت، آزمایش و استقرار میکروسرویسها را خودکار کرده، خطر خطاها را کاهش داده و سرعت تحویل را افزایش دهند.
در CI/CD، هرگاه تغییری در یک پایگاه کد میکروسرویس ایجاد شود، pipeline به طور خودکار فرآیند build و آزمایش را آغاز می کند. در صورت موفقیت آمیز بودن آزمایشات، میکروسرویس سپس در محیط production مستقر می شود. این به تیمها امکان میدهد تا به سرعت و به آسانی تغییرات در میکروسرویسها را تأیید کرده، آن تغییرات را پیادهسازی کنند، بازخورد سریع ارائه دهند و کیفیت کلی برنامه را بهبود بخشند.
به طور خلاصه، استفاده از CI/CD در معماری میکروسرویس، سازمان ها را قادر می سازد تا نرم افزار را سریعتر، با کیفیت بالاتر و با ریسک کمتر ارائه دهند. همچنین انعطاف پذیری بیشتری را برای تیم ها فراهم می کند، زیرا می توانند به طور مستقل تغییراتی در میکروسرویس ها ایجاد کنند و آن تغییرات را به طور لحظه ای اعمال کنند.
حال برای درک بهتر کمی به سراغ مقایسه می رویم.
میکروسرویس ها اغلب با سایر سبک های معماری از جمله معماری یکپارچه(monolithic) و معماری سرویس گرا (SOA) مقایسه می شوند.
معماری یکپارچه یک رویکرد سنتی برای توسعه نرمافزار است که در آن یک برنامه کاربردی به عنوان یک واحد منفرد و کاملاً متصل ساخته میشود. تمام اجزای برنامه، از جمله رابط کاربری، منطق تجاری و لایه دسترسی به داده ها، در یک پایگاه کد واحد ترکیب شده و به عنوان یک برنامه واحد مستقر می شوند.
در یک معماری یکپارچه، تغییرات در برنامه نیاز به بازسازی و استقرار مجدد کل پایگاه کد دارد که مدیریت آن زمان بر و چالش برانگیز است. علاوه بر این، با افزایش پیچیدگی برنامه، درک، آزمایش و نگهداری آن دشوارتر می شود که منجر به افزایش خطر خطا و کاهش کارایی می شود.
در مقایسه با معماری یکپارچه، معماری میکروسرویس چندین مزیت از جمله قابلیت نگهداری بهبود یافته، چرخههای توسعه و استقرار سریعتر و تحمل خطای بهتر را ارائه میدهد. علاوه بر این، میکروسرویسها را میتوان به زبانهای برنامهنویسی مختلف نوشت و بر روی پلتفرمهای مختلف اجرا کرد، که آنها را با تغییرات سازگارتر و برای طیف وسیعتری از موارد استفاده مناسبتر میکند.
همان طور که در متن بالا خواندید، معماری یکپارچه کار را برای توسعه مداوم و پیشرفت پروژه سخت می کند. همین مسئله که یک پایگاه کد داریم کار را به قدری سخت می کند که دیگر سراغ بررسی دیگر مسائل نرویم. اما این مطلب را هم در نظر داشته باشید که این حرف ها به این معنی نیست که این معماری منسوخ شده است و دیگر کسی سراغ آن نمی رود. هنوز نرم افزارهایی هستند که انتخاب این معماری برای آنها مناسب تر از دیگر معماری هاست و یک معمار نرم افزار باید تمام راه های ممکن را برای شروع کار خود در نظر داشته باشد.
حال به سراغ دیگر معماری مهم می رویم.
معماری سرویس گرا (SOA) یکی دیگر از سبک های معماری است که شامل تجزیه یک برنامه یکپارچه به سرویس های کوچکتر و مستقل است. با این حال، سرویسهای SOA معمولاً بزرگتر و تمرکز کمتری نسبت به میکروسرویسها دارند، و اغلب بهطور محکمی با هم مرتبط هستند، به این معنی که تغییرات در یک سرویس میتواند بر بسیاری دیگر تأثیر بگذارد. میکروسرویس و SOA شباهتهایی دارند، مانند استفاده از API برای برقراری ارتباط بین سرویسها و تمرکز بر تجزیه یک برنامه یکپارچه به اجزای کوچکتر. با این حال، میکروسرویسها معمولاً کوچکتر، متمرکزتر و کمتر از سرویسهای SOA متصل هستند، که باعث انعطافپذیری بیشتر و اصلاح پذیری آنها میشود.هر دوی اینها، رویکردهایی برای ساخت و استقرار سیستم های نرم افزاری هستند، اما تفاوت های کلیدی بین این دو وجود دارد.
برای جمع بندی میتوان گفتSOA و میکروسرویس ها نقاط قوت و ضعف خاص خود را دارند و انتخاب بین این دو به نیازهای خاص یک پروژه بستگی دارد. SOA برای پروژه هایی که نیاز به یک رویکرد متمرکز و هماهنگ برای توسعه و استقرار دارند، مناسب است، در حالی که میکروسرویس ها برای پروژه هایی که به انعطاف پذیری، مقیاس پذیری و کنترل غیرمتمرکز نیاز دارند، مناسب هستند. اگر بخواهیم مثال هایی برای کاربرد SOA بزنیم:
این دو نمونه فقط مثال هایی بودند برای این درک که همواره تنها راه حل میکروسرویس ها نیستند و معماری های دیگر نیز همچنان کاربردهای خاص خود را دارند اما به طور کلی میتوان گفت که در دنیای امروز و با توجه به گسترش نیازهای نرم افزاری و سرعت بالای تغییر در نیازمندی ها، میکروسرویس کاربرد بیشتری نسبت به دیگر معماری ها پیدا کرده است.
اغلب وقتی در مورد میکروسرویس ها حرف زده می شود ذهن به سمت جدا کردن سرویس ها می رود. یعنی همه چیز حول محور سرویس ها و جدا کردن آنها و نحوه تعامل آنها با هم میچرخد و کمتر کسی به عوامل دیگر توجه می کند. حتی در توضیحات بالا که مقدمه ای بر میکروسرویس ها بود نیز بیشتر مسئله حول سرویس ها و جدا سازی آنها بود. اما میکروسرویس فقط همین است؟ یک معمار با درک همین مسئله میتواند یک نرم افزار به به صورت میکروسرویس پیاده سازی کند؟ منابع و بزرگان معماری نظرشان چیست؟
به منظور توسعه برنامههای کاربردی به روش میکروسرویس، باید طراحی را بیشتر از سرویس های مجزا و مستقل تصور کنید. این به این معنی نیست که طراحی سرویس ها را می توان نادیده گرفت. درست همانطور که اتومبیل ها و عابران پیاده برای طراحی یک سیستم ترافیکی ضروری هستند، سرویس ها نیز جزء کلیدی یک سیستم میکروسرویس هستند. اما فکر کردن به شرایط سرویس ها و نحوه پیاده سازی شان به تنهایی کافی نیست. در عوض باید در نظر بگیرید که چگونه تمام جنبه های سیستم می توانند با هم کار کنند تا یک رفتار را شکل دهند. در این سبک معماری رفتارها را میتوان چیزی بیشتر از جمع تک تک سرویس ها دانست. میتوان به آن به چشم رفتار سیستم در زمان اجرا و هنگام بالا بودن نرم افزار نگاه کرد.
یک سیستم میکروسرویس شامل همه چیزهایی در مورد سازمان است که به برنامه ای که تولید می کند مربوط می شود. این به این معنی ست که ساختار سازمان شما، افرادی که در آنجا کار میکنند، نحوه کار و خروجیهایی که تولید میکنند همگی از عوامل مهم سیستم هستند. دقیقا همان طور که عناصر معماری زمان اجرا مانند هماهنگی سرویس، رسیدگی به خطا و شیوه های عملیاتی مهم هستند
علاوه بر گستردگی موضوعی که باید در نظر بگیرید، چالش دیگری نیز وجود دارد که همه این عناصر به هم مرتبط هستند. تغییر در یک قسمت از سیستم میتواند تأثیر پیشبینینشدهای بر قسمت دیگر داشته باشد. به عنوان مثال، تغییر اندازه یک تیم پیاده سازی می تواند تأثیر عمیقی بر کاری که تیم پیاده سازی تولید می کند داشته باشد.
اگر تصمیمات درست را در زمان های مناسب اجرا کنید، می توانید بر رفتار سیستم تاثیر گذاشته و رفتارهای مورد نظر خود را تولید کنید. اما اغلب گفتن آن آسان تر از انجام آن است. دست و پنجه نرم کردن با همه این عناصر سیستم به طور همزمان دشوار است. در واقع، تصور مفهومی تمام بخشهای پویای سیستم میکروسرویس در ذهن، ممکن است دشوار باشد و میتوان گفت برخلاف سادگی ای که میکروسرویس ها در توسعه و تولید یک نرم افزار ایجاد می کنند، سیستم های میکروسرویس و پیاده سازی آنها پیچیده هستند!
دانشمندان نیز زمانی که با سیستم های پیچیده کار می کنند با چالش مشابهی روبرو می شوند. با وجود تمام قطعات به هم پیوسته، درک نحوه کار این قطعات با هم بسیار دشوار است. به طور دقیق تر، پیشبینی نتایجی که میتواند از تغییر در سیستم به وجود بیاید دشوار است. حتی اگر مانند میکروسرویس قطعات سیستم را ماژولار و جدا جدا طراحی کرده باشیم باز هم به دلیل ارتباط تنگاتنگ کارکردی این قطعات با هم کار بسیار دشوار است و در حقیقت این همان چالش اصلی معماری میکروسرویس است.
پس چه میتوان کرد؟ همان کاری که دانشمندان در زمان مواجه با یک مشکل می کنند. مدل طراحی می کنیم.
یک مدل طراحی میکروسرویس شامل پنج بخش است: سرویس ها، راه حل، فرآیند و ابزار، سازمان و فرهنگ.
حال به اختصار در مورد هر یک توضیحاتی می دهیم.
تمام مطالب گفته شده در مورد این مدل طبیعتا میتواند تغییر کند و به سبک نرم افزار مورد نظر در بیاید. اما دلایل ذکر آنها این بود که دیدگاه سطحی را از معماری میکرسرویس برداریم و به آن به چشم فقط یک سیستم متشکل از سرویس های جدا نگاه نکنیم. میکروسرویس در معنای کلی تر یک فرهنگ است که از نحوه ارتباط افراد با هم، تا نحوه کارکرد و توزیع منابع سخت افزاری را تحت تاثیر قرار می دهد و یک معمار نرم افزاری باید به تمام این مسائل اگاهی کامل داشته باشد.
حال به سراغ ابزارها می رویم و سعی می کنیم آشنایی کلی و خلاصه واری از آنها بدست بیاوریم.
ابزارهای زیادی برای ساخت و استقرار میکروسرویس ها وجود دارد، از جمله:
اینها تنها چند نمونه از ابزارهای موجود برای ساخت و استقرار میکروسرویس ها هستند. ابزارها و فناوری های خاص مورد استفاده، به نیازهای خاص یک پروژه و ترجیحات تیم توسعه بستگی دارد. یکی از چالش های معماری میکروسرویس همین تعدد ابزارهای مختلف و نیاز به هماهنگی بین آنها و انتخاب ابزار درست برای نرم افزار می باشد که معمار نرم افزار باید در همان مراحل اولیه تولید نرم افزار بتواند انتخاب خوبی از این ابزارها داشته باشد. البته از نظر تجربه شخصی تولید و توسعه نرم افزار، انتخاب ابزار بیشتر به عهده تیم آن سرویس است و معمار بیشتر نیازسنجی می کند.
کانتینرها روشی سبک و کارآمد برای اجرای برنامهها ارائه میکنند، زیرا آنها فقط شامل حداقل اجزای ضروری مانند کتابخانهها و فایلهای پیکربندی هستند. این بدان معناست که کانتینرها نسبت به ماشینهای مجازی سنتی (VM) بسیار کوچکتر و سریعتر راهاندازی میشوند، که به یک سیستم عامل کامل نیاز دارند و ممکن است چند دقیقه طول بکشد تا راهاندازی شوند.
Containerization روشی برای بسته بندی برنامه های نرم افزاری در کانتینرها است که می توانند به طور مداوم در محیط های محاسباتی مختلف اجرا شوند. ایده کلیدی پشت کانتینریسازی، جداسازی یک برنامه کاربردی و وابستگیهای آن در یک واحد واحد است که به راحتی قابل حمل و اجرا در هر سرویس و یا host ای باشد.
کانتینرها همچنین بسیار قابل حمل هستند، زیرا می توانند با هر سیستمی که دارای محیط اجرا کانتینر است، سازگار باشند. به عنوان نمونه از این محیط های اجرا میتوان به داکر اشاره کرد که در ادامه توضیحاتی در مورد آن نیز داده می شود.
همین مسئله قابل حمل بودن باعث میشود که انتقال کانتینرها بین محیطهای مختلف، مانند لپتاپ توسعهدهنده به محیط آزمایشی یا از محیط آزمایشی به محیط production، آسان شود.
یکی دیگر از مزایای مهم کانتینری سازی این است که به بهبود سازگاری و قابلیت اطمینان استقرار نرم افزار کمک می کند. کانتینرها به توسعه دهندگان این امکان را می دهند که یک برنامه کاربردی و وابستگی های آن را در یک image قرار دهند که می تواند در یک محیط کنترل شده آزمایش و تایید شود. این کمک می کند تا اطمینان حاصل شود که یک برنامه زمانی که در مرحله production استقرار می یابد همانطور که انتظار می رود اجرا شود.
علاوه بر این، کانتینرها نسبت به مجازی سازی سنتی سطح بالاتری از امنیت و ایزوله را ارائه می دهند. کانتینرها در محیط ایزوله خود اجرا می شوند، که به جلوگیری از نقض امنیت و کاهش خطر بدافزار یا سایر کدهای مخرب دیگری که بر سایر کانتینرها یا سیستم میزبان تأثیر می گذارد، کمک می کند.
در نتیجه، کانتینریسازی جزء کلیدی توسعه نرمافزار مدرن است، زیرا راهی انعطافپذیر، کارآمد و ایمن برای بستهبندی و استقرار برنامههای کاربردی نرمافزاری ارائه میدهد. Containerization به بهبود سازگاری و قابلیت اطمینان استقرار نرمافزار کمک میکند و انتقال برنامهها را بین محیطهای مختلف، از توسعه گرفته تا آزمایش و production، آسانتر میکند.
حال که درک کلی از کانتینرها پیدا کردیم به سراغ ارتباط آن با میکروسرویس ها می رویم.
ترکیب کانتینرسازی و ماکروسرویس ها به طور کلی دارای فایده هایی ست:
حال اگر با دقت بیشتری به ارتباط کانتینرها و ماکروسرویس ها نگاه کنیم متوجه می شویم که پیاده سازی معماری ماکروسرویس بدون داشتن کانتینرها تقریبا غیر ممکن است. به همین دلیل کانتینرسازی از مهم ترین مسائلی ست که در این معماری مورد توجه قرار می گیرد و انتخاب ابزار مناسب برای آن از واجبات کار یک معمار است. اما این ابزارها چه هستند؟ در ادامه به معرفی آنها می پردازیم.
ابزارهای کانتینری، فناوری های نرم افزاری هستند که برای ایجاد، مدیریت و اجرای کانتینرها استفاده می شوند. برخی از ابزارهای محبوب کانتینرسازی عبارتند از:
این ابزارها برای ساخت و مدیریت کانتینرها خوب هستند زیرا محیطی سازگار و قابل پیش بینی برای اجرای برنامه ها فراهم می کنند. آنها خودکارسازی استقرار، مقیاس بندی و مدیریت کانتینرها را آسان می کنند که می تواند به بهبود سرعت، قابلیت اطمینان و کارایی تحویل برنامه کمک کند. علاوه بر این، ابزارهای کانتینری اجرای برنامهها در محیطهای مختلف، از جمله مراکز داده داخلی، cluods و محیطهای ترکیبی را ممکن میسازد، که میتواند به بهبود انعطافپذیری و مقیاسپذیری برنامهها کمک کند. دقت داشته باشید که اینها فقط نمونه هایی از ابزارها هستند که به طور عمومی شناخته شده تر می باشند و برای راه اندازی یک سیستم مدیریت و اجرا برای کانتینرها، نیاز به دانش بیشتر و شناختی مناسب از نیازمندی نرم افزار می باشد.
هدف از این مقاله نسبتا مفصل، بررسی خلاصه واری از معماری میکروسرویس، کانتینرها و ارتباط این دو با هم است. هدف این بود که دیدگاه ساده ای که اغلب به میکروسرویس وجود دارد، عمیق تر شود و از حالت یک سیستم متشکل از سرویس های مختلف به ایده تفکری آمیخته با سازمان و فرهنگ تبدیل شود. در ادامه بررسی خلاصه وار ابزارها نیز برای آشنایی بیشتر خواننده و داشتن ایده اولیه برای هر کدام است. طبیعی ست که برای درک بهتر هر کدام نیاز به مطالعه مفصل و عمیق تری ست که نقطه شروع آن میتواند منابع همین مقاله باشد.
در ادامه باید بگویم بعضی مطالب استفاده شده در متن، از دانش کم و تجربه اندک خودم بوده و طبیعتا میتواند دارای اشکال هم باشد. اگر این طور است و نیاز به اصلاح دارد حتما اطلاع بدهید. خوشحال میشم :)