در این مقاله به آموزش نحوه ایجاد یک میکروسرویس (microservice) در C# asp.net core با دیتابیس ردیس (Redis) بصورت کاربردی و پروژه محور پرداخته می شود. منبع آموزشی استفاده شده در این سری مقاله ، آموزش های شرکت مایکروسافت در راستای معماری میکروسرویس و پروژه eShopOnContainers شرکت مایکروسافت و آموزش های استاد بزرگوار Mehmet Özkaya در سایت udemy می باشد . ایده این سری مقاله های آموزشی از این موضوع سرچشمه می گیرد که بخشی از خوانندگان وجود دارد که به محتوای نوشتاری آنلاین بهتر پاسخ می دهند و ترجیج می دهند مهارت های جدید را به سرعت از طریق خواندن افزایش دهند.این سری اموزش ها با ارایه اولین پکیج آموزشی در خصوص مانگودبی آغاز می شود که انتظار می رود با واکنش مثبت کاربران همراه شود.
توجه: این مقاله به مرور زمان، ویرایش و یا تکمیل میشود!
تقاضا: در صورتی که با مشکل تایپی، دستوری و یا مفهومی در این مقاله برخورد کردید، از شما دوست عزیز و گرامی، صمیمانه تقاضا میکنم که اینجانب را مطلع کرده، تا نسبت به تصحیح و یا تکمیل آن، در اسرع وقت، اقدام نمایم. با کمال تشکر جواد جهانگیری
شماره تلفن همراه: 09149431772
نشانی پست الکترونیکی: javad.jahangiri.niopdc@gmail.com
فیلمهای آموزشی در آپارات:جواد جهانگیری (CTO) - آپارات
فیلم آموزشی در یوتویب: javad jahangiri - YouTube
نسخه مقاله: 1.2 - تاریخ بروزرسانی: 1400/11/11
پیشنهاد می شود قبل از این مطالعه این مقاله حتما ابتدا مقاله آموزش ایجاد میکرویس با C# asp.net core با دیتابیس mongo را مطالعه نمایید
در این مقاله آموزشی شروع به توسعه میکروسرویس سبد خرید (Basket) با دیتابیس Redis می کنیم که در شکل بالا نیز مشخص شده است با استفاده از C# asp.net core Web Api application بصورت RestApi یک پروژه ایجاد کرده و عملیات CRUD با استفاده از دیتابیس Redis با الگوی طراحی Repository با معماری چند لایه N-Layer پیداسازی می کنیم و در نهایت این پروژه بر روی یک کانتینر پابلیش شده و داکرایز می شود.
وارد سایت docker hub مطابق شکل زیر می شویم و Redis را جستجو می کنیم و از نتایج نسخه official image را پیدا کرده و مطابق مستندات شروع به نصب می کنیم
مطابق اموزش های قبلی برنامه Docker Desktop را اجرا کرده وارد ترمینال ویندوز شده و ایمیج مربوط را pull می کنیم
بعداز پول شده ایمیج می بایستی در لیست ایمیج های داکردسکتاپ ردیس اضافه شده باشد
سپس از روی مستندات ایمیج Redis مطابق دستور زیر عمل می کنیم
docker run -d -p 6379:6379 --name aspnetrun-redis redis
حالا می توانید از طریق دستور زیر چک کنید که Redis بدرستی اجرا شده است
همچنین می توانید از طریق Docker Desktop نیز اجرا شدن صحیح Redis مطمن شوید
از طریق دستور زیر می توایند به محیط اینتر اکتیو مربوط به شل Redis وارد شوید:
docker exec -it aspnetrun-redis /bin/bash
سپس با وارد کردن Redis-cli وارد خط دستورات Redis می شویم و ادامه اموزش شروع به کار با دستورات Redis می کنیم ،همانطور که می دانید دیتابیس Redis بصورت جفت کلیدهای key/value کار می کند برای تست صحیح بودن عملیات یک کلید بنام name با مقدار javad ایجاد کرده و دوباره اطلاعات ان را به شرح ذیل می خوانیم:
در این قسمت به بررسی معماری Basket Api Microservice پرداخته می شود
در این پروژه Rest Api که قرار استفاده شود به شرح ذیل می باشد:
معماری مربوط به لایه بندی پروژه به شرح ذیل می باشد:
همانگونه که در اول اموزش نیز ذکر شد پیشنهاد می شود حتما قبل از شروع مطالعه این مقاله،مقاله آموزش ایجاد میکرویس با C# asp.net core با دیتابیس mongo را مطالعه نمایید زیرا در حقیقت مقاله جاری پروژه دوم از پروژه eShopOnContainers شرکت مایکروسافت محسوب می شود
و ساختار کلی پروژه نیز به شرح زیر می باشد:
ناگت پکیج های مورد نیاز برای پروژه جاری را در زیر مشاهده می کنید :
پکیج StackExchangeRedis برای ایجاد ارتباط با دیتابیس Redis استفاده می شود.
در این قسمت شروع به برنامه نویسی میکروسرویس سبد خرید می کنیم دیتابیس این میکروسرویس را Redis انتخاب کردیم و این میکروسرویس برای مدیریت سبد خرید و ایتم های داخل سبد خرید و عملیات مربوط به ان می باشد و ایتم های سبد خرید در Redis کش می شوند دلیل اینکه ما در این پروژه از Redis برای کش استفاده کردیم به شرح زیر می باشد:
کش های توزیع شده بصورت اشتراکی بوسیله چندین اپلیکیشن سرور استفاده می شوند و بعنوان یک سرویس می باشد که سایر اپلیکشن ها می تواند از ان استفاده نمایند و همچنین کش توزیع شده باعث افزایش پرفورمانش و مقایس پذیری پروژه های asp.net core می شود علی الخصوص در مواقعی که بر روی فضای ابری قرار می گیرد و یا روی سرور فارم ها استفاده می شود
یک پروژه asp.net core web api بصورت زیر ایجاد می کنیم:
بر روی گزینه create and push کلیک می کنید و بر روی گیت هاب یک مخزن با نام مذکور ایجاد می شود و سورس های پروژه در ان Push می شود
در اولین مرحله نسبت به حذف کنترلر آب و هوا و موجودیت آن اقدام می کنید
پوشه Entities را به پروژه اضافه می کنید و به ترتیب موجودیت های ShoppingCartItem و ShoppingCart به شرح ذیل به پروژه اضافه می کنیم
namespace BasketApiwithRedis.Entities { public class ShoppingCartItem { public int Quantity { get; set; } public string Color { get; set; } public decimal Price { get; set; } public string ProductId { get; set; } public string ProductName { get; set; } } }
using System; using System.Collections.Generic; namespace BasketApiwithRedis.Entities { public class ShoppingCart { public string UserName { get; set; } public List<ShoppingCartItem> Items { get; set; } = new List<ShoppingCartItem>(); public ShoppingCart() { } public ShoppingCart(string username) { this.UserName = username; } public decimal TotalPrice { get { decimal totalprice = 0; foreach (var item in Items) { totalprice += item.Price * item.Quantity; } return totalprice; } } } }
نسبت به نصب پکیج Microsoft.Extensions.Caching.StackExchangeRedis در پروژه برای ارتباط با دیتابیس Redis به شرح زیر عمل می کنیم:
ابتدا تنظیمات مربوط به کانکشن استرینگ به فایل appsetting.json به شرح ذیل اضافه می کنید
سپس به فایل استارت اپ پروژه بصورت ذیل سرویس AddStackExchangeRedisCache بصورت ذیل تنظیم می کنیم:
کد زیر به ConfigServices اضافه می کنید:
// Redis Configuration services.AddStackExchangeRedisCache(options => { options.Configuration = Configuration.GetValue<string>("CacheSettings:ConnectionString"); });
برنامه نویسی Repository Pattern
در این قسمت به برنامه و توسعه دیزاین پترن ریپوزیتوری در میکروسرویس سبد خرید می پردازیم برای این کار یک پوشه بنام Repositories را به پروژه اضافه کرده و یک اینترفیس IBasketRepository به این پوشه اضافه می کنیم و در ادامه ان نیز با کلاس BasketRepository که اینترفیس مذکور را پیاده سازی می کنیم
using BasketApiwithRedis.Entities; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace BasketApiwithRedis.Repositories { public interface IBasketRepository { Task<ShoppingCart> GetBasket(string userName); Task<ShoppingCart> UpdateBasket(ShoppingCart basket); Task DeleteBasket(string userName); } }
توجه شود قبلا از ایجاد کلاس حتما Newtonsoft.Json را توسط PMC نصب شود
using BasketApiwithRedis.Entities; using Microsoft.Extensions.Caching.Distributed; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace BasketApiwithRedis.Repositories { public class BasketRepository : IBasketRepository { private readonly IDistributedCache _redisCache; public BasketRepository(IDistributedCache cache) { _redisCache = cache ?? throw new ArgumentNullException(nameof(cache)); } public async Task<ShoppingCart> GetBasket(string userName) { var basket = await _redisCache.GetStringAsync(userName); if (String.IsNullOrEmpty(basket)) return null; return JsonConvert.DeserializeObject<ShoppingCart>(basket); } public async Task<ShoppingCart> UpdateBasket(ShoppingCart basket) { await _redisCache.SetStringAsync(basket.UserName, JsonConvert.SerializeObject(basket)); return await GetBasket(basket.UserName); } public async Task DeleteBasket(string userName) { await _redisCache.RemoveAsync(userName); } } }
و درنهایت پروژه را کامپایل می کنیم
برنامه نویسی کنترلر
به پروژه یک پوشه بنام Controllers اضافه می کنیم و به ان یک کنترلر بنام BasketController اضافه می کنیم
using BasketApiwithRedis.Entities; using BasketApiwithRedis.Repositories; using Microsoft.AspNetCore.Mvc; using System.Net; using System.Threading.Tasks; namespace BasketApiwithRedis.Controllers { [ApiController] [Route("api/v1/[controller]")] public class BasketController:ControllerBase { private readonly IBasketRepository _repositroy; public BasketController(IBasketRepository repositroy) { _repositroy = repositroy; } [HttpGet("{userName}",Name ="GetBasket")] [ProducesResponseType(typeof(ShoppingCart),(int) HttpStatusCode.OK)] public async Task<ActionResult<ShoppingCart>> GetBasket(string userName) { var basket=await _repositroy.GetBasket(userName); return Ok(basket ?? new ShoppingCart(userName)); } [HttpPost] [ProducesResponseType(typeof(ShoppingCart),(int)HttpStatusCode.OK)] public async Task<ActionResult<ShoppingCart>> UpdateBasket([FromBody] ShoppingCart basket) { return Ok(await _repositroy.UpdateBasket(basket)); } [HttpDelete("{userName}",Name ="DeleteBasket")] [ProducesResponseType(typeof(void), (int)HttpStatusCode.OK)] public async Task<IActionResult> DeleteBasket(string userName) { await _repositroy.DeleteBasket(userName); return Ok(); } } }
درنهایت در فایل Startup.Cs می بایستی IBasketRepository را رجیستر می کنیم :
services.AddScoped<IBasketRepository, BasketRepository>();
تست و اجرای میکروسرویس
وارد ترمینال برنامه می شویم :
مطمن می شویم که کانتنر مربوط به Redis بالا بوده و با پورت 6379 در حال سرویس می باشد و سپس پروژه را اجرا می گیریم و خروجی به شکل زیر قابل مشاهده می باشد:
حال برای تست api اول به شرح ذیل عمل می کنیم :
ومی بایستی خروجی به شکل زیر دریافت کنید:
حالا برای درج اطلاعات در سبد خرید به شرح زیر عمل می کنیم:
{ "userName": "swm", "items": [ { "quantity": 1, "color": "white", "price":950, "productId": "602d2149e773f2a3990b47f5", "productName": "IPhone X" }, { "quantity": 2, "color": "white", "price":840, "productId": "602d2149e773f2a3990b47f6", "productName": "Samsung 10" } ] }
توجه شود کد محصولاتی که در این قسمت وارد می شود یکی از محصولاتی باشد که در مقاله آموزش ایجاد میکروسرویس با C# asp.net core با دیتابیس MongoDB در قسمت Seed داده های استفاده شده است
این مقاله اموزش هنوز تمام نشده است و درحین تهیه می باشد !!!
در دوره های آموزش تضمینی مجتمع فنی ارومیه که به صورت خصوصی و عمومی در دو شیوه حضوری و آنلاین برگزار می شود سرفصل های بسیار متنوع و کاربردی را بصورت پروژه محور آموزش داده می شود تا شخص کارآموز بتواند بلافاصله پس از اتمام این دوره در کمترین زمان ممکن وارد بازار کار شود.
آموزش تخصص ماست با ما حرفه ای شوید
جهت مشاوره با شماره 09149431772 در ارتباط باشید ...