آموزش میکروسرویس Microservice - شروع پیاده سازی یک پروژه فروشگاهی (بخش چهارم)

بخش اول : آشنایی با مفهوم میکروسرویسبخش دوم : ویژگی های اصلی یک میکروسرویسبخش سوم : تحلیل یک پروژه کوچک بر اساس میکروسرویس هابخش چهارم : شروع پیاده سازی یک پروژه فروشگاهی (همین مقاله)پیشنیاز 1 بخش پنجم : آموزش Node و Typescript برای تولید apiپیشنیاز 2 بخش پنجم : آموزش داکر و مفاهیم اولیهبخش پنجم : پیاده سازی یک میکروسرویس برای نمایش کالاهاپیشنیاز 1 بخش ششم : آشنایی با Asp.net core 6 بخش ششم : پیاده سازی یک میکروسرویس برای کار با سبد خریدبخش هفتم : پیاده سازی یک میکروسرویس برای محاسبه قیمت و تخفیفاتبخش هشتم: پیاده سازی یک میکروسرویس برای ثبت سفارشبرای دیدن ویدیوهای من در مورد برنامه نویسی عضو این کانال شوید : https://t.me/mediapub_channelطبیعتا در این نوشته و نوشته های بعدی فرصت پرداختن به شکل کد نویسی یا رعایت اصول برنامه نویسی و معماری Clean نیست. هدف پیاده سازی بخشی از یک پروژه فروشگاهی است که بتوانیم به کمک آن از معماری میکروسرویس سر در بیاوریم. مثال پیش رو با هدفی کاملا آموزشی تهیه شده است و در طی چندین مقاله به پیاده سازی آن خواهیم پرداخت. از حاشیه و یا مقدمات برنامه نویسی در روند نگارش این مقالات خودداری کردم که سریعتر و جامعتر تنها به اصول طراحی میکروسرویس ها پرداخته شود.یک سیستم ثبت کالا در سبد و ثبت سفارشقرار است چهار پروژه میکروسرویس تهیه کنیم که هر کدام دیتابیس خودش را دارد.از دیتابیس و زبان های برنامه نویسی متنوع استفاده میکنیم تا کاملا نسبت به مستقل بودن این معماری از ابزار کدنویسی مطمئن شوید. در ادامه به شرح این سیستم می پردازیم.سیستم فوق به وسیله میکروسرویس Catalog.Api اطلاعات مربوط به کالا را ذخیره و تغییر و نمایش می دهد. دیتابیس این میکروسرویس Mongo است. فرض کنید به این دلیل این انتخاب صورت گرفته که اولا حجم اطلاعات زیادی داریم و ثانیا ساختار کاملا مشخصی برای استراکچر هر کالا نداریم یا اگر هم داریم ممکن است در آینده تغییر کند. نکاتی مثل کوئری های سریعتر و انعطاف پذیری هم در کنار این مزایا بگذارید. تصمیم داریم به دلیل در اختیار داشتن یک تیم برنامه نویسی مسلط به Javascript از Node برای پیاده سازی این میکروسرویس استفاده کنیم. برای درست کردن این میکروسرویس سه مرحله در پیش داریم. اول آماده سازی دیتابیس دوم آماده سازی api ها به کمک Node و سوم داکرایز کردن پروژه و ایجاد ایمیج(image) و به تبع آن کانتینر(container). این سه مرحله در سه میکروسرویس بعدی نیز باید رعایت شود.اگر نمیدانید داکر چیست چیز خاصی از دست نداده اید. اگر در قدیم با سی دی(صفحه نوری) کار کرده باشید امکانی وجود داشت که از سی دی ایمیج بگیریم و فایل ISO بسازیم. در سیستم عامل ها این امکان وجود دارد که ایمیج یک CD را به شکل یک درایو مجازی Mount کنیم یا به تعبیری اجرا کنیم. همین روند را میتوان با پروژه هم انجام داد. یعنی پروژه معادل یک سی دی است. به کمک داکر از پروژه یک ایمیج میگیریم که حاوی اطلاعات برنامه (فایل اجرایی و ملحقات) و کتابخانه های مورد نیاز است. این ایمیج روی هر سیستمی بدون نیاز به نصب فریم ورک یا کتابخانه خاصی، قابل Mount شدن است به شرط آنکه داکر روی آن سیستم نصب باشد. این کار را کانتینرایز کردن میگویند. به تعبیری انگار image را اجرا کرده ایم. این اجرا روی مثلا یک آی پی و پورت خاص صورت میگیرد.خروجی عینا شبیه npm start در نود یا dotnet run در دات نت یا flask run در فلاسک خواهد بود و پروژه شما روی آی پی و پورت مشخصی اجرا خواهد شد.نگران نباشید، قبل از این بخش این مقاله را بخوانید. همچنین حین پیاده سازی هر میکروسرویس با روند داکرایز کردن آن آشنا خواهید شد.میکروسرویس بعدی Basket.Api است. وظیفه این سرویس ذخیره کردن سبد کالای کاربر است. محل نگهداری دیتابیسِ سریع و موقت (و انقلابی!) Redis است که Data Store اختصاصی همین میکروسرویس است. ما دات نت را برای توسعه این میکروسرویس انتخاب کرده ایم. در بخش مربوط به این میکروسرویس در مورد مزایای انتخاب Redis و ویژگی های دات نت صحبت خواهیم کرد. همچنین برای نهایی کردن سبد خرید از RabbitMQ استفاده میکنیم و اطلاعات سبد را برای ثبت سفارش به میکروسرویس Ordering.Api ارسال میکنیم. در این روش میکروسرویس Ordering.Api به event مرتبط با این عملیات گوش میکند (Subscribe میشود) و هر موقع رویداد نهایی کردن سبد رخ داد، عملیات ثبت سفارش را انجام میدهد. این عملیات در بک گراند اتفاق می افتد و به شکل Asynchronous انجام میشود. در مورد علت و روش این مکانیزم در بخش مربوطه توضیح خواهم داد. همچنین این میکروسرویس به کمک gRPC با میکروسرویس Discount.Api ارتباط داخلی دارد. در مورد gRPC و علت کاربرد آن در این محل، بعدا توضیح خواهم داد.میکروسرویس بعدی Discount.Api است که وظیفه در اختیار قرار دادن اطلاعات تخفیف و قیمت کالا را به عهده دارد. دات نت را برای این بخش انتخاب کرده ایم. به کمک روش gRPC از طریق Basket.Api یک درخواست داخلی به این میکروسرویس ارسال میکنیم و اطلاعات سبد را میدهیم تا این میکروسرویس بتواند قیمت اقلام و قیمت نهایی را محاسبه کند و ریسپانس مناسب تولید کند. gRPC و تفاوت آن با Http Request معمولی در بخش مرتبط با این میکروسرویس توضیح داده خواهد شد. همچنین اطلاعات در این بخش در یک دیتابیش PostgreSql ذخیره میشود. میکروسرویس بعدی Ordering.Api است که با زبان برنامه نویسی پایتون و فریم ورک Flask پیاده سازی خواهیم کرد. دیتابیسی که برای این بخش انتخاب کرده ایم Sql Server است. این بخش یک شنونده برای RabbitMQ است و بر اساس اتفاقاتی که در event موجود در سرویس Basket.Api می افتد تغییراتی به دیتابیس اعمال میکند. همچنین این میکروسرویس مسئول تولید گزارش و لیست هایی از سفارشات ثبت شده در دیتابیس خودش است.همچنین مدیریت پراکسی برای این پروژه به عهده Ocelot است که به موقع با آن و مکانیزم aggregate آشنا میشویم. ما از بیرون فقط به سرویس هایی که این Gateway به بیرون اعلام کرده دسترسی داریم.تمامی این مجموعه به کمک docker نگهداری میشود. ما از docker-compose برای مدیریت این سرویس ها استفاده خواهیم کرد.اگر در مورد هر کدام از دیتابیس ها یا RabbitMQ یا gRPC یا ocelot Gateway اطلاعاتی ندارید نگران نباشید. در هر بخش به تفصیل به ابزاری که استفاده میکنیم خواهیم پرداخت.در بخش بعد با اولین میکروسرویس یعنی Catalog.Api شروع میکنیم.