جواد جهانگیری
جواد جهانگیری
خواندن ۱۲ دقیقه·۳ سال پیش

ایجاد میکرو سرویس با C# asp.net core با Redis

به نام آن که جان را فکرت آموخت / چراغ دل به نور جان برافروخت

در این مقاله به آموزش نحوه ایجاد یک میکروسرویس (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 را مطالعه نمایید

https://vrgl.ir/2S6vB

در این مقاله آموزشی شروع به توسعه میکروسرویس سبد خرید (Basket) با دیتابیس Redis می کنیم که در شکل بالا نیز مشخص شده است با استفاده از C# asp.net core Web Api application بصورت RestApi یک پروژه ایجاد کرده و عملیات CRUD با استفاده از دیتابیس Redis با الگوی طراحی Repository با معماری چند لایه N-Layer پیداسازی می کنیم و در نهایت این پروژه بر روی یک کانتینر پابلیش شده و داکرایز می شود.

Redis

  • یک دیتابیس اوپن سورس از نوع NoSQL می باشد
  • مخفف Remote Dictionary Server است
  • بصورت جفت های key-value طراحی شده است
  • یک Data Structure Server محسوب می شود
  • فوق العاده سریع می باشد
  • امکان ذخیره داده هم روی RAM و هم Disk را دارد
  • دارای امکانات تجاری از قبیل sharding , Cluster, Sentinel, Replication می باشد
  • اگر بخواهیم بصورت حرفه ای بررسی کنیم تا این لحظه ن بصورت async کار نمی کند و بصورت (Single instance ) کار می کند و اجرای دستورات بصورت async در افزایش پرفورمانس آن زیاد تاثیر گذار نیست
  • با توجه به میزان اندازه داده ها به فضای رم نیازمند هستید
  • کوری های پیشرفته و پیچیده همانند دیتابیس های رابطه ای را پشتیبان نمی کند و در تراکنش ها (transaction) حالت Rollback را پشتیبانی نمی کند و اگر خطای رخ دهد بجای رول بک بقیه دستورات را اجرا می کند.

نحوه نصب و راه اندازی Redis در Docker

وارد سایت docker hub مطابق شکل زیر می شویم و Redis را جستجو می کنیم و از نتایج نسخه official image را پیدا کرده و مطابق مستندات شروع به نصب می کنیم

مطابق اموزش های قبلی برنامه Docker Desktop را اجرا کرده وارد ترمینال ویندوز شده و ایمیج مربوط را pull می کنیم

بعداز پول شده ایمیج می بایستی در لیست ایمیج های داکردسکتاپ ردیس اضافه شده باشد

سپس از روی مستندات ایمیج Redis مطابق دستور زیر عمل می کنیم

docker run -d -p 6379:6379 --name aspnetrun-redis redis

حالا می توانید از طریق دستور زیر چک کنید که Redis بدرستی اجرا شده است

همچنین می توانید از طریق Docker Desktop نیز اجرا شدن صحیح Redis مطمن شوید

نحوه وارد شدن به Redis-cli

از طریق دستور زیر می توایند به محیط اینتر اکتیو مربوط به شل 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 استفاده می شود.


برنامه نویسی میکروسرویس Basket.API

در این قسمت شروع به برنامه نویسی میکروسرویس سبد خرید می کنیم دیتابیس این میکروسرویس را Redis انتخاب کردیم و این میکروسرویس برای مدیریت سبد خرید و ایتم های داخل سبد خرید و عملیات مربوط به ان می باشد و ایتم های سبد خرید در Redis کش می شوند دلیل اینکه ما در این پروژه از Redis برای کش استفاده کردیم به شرح زیر می باشد:

  • distributed cache

کش های توزیع شده بصورت اشتراکی بوسیله چندین اپلیکیشن سرور استفاده می شوند و بعنوان یک سرویس می باشد که سایر اپلیکشن ها می تواند از ان استفاده نمایند و همچنین کش توزیع شده باعث افزایش پرفورمانش و مقایس پذیری پروژه های asp.net core می شود علی الخصوص در مواقعی که بر روی فضای ابری قرار می گیرد و یا روی سرور فارم ها استفاده می شود

یک پروژه asp.net core web api بصورت زیر ایجاد می کنیم:

بر روی گزینه create and push کلیک می کنید و بر روی گیت هاب یک مخزن با نام مذکور ایجاد می شود و سورس های پروژه در ان Push می شود

https://github.com/javadjahangiriniopdc/BasketApiwithRedis

در اولین مرحله نسبت به حذف کنترلر آب و هوا و موجودیت آن اقدام می کنید

پوشه 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 به شرح زیر عمل می کنیم:

نحوه ایجاد کانکشن به دیتابیس Redis

ابتدا تنظیمات مربوط به کانکشن استرینگ به فایل appsetting.json به شرح ذیل اضافه می کنید

سپس به فایل استارت اپ پروژه بصورت ذیل سرویس AddStackExchangeRedisCache بصورت ذیل تنظیم می کنیم:

کد زیر به ConfigServices اضافه می کنید:

// Redis Configuration services.AddStackExchangeRedisCache(options => { options.Configuration = Configuration.GetValue<string>(&quotCacheSettings:ConnectionString&quot); });

برنامه نویسی 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(&quotapi/v1/[controller]&quot)] public class BasketController:ControllerBase { private readonly IBasketRepository _repositroy; public BasketController(IBasketRepository repositroy) { _repositroy = repositroy; } [HttpGet(&quot{userName}&quot,Name =&quotGetBasket&quot)] [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(&quot{userName}&quot,Name =&quotDeleteBasket&quot)] [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 اول به شرح ذیل عمل می کنیم :

ومی بایستی خروجی به شکل زیر دریافت کنید:


حالا برای درج اطلاعات در سبد خرید به شرح زیر عمل می کنیم:

{ &quotuserName&quot: &quotswm&quot, &quotitems&quot: [ { &quotquantity&quot: 1, &quotcolor&quot: &quotwhite&quot, &quotprice&quot:950, &quotproductId&quot: &quot602d2149e773f2a3990b47f5&quot, &quotproductName&quot: &quotIPhone X&quot }, { &quotquantity&quot: 2, &quotcolor&quot: &quotwhite&quot, &quotprice&quot:840, &quotproductId&quot: &quot602d2149e773f2a3990b47f6&quot, &quotproductName&quot: &quotSamsung 10&quot } ] }

توجه شود کد محصولاتی که در این قسمت وارد می شود یکی از محصولاتی باشد که در مقاله آموزش ایجاد میکروسرویس با C# asp.net core با دیتابیس MongoDB در قسمت Seed داده های استفاده شده است

https://vrgl.ir/2S6vB


این مقاله اموزش هنوز تمام نشده است و درحین تهیه می باشد !!!

باتشکر از مطالعه این مقاله ,مثل همیشه کنجکاو باشید!!!

در دوره های آموزش تضمینی مجتمع فنی ارومیه که به صورت خصوصی و عمومی در دو شیوه حضوری و آنلاین برگزار می شود سرفصل های بسیار متنوع و کاربردی را بصورت پروژه محور آموزش داده می شود تا شخص کارآموز بتواند بلافاصله پس از اتمام این دوره در کمترین زمان ممکن وارد بازار کار شود.
آموزش تخصص ماست با ما حرفه ای شوید
جهت مشاوره با شماره 09149431772 در ارتباط باشید ...
https://www.aparat.com/javadjahangiriniopdc/playlists


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