معرفی کتاب: Pro Microservice With .NET 6

1. مقدمه:

سال نو همیشه حال و هوای قشنگی داشته برای من. با اینکه از دیدگاه طبیعی اگر نگاه کنیم گردش چند روز مثل بقیه روزهاست، اما معمولا با بسیاری تصمیمات جدید و حال و هوای خوب شروع میشه. از رنگ قشنگ آسمان گرفته تا حال و هوای کوچه و خیابان همه تازه تازه است و بوی نویی میدن.

بعد از چند روز تعطیلات هم که بر‌گشت به کار و تلاش جاذبه خودشو داره. البته همیشه اولین روزهای کاری بعد از تعطیلات برای من هم جذاب بوده و هم سخت. بعد از چند روز تعطیلات و آسودگی باید مجدد برگردیم سر کار و همه کارها و وظایف گذشته را با قدرت ادامه بدیم. قسمت جذابش دیدن همکارها و شروع مجدد کار و تلاش هست! قسمت غیر جذابش هم اینه که باید بعد از چند روز تعطیلات با قدرت برگردیم سر کار، آخه کی حال داره بعد از تعطیلات با قدرت شروع به کار کنه؟!

از این حرف ها که گذر کنیم می‌رسیم به اصل ماجرا! یکی از تصمیماتی که گرفتم این بود که امسال کمی بیشتر بنویسم! هدف گذاری هم کردم و تعداد نوشته‌ها هم معلوم کردم که امیدوارم بتونم تا آخر سال به این هدف برسم که اگر رسیدم احتمالا جزئیاتش این فرایند هم به اشتراک خواهم گذاشت.

همونطور که از عنوان نوشته مشخص هست اولین نوشته امسال به معرفی کتاب تخصیص داره! کتاب Pro Microservices in .NET 6 از انتشارات Apress که همین سال میلادی جدید منتشر شد و عنوان و زمان نشر نوید کتابی جذاب و خواندنی میده!

قبل از اینکه به سراغ معرفی فصل‌ها و جمع بندی بریم یه نکته‌ای میگم و اینکه معمولا برای مباحث معماری و ... کتاب‌هایی که به یک فریم‌ورک و بستر خاص وابسته هستن را نمی‌پسندم، چون اغلب بیش از اینکه به مفاهیم و آموزش درست الگوها پرداخته بشه، به استفاده از ابزار و ... پرداخته میشه و جان کلامی که منتظر رسیدن به اون هستم در این کتاب‌ها مغفول باقی می‌مونه. اما در مورد این کتاب چند نفر از دوستان و همکارها از من پرسیدن که وقت بذاریم و بخونیم خوبه یا نه، برای اینکه بتونم نظر درستی بدم از تعطیلات 5 روزه استفاده کردم و کتاب رو مطالعه کردم، اینجا مطالب کتاب رو به اختصار خدمت همه به اشتراک می‌ذارم و تصمیم راجع به خواندن یا نخواندن کتاب رو به خوانندگان محترم واگذار می‌کنم!

2. معرفی اولیه کتاب:

کتاب در 9 فصل و 310 صفحه نوشته شده که 291 صفحه مطالب اصلی و الباقی صفحات شروع و پایان کتاب و ... هست. در توضیحات اولیه قید شده که همراه با مثال عملی و مناسب برای افرادی که تمایل به توسعه سیستم‌های توزیع شده دارن هست. اگر با پیش داوری جلو بریم می‌گم 291 صفحه برای کتابی در زمینه ‌میکروسرویس که حجم زیادی از این 291 صفحه به کد تخصیص داده شده احتمالا کمتر از چیزی هست که قرار باشه مفاهیم عمیقی به ما آموزش بده. اما به هر حال برای یافتن حقیقت ماجرا باید تا انتهای کتاب برسیم و بعد بتونیم قضاوت صحیحی داشته باشیم.

3. فصل اول معرفی میکروسرویس‌ها:

فصل اول این کتاب هم مثل بسیاری از کتاب‌های دیگه با معرفی اجمالی شروع میشه، در مورد این صحبت میشه که اصلا میکروسرویس چی هست و چرا باید به سمت میکروسرویس حرکت کنیم! از مزایای جذاب میکروسرویس میگه و بعد هم کمی در مصائب و سختی‌های توسعه میکروسرویس قلم فرسایی میشه. در ادامه فصل یک به طور کلی برخی از الگوهایی که هنگام توسعه میکروسرویس‌ها پرکاربرد هستن معرفی میشن. الگوهایی و روش‌هایی که معرفی شده به طول اجمالی شامل موارد زیر میشن:

  • ارائه API f به کمک API Gateway
  • ارائه APIهای تخصصی با Back-end for front-end
  • تنظیمات و نگهداری آنها و به طول عمومی External Configuration
  • ارتباط RPC
  • انتقال داده و فرمت‌های پیام
  • انواع تست‌ها
  • انتشار و استفاده از Docker
  • بررسی صحت عملکرد و Logging, Monitoring و Altering

البته از این فصل توقع عمق آموزشی نداریم و صرفا آشنایی با نام‌ها و کاربرد این الگوها هدف ارائه در این فصل هست.

4. فصل دوم ASP.NET Core

فصل دوم کتاب اما کلا از فضای میکروسرویس خارج شده و به معرفی ASP.NET Core 6 و مزایا، معایب و ویژگی‌های جدید اون میپردازه و اگر قبلا با دات نت کار کردید این فصل چیز جدیدی برای ارائه نداشته و به راحتی و بدون نگرانی از اینکه نکته خاصی از دست بدید میتونید از این فصل عبور کنید.


5. فصل سوم در جستجوی میکروسرویس‌ها:

یکی از سخت ترین کارهایی که هنگام توسعه میکروسرویس با اون سر و کار داریم پیدا کردن محدوده سرویس‌‌هایی هست که داریم. مبحثی که در فصل سوم از کتاب به آن پرداخته شده.

ابتدا توضیحاتی مختصر در مورد کاربر DDD برای شناسایی محدوده و تکنیک‌های اون ارائه میشه، مواردی مثل Domain, Subdomain, UL, Bounded Context و ... از عمده مطالبی هستن که در مورد DDD بیان شدن.

بعد کتاب به سراغ معرفی Event Storming‌ به عنوان تکنیکی جهت مکاشفه در دامنه میره. کلیات چیستی Event Storming و بیان نحوه برگزاری ورکشاپ به طور خیلی سریع در این قسمت اتفاق افتاده.

درادامه این فصل در مورد کسب و کاری که قرار هست مثال‌های کتاب در مورد اون کسب و کار باشه هم صحبت شده و آمادگی لازم جهت ادامه مطالب ایجاد شده.


6. فصل چهارم توسعه اولین میکروسرویس:

کتاب در فصل چهارم خیلی سریع به سراغ اولین میکروسرویس رفته و اگر از اینجا به بعد قرار باشه با کتاب همراه بشیم باید دست به کد بشیم. پس قبل اینکه سراغ این فصل بریم باید سیستم خودمون رو برای توسعه آماده کنیم. در این فصل اولین سرویس از مجموعه سروریس‌های مورد نیاز توسعه داده میشه. سرویسی که در اون قرار هست از APIهای گوگل استفاده کنیم و فاصل و ... محاسبه بشه و در اختیار سایر بخش‌ها قرار بگیره. هدف اصلی این فصل آموزش ارتباط Sync و کاربرد Rest و Json‌ در برقراری ارتباطهای داخلی سرویس‌ها هست.

برای اینکه کتاب به هدف خودش برسه ابتدا راجع به Inter-process Communication صحبت شده و سختیها و پیچیدگی‌های ارتباط میکروسرویس ها بیان شده. در ادامه در مورد فرمت Json‌برای فرمت انتقال پیام و Rest و gRPC به عنوان بستر انتقال پیام مطرح شده.

به عنوان کار عملی سرویس محاسبه مسافت به کمک گوگل پیاده سازی شده و به کمک Rest و gRPC این سرویس در اختیار سایرین قرار گرفته.


7. فصل پنجم ارتباط Async:

ارتباطات Sync همیشه به عنوان چالشی در توسعه سیستم‌های توزیع شده مطرح بودن و اغلب در شرایطی که امکان این کار وجود داشته باشه تلاش میشه که با ارتباط Async جایگزین بشن. فصل پنجم این کتاب هم سراغ همین موضوع رفته و در مورد ارتباط Async صحبت به میان آورده.

اول از همه بحث در مورد معایب روش‌های Sync انجام شده و بعد روش برقراری ارتباط Async به عنوان حلال مشکلات در این کتاب معرفی شده. قابلیت‌هایی مثل توزیع پذیری بهتر، وابستگی کمتر و بافرکردن پیام‌ها از عمده مطالبی هستن که در این فصل به عنوان مزایای اترباط Async شمرده میشن. در ادامه در مورد انواع پیام‌ها مثل Command, Query, Event صحبت شده و اینکه هر کدام از این پیام‌ها چه کاربرد و شرایطی دارن.

بعد هم کتاب به برخی چالش‌ها و مشکلاتی که هنگام ارسال پیام‌ها به صورت Async‌خواهیم داشت، پرداخته است. مطالبی مثل اینکه چطور مطمئن شویم پیام یک باید یا حداقل یک بار ارسال می‌شود؟ یا اینکه اگر پیام‌ها با ترتیب صحیح ارسال نشود چه چالشی خواهیم داشت!

فصل با یک مثال به پایان رسیده است. مثال این فصل در مورد سرویس‌های صورت حساب و پرداخت است و برای پیاده سازی این مثال‌ها از Masstransit به همراه RabbitMQ استفاده شده است. پس برای پیاده سازی مثال این فصل به جز دات نت به RabbitMQ‌هم نیاز پیدا خواهید کرد. البته اگر داکر نصب داشته باشید کار ساده خواهد بود و بدون مشکل مثال این فصل هم پیاده سازی خواهد شد.

8. فصل ششم داده‌های توزیع شده:

تا زمانی که داده‌ها در یک دیتابیس نگهداری می‌شود بسیاری از چالش‌ها از دید توسعه دهنده پنهان است. اما هنگامی که سراغ سیستم توزیع شده می‌رویم کارهای ساده ای مثل پیاده سازی یک فرایند به صورت Transactional یا یک کوئری تجمیعی گرفتن تبدیل به کابوس‌های وحشتناکی خواهند شد. موضوع داده‌های توزیع شده بحث اصلی این فصل است. الگو‌های زیادی در این فصل معرفی می‌شود. در مورد اینکه اگر دیتابیس‌ها مشترک باشد چه اتفاقی رخ می‌دهد صحبت می‌شود. در مورد تئوری CAP بحث به میان آمده و در ادامه برای مدیریت تراکنش‌ها الگوی SAGA معرفی می‌شود.

سپس به سراغ الگوی CQRS و جداسازی و فرایند‌های خواندن و نوشتن ‌میرود. در مورد اینکه این کار می‌تواند در سطوح مختلف و با شرایط متفاوت انجام شود گفتگو می‌شود و بعد از پایان بحث در مورد CQRS طبق روال بسیاری از کتابها و مقالات مستقیم وارد Event sourcing می‌شود. بعد از اینکه بحث در مورد این دو الگو به پایان می‌رسد کتاب در مورد Eventual Consistency صحبت به میان می‌آورد اینکه بعضا در سیستم‌های توزیع شده چاره‌ای جز پذیرش این موضوع نداریم.

البته کتاب در این فصل بیان می‌کند که بحث در مورد داده‌های توزیع شده فراتر از یک فصل از این کتاب است و در عوض یک کتاب بسیار عالی برای مطالعه در این زمینه معرفی می‌کند. کتاب The Art of Immutable Architecture کتابی است که در این فصل معرفی می‌شود که از نظر شخصی من کتابی بسیار عالی و آموزنده است و خواندن آن برای هر کسی که با سیستم‌ها و داده‌های توزیع شده سر و کار دارد واجب است.


9. فصل هفتم تست میکروسرویس‌ها

شاید تا 10 - 12 سال پیش اگر کتابی قرار بود در مورد تست صحبت به میان آورد ابتدا باید چند فصلی را به این مورد می‌پرداخت که تست خوب است و باید برای آن زمان گذاشته شود و ...

اما این روزها دیگر در هر تیم توسعه‌ای پذیرفته شده است که باید تست خودکار داشت و برای توسعه تست هم به اندازه توسعه و چه بسا بیشتر باید زمان و هزینه در نظر گرفته شود و داشتن تست دیگر صرف زمان و هزینه بیهوده در نظر گرفته نمی‌شود بلکه بخشی از سرمایه گذاری بلند مدت و پر بازده هر پروژه نرم‌افزاری است. به همین دلیل کتاب در مزایای تست نویسی مطلبی بیان نمی‌کند بلکه فورا به سراغ خود مبحث تست می‌رود. ابتدا به این مطلب می‌پردازد که احتمال خطا در سیستم‌های توزیع شده بالاست و بدون تست یافتن خطاها بسیار مشکل خواهد بود.

در ادامه به سراغ سطوح تست می‌رود و هرم تست معرفی می‌شود و اینکه در هر سطح از این هرم چه مقدار تست خواهیم داشت و هر تست چه هزینه و آورده‌ای برای پروژه به ارمغان می‌آورد.

در بخش بعد به سراغ Contract Test رفته و با معرفی خیلی سریع از Consumer Driven Contract Testing به سراغ یک مثال عملی می‌رود. در این قسمت برای APIهایی که ارائه شده است به کمک PactNetمثال عملی ارائه می‌شود که اگر با این مبحث آشنایی نداشته باشیم در این مثال خیلی سریع و ساده این موضوع آموزش داده می‌شود که به نظرم شخص خودم ن یکی از بهترین بخش‌های کتاب است.

بعد از پایان این قسمت هم به سراغ یک مثال عملی برای پیاده سازی تست در محیط ارتباطی Async می‌رود.

10. فصل هشتم انتشار میکروسرویس‌ها و داکر:

در این فصل به مبحث انتشار میکروسریس‌ها پرداخته می‌شود. داکر ابزار اصلی و مناسب جهت انتشار میکروسرویسها است که در این فصل در مورد آن گفتگو شده است. ابتدا در مورد چرایی نیاز به کانتینرها صحبت به میان آمده است. سپس در مورد اینکه داکر چیست و چگونه نصب می‌شود گفتگو شده است. در ادامه برخی دستورات بسیار پر کاربرد داکر برای اجرا و توقف کانتینرها و دیدن Image ها و ... معرفی شده است.

در بخش بعدی نیز در مورد کوبرنتیز و چیستی آن و چگونگی استفاده از آن صحبت به میان آمده است که مبتنی بودن بر Azure‌ در این قسمت شاید اصلی ترین چالش ما در ایران باشد.


11. فصل نهم سلامت میکروسرویس‌ها:

آخرین فصل از کتاب نیز به مباحثی می‌پردازد که در توسعه هر نرم‌افزاری بسیار مهم است و در هنگام استفاده از سیستم‌های توزیع شده حیاتی‌تر به نظر می‌رسند.

ابتدا در مورد سلامت سرویس‌ها و اینکه چه شرایطی ممکن است باعث عدم دسترسی و صحت عملکرد میکروسرویس‌ها شود صحبت به میان می‌آید.

در ادامه در مورد اینکه Log چیست و چه کاربردی دارد و اینکه چگونه به کمک Serilog در ASP.NET Core می‌توانیم Log داشته باشیم بحث شده است.

در بخش بعد در مورد Metricها صحبت به میان می‌آید. ما به کمک Log می‌توانیم یک رخداد را با جزیئات مورد بررسی قرار دهیم. اما اگر بخواهیم دید کلی از نرم‌افزار خود داشته باشیم باید سراغ Metricها برویم و مباحث را به صورت تجمیعی مورد مطالعه قرار دهیم. در این قسمت Prometheus و نحوه استفاده از آن در ASP.NET Core بررسی شده است.

به عنوان بخش بعدی هم کتاب در مورد Tracing مباحثی را به میان آورده و اینکه چگونه به کمک Tracing می‌توان فرایند پردازش درخواست‌ها بین سروریس‌های مختلف را مورد بررسی قرار داد. در این بخش در مورد OpenTelemetry و استفاده از آن در .NETنیز سخن‌هایی به میان آمده است.

این فصل از کتاب با مباحث مانیتورینگ موثر در سیستم‌های توزیع شده و دیباگ کردن پروژه‌ها به کمک لاگ به پایان رسیده است.

12. جمع بندی:

این تمام آن چیزی بود که در این کتاب مطالعه می‌کنید. به عنوان یک خواننده چند نکته نهایی در مورد این کتاب به ذهنم می‌رسد که بیان می‌کنم.

در صورتی که بخواهید کد‌های کتاب را پیاده سازی نکنید و صرفا مطالعه تئوری داشته باشید، مطالعه این کتاب را چندان پیشنهاد نمی‌کنم چون مطالب بسیار سطحی و اجمالی بیان شده است.

اما اگر توسعه دهنده دات نت باشید و کدهای ارائه شده را پیاده سازی کنید ماجرا متفاوت خواهد بود. برای پیاده سازی کدها اگر از روش Copy & past programming استفاده کنیم برای هر فصل حدود 1.5 تا 2 ساعت زمان نیاز داریم و در صورت نوشتن دستی به حدود 4 ساعت زمان نیاز است. با توجه به اینکه ابزارهایی که معرفی شده است بسیار پر کاربرد است و در قالب یک مثال عملی بدون هیچ تکلف و سختی ابزار مورد استفاده قرار گرفته است برای شروع کار می‌تواند بسیار راهگشا و جذاب باشد.

در کل به عنوان یک کتاب کامل از این کتاب نباید توقع داشته باشیم. ولی اگر بخواهیم خیلی سریع با الگوها و روش‌های توسعه میکروسرویس‌ها آشنایی پیدا کنیم کتاب مناسب و کاربردی خواهد بود.

با آرزوی سالی پر از موفقیت و سلامتی برای همه!