Microservice ها با استفاده از ASP.NET Core

Microservice

در این مقاله، مفهوم Microservice ها، معماری آن ها، و نحوه ی ایجاد میکروسرویس ها با استفاده از ASP.NET Core و سی شارپ را خواهیم آموخت.

Microservice ها

لفظ Microservice ها یک شیوه ی توسعه ی نرم افزار را توصیف می کند که از روند های معاصر، به تنظیم روش هایی که به منظور افزایش سرعت و کارآیی توسعه و مدیریت راه حل های نرم افزاری در مقیاس مناسب رشد و ارتقاء یافته است.

موضوع میکروسرویس ها بیشتر در رابطه با اعمال تعداد مشخصی از قوانین و الگوهای معماری به عنوان معماری می باشد.

هر میکروسرویس زندگی مجزایی دارد، اما از سوی دیگر، به یکدیگر نیز متکی هستند.

تمامی میکروسرویس ها در یک پروژه با سرعت خود، مبتنی بر ابر، بصورت مجزا، با زندگی در کنار هم، در روند تولید استقرار می یابند.

معماری میکروسرویس ها

تصویر زیر از Microsoft Docs سبک معماری Microservice ها را نشان می دهد.

Microservice Using ASP.NET Core

جدای از خود Microservice ها، کامپوننت های مختلفی در یک معماری میکروسرویس ها وجود دارد.

Management : گره ها را برای سرویس نگه می دارد.

Identity Provider : اطلاعات هویتی را مدیریت کرده و سرویس های احراز هویت را درون یک شبکه ی توزیع شده فراهم می کند.

Service Discovery  : بر سرویس ها و آدرس سرویس ها و نقاط پایانی نظارت می کند.

API Gateway (درگاه رابط برنامه نویسی کاربردی): به عنوان نقطه ی ورودی سرویس گیرنده عمل می کند.

تنها نقطه ی تماس از سرویس گیرنده که در عوض، پاسخ هایی را از Microservice  های زیرین و گاها یک پاسخ تجمعی را از چندین میکروسرویس زیرین برمی گرداند.

CDN : یک شبکه ی تحویل محتوا جهت خدمت به منابع ایستا است. برای مثال صفحات و محتوای وب در یک شبکه ی توزیع شده.

Static Content (محتوای ایستا) : منابع ایستا مانند صفحات و محتوای وب.

Microservice ها بصورت مجزا به همراه پایگاه داده ی خود به ازای هر سرویس استقرار می یابند، لذا میکروسرویس های زیرین به شکلی که در تصویر زیر نشان داده شده می باشند.

Microservice Using ASP.NET Core02

معماری یکپارچه در مقابل معماری میکروسرویس ها

برنامه های یکپارچه بیشتر یک بسته ی تکی کامل هستند که دارای تمامی کامپوننت ها و سرویس های مورد نیاز مربوطه بصورت کپسوله شده در یک بسته می باشند.

در ادامه نمایش نموداری معماری یکپارچه بصورت کاملا بسته بندی یا مبتنی بر سرویس آورده شده است.

Monolithic vs Microservices Architecture

Microservice ، رویکردی ست جهت ایجاد سرویس های کوچک که هر یک در فضای خود اجرا شده و قادر به برقراری ارتباط از طریق پیام رسانی می باشند.

این ها سرویس هایی مستقل هستند که پایگاه داده ی خود را بطور مستقیم فراخوانی می کنند.

در ادامه نمایش نموداری معماری میکروسرویس ها آمده است.

Microservice

در معماری یکپارچه، پایگاه داده برای تمامی کارکردها یکسان باقی می ماند، حتی اگر یک رویکرد معماری سرویس گرا دنبال شود، در حالیکه در Microservice ها، هر سرویس پایگاه داده ی خود را خواهد داشت.

Docker Containers و نصب Docker

Docker Containers و دیگر نمونه ها، منابع سیستم عامل را تقسیم می کنند، برای مثال پشته ی شبکه، فضای نام پردازش ها، سلسله مراتب سیستم فایل ها و پشته ی حافظه.

Docker ها بیشتر به مجازی سازی سیستم عامل می پردازند.

در اینجا بیشتر در رابطه با dockerها بیاموزید. این URL را باز کرده و از هاب Docker بر روی Download کلیک کنید.

هنگامی که دانلود شد، وارد Docker شده و دستورالعمل ها را جهت نصب Docker برای ویندوز دنبال کنید.

میکروسرویس ها با استفاده از ASP.NET Core

این بخش، نحوه ی ایجاد مرحله به مرحله ی یک Product microservice را با استفاده از ASP.NET Core به کمک تصاویر نشان خواهد داد.

این سرویس با استفاده از ASP.NET Core 2.1 و Visual Studio 2017 ساخته خواهد شد.

ASP.NET Core بصورت یکپارچه شده با VS 2017 می آید.

این سرویس، DBcontext و پایگاه داده ی خود را به همراه مخزن مجزا خواهد داشت ، تا سرویس بتواند بصورت مستقل مستقر شود..

Microservice using ASP.NET Core

ایجاد یک ASP.NET Core Application Solution

  •  Visual Studio را باز کرده و یک پروژه ی جدید اضافه کنید.

Creating an ASP.NET Core Application Solution

  • نوع برنامه را ASP.NET Core Web Application انتخاب کرده و نامی با مسما برای آن قرار دهید.

Microservice

  •  سپس، نوع پروژه را API انتخاب کرده و مطمئن شوید که گزینه ی “ Enable Docker Support ” و نوع OS بصورت Linux انتخاب شده باشد.

Microservice

  •  solution بصورت زیر خواهد بود.

Microservice

افزودن Model ها

  •  پوشه ای جدید به نام “ Model ” به پروژه اضافه کنید.

Adding Models

  •  در پوشه ی Model ها، کلاسی به نام Product (محصول) اضافه کنید.

Microservice

  •  چند ویژگی مانند Id ، Name ، Description ، Price به کلاس محصول اضافه کنید. همچنین محصول بایدبه نوعی باشد و به این منظور، یک مدل طبقه بندی تعریف و یک ویژگی CategoryId به مدل محصول اضافه می شود.
  • بطور مشابه، مدل Category را اضافه کنید.

Microservice ها در ASP.NET Core

فعالسازی EF Core

در واقع، پروژه ی .NET Core API دارای پشتیبانی داخلی برای EF Core می باشد و تمامی وابستگی های مربوطه در زمان ایجاد و کامپایل پروژه دانلود می شوند که می توانید آن ها را تحت بخش SDK در پروژه بصورت زیر بیابید.

Enabling EF Core

Microsoft.EntityFrameworkCore.SqlServer 2.1.1 باید پکیج درون SDK دانلود شده باشد.

اگر در آنجا وجود نداشته باشد، می تواند بطور صریح از طریق Nuget Package ها به پروژه اضافه شود.

افزودن EF Core DbContext

یک زمینه ی پایگاه داده مورد نیاز است تا مدل ها بتوانند با پایگاه داده ارتباط برقرار کنند.

 پوشه ای جدید به نام DBContexts به پروژه اضافه کنید.

Adding EF Core DbContext

کلاسی جدید به نام ProductContext که شامل ویژگی های DbSet برای Product ها و Category ها می باشد، اضافه کنید.

OnModelCreating متدی است که از طریق آن، داده های اصلی می توانند در پایگاه داده ریخته شوند.

بنابراین، متد OnModelCreating را افزوده و برخی طبقه بندی های نمونه را اضافه کنید که هنگام ایجاد پایگاه داده، به پایگاه داده و در ابتدا درون جدول طبقه بندی اضافه خواهند شد.

Microservice ها

کد ProductContext

using Microsoft.EntityFrameworkCore;  
using ProductMicroservice.Models;  
  
namespace ProductMicroservice.DBContexts  
{  
  public class ProductContext : DbContext  
  {  
    public ProductContext(DbContextOptions<ProductContext> options) : base(options)  
    {  
    }  
    public DbSet<Product> Products { get; set; }  
    public DbSet<Category> Categories { get; set; }  
  
    protected override void OnModelCreating(ModelBuilder modelBuilder)  
    {  
      modelBuilder.Entity<Category>().HasData(  
          new Category  
          {  
            Id = 1,  
            Name = "Electronics",  
            Description = "Electronic Items",  
          },  
          new Category  
          {  
            Id = 2,  
            Name = "Clothes",  
            Description = "Dresses",  
          },  
          new Category  
          {  
            Id = 3,  
            Name = "Grocery",  
            Description = "Grocery Items",  
          }  
      );  
    }  
  
  }  
}  
  •  یک رشته ی اتصال در فایل appsettings.json اضافه کنید.

Microservice ها با استفاده از ASP.NET Core

جهت افزودن SQL Server db provider برای EF Core ، فایل Startup.cs را باز کنید.

کد ;(((“services.AddDbContext<ProductContext> (o => o.UseSqlServer(Configuration.GetConnectionString(“ProductDB  را در زیر متد ConfigureServices اضافه کنید.

توجه داشته باشید که در متد GetConnectionString، نام کلید رشته ی اتصال که در فایل apsettings اضافه شده بود، ارسال می شود.

Microservice

افزودن Repository

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

  •  پوشه ای جدید به نام Repository در پروژه افزوده و رابطی به نام IProductRepository در آن پوشه اضافه کنید. متدهایی که عملیات CRUD را برای میکروسرویس Product انجام می دهند را درون رابط اضافه کنید.

Adding Repository

  •  یک کلاس عینی جدید به نام ProductRepository در همان پوشه ی Repository که IProductRepository را پیاده سازی میکند اضافه کنید.

تمامی این متدها به این موارد نیاز دارند:

ASP.NET Core

  •  پیاده سازی متدها را ، از طریق دسترسی به متدهای زمینه ای اضافه کنید.

ProductRepository.cs

using Microsoft.EntityFrameworkCore;  
using ProductMicroservice.DBContexts;  
using ProductMicroservice.Models;  
using System;  
using System.Collections.Generic;  
using System.Linq;  
  
namespace ProductMicroservice.Repository  
{  
  public class ProductRepository: IProductRepository  
  {  
    private readonly ProductContext _dbContext;  
  
    public ProductRepository(ProductContext dbContext)  
    {  
      _dbContext = dbContext;  
    }  
    public void DeleteProduct(int productId)  
    {  
      var product = _dbContext.Products.Find(productId);  
      _dbContext.Products.Remove(product);  
      Save();  
    }  
  
    public Product GetProductByID(int productId)  
    {  
      return _dbContext.Products.Find(productId);  
    }  
  
    public IEnumerable<Product> GetProducts()  
    {  
      return _dbContext.Products.ToList();  
    }  
  
    public void InsertProduct(Product product)  
    {  
      _dbContext.Add(product);  
      Save();    }  
  
    public void Save()  
    {  
      _dbContext.SaveChanges();  
    }  
  
    public void UpdateProduct(Product product)  
    {  
      _dbContext.Entry(product).State = EntityState.Modified;  
      Save();  
    }  
  }  
}  
  •  کلاس Startup در پروژه را باز کرده و کد services.AddTransient<IProductRepository, ProductRepository>(); را درون متد ConfigureServices اضافه کنید تا وابستگی مخزن به هنگام نیاز در زمان اجرا رفع شود.

Microservice ها با استفاده از ASP.NET Core

افزودن Controller

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

  • بر روی پوشه ی Controllers راست کلیک کرده و یک Controller جدید بصورت زیر اضافه کنید.

Adding Controller

  • برای افزودن کنترل کننده، گزینه ی “ API Controller with read/write actions ” را انتخاب کنید.

API Controller with read/write actions

  •  نام کنترل کننده را ProductController قرار دهید.

ProductController

  •  یک کلاس ProductController با عملیات های خواندن / نوشتن پیش فرض در پوشه ی Controllers اضافه خواهد شد که در ادامه با عملیات های خواندن / نوشتن محصول جایگزین خواهد شد و متدهای HTTP با ایفای نقش به عنوان نقطه ی پایانی سرویس ایجاد می شوند.

Microservice ها

  • از آنجایی که به ValuesController نیازی نیست، می تواند حذف شود.

Microservice

پیاده سازی را از طریق فراخوانی متدهای مخزن بصورت زیر به متدها اضافه کنید.

پیاده سازی پایه به منظور درک مفاهیم در اینجا نشان داده شده است.

متدها می توانند از طریق خاصیت ها مسیردهی شوند و بر اساس نیاز با حاشیه های بیشتری تزیین شوند.

ProductController.cs

using Microsoft.AspNetCore.Mvc;  
using ProductMicroservice.Models;  
using ProductMicroservice.Repository;  
using System;  
using System.Collections.Generic;  
using System.Transactions;  
  
namespace ProductMicroservice.Controllers  
{  
  [Route("api/[controller]")]  
  [ApiController]  
  public class ProductController : ControllerBase  
  {  
  
    private readonly IProductRepository _productRepository;  
  
    public ProductController(IProductRepository productRepository)  
    {  
      _productRepository = productRepository;  
    }  
      
    [HttpGet]  
    public IActionResult Get()  
    {  
      var products = _productRepository.GetProducts();  
      return new OkObjectResult(products);  
    }  
  
    [HttpGet("{id}", Name = "Get")]  
    public IActionResult Get(int id)  
    {  
      var product = _productRepository.GetProductByID(id);  
      return new OkObjectResult(product);  
    }  
  
    [HttpPost]  
    public IActionResult Post([FromBody] Product product)  
    {  
      using (var scope = new TransactionScope())  
      {  
        _productRepository.InsertProduct(product);  
        scope.Complete();  
        return CreatedAtAction(nameof(Get), new { id = product.Id }, product);  
      }  
    }  
  
    [HttpPut]  
    public IActionResult Put([FromBody] Product product)  
    {  
      if (product != null)  
      {  
        using (var scope = new TransactionScope())  
        {  
          _productRepository.UpdateProduct(product);  
          scope.Complete();  
          return new OkResult();  
        }  
      }  
      return new NoContentResult();  
    }  
  
    [HttpDelete("{id}")]  
    public IActionResult Delete(int id)  
    {  
      _productRepository.DeleteProduct(id);  
      return new OkResult();  
    }  
  }  
}  

Entity Framework Core Migrations

Migrations ، امکان ارائه ی کد جهت تغییر پایگاه داده از یک نسخه به نسخه ای دیگر را برای ما فراهم می آورند.

Package Manager Console را باز کنید.

Entity Framework Core Migrations

جهت فعال سازی Migrations، فرمان Add-Migration را تایپ کرده و نامی با مسما مانند InitialCreate برای آن قرار داده و کلید enter را بزنید.

Microservice با استفاده از ASP.NET Core

هنگامی که فرمان اجرا شد، اگر اکنون به Solution خود نگاه کنیم، مشاهده می کنیم که یک پوشه ی Migrations جدید در آن قرار گرفته است. و شامل دو فایل می باشد.

یکی، تصویری از مدل زمینه ای فعلی ماست.

می توانید فایل ها را بررسی کنید. فایل ها بسیار واضح بوده و نیاز به توضیحی ندارند.

Microservice

جهت اطمینان از اینکه Migrations بر روی پایگاه داده اعمال شده اند، فرمان دیگری وجود دارد.

به آن update-database گفته می شود. اگر اجرا شود، Migrations بر روی پایگاه داده ی فعلی اعمال خواهند شد.

جهت تأیید اینکه پایگاه داده ایجاد شده، SQL Server Management Studio را بررسی کنید.

database

هنگامی که داده های جدول Category ها مشاهده می شود، داده های اصلی پیش فرض سه دسته نمایش داده می شود.

Microservice ها

اجرای میکروسرویس Product

این سرویس می تواند از طریق IIS Express یعنی پیش فرض Visual Studio یا از طریق Docker Containers نیز اجرا شود.

Via IIS Express

در Visual Studio، IIS Express را بصورت نشان داده شده در زیر انتخاب کرده و کلید F5 را بزنید یا بر روی کلید خود IIS Express کلیک کنید.

Via IIS Express

برنامه هنگامی که صفحه ی مرورگر شروع به کار کند، بالا خواهد آمد.

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

در اینجا Postman برای آزمودن نقاط پایانی سرویس استفاده می شود. آن را باز و برنامه را در حال اجرا نگه دارید.

اگر Postman بر روی ماشین وجود ندارد، آن را نصب کرده و راه اندازی کنید.

POST

جهت آزمودن متد POST، یعنی ایجاد یک منبع جدید، متد POST را در postman انتخاب کرده و نقطه ی پایانی، یعنی https://localhost:44312/api/product، را فراهم کنید و در بخش Body، یک JSON مشابه داشتن ویژگی های مدل Product بصورت زیر اضافه کرده و بر روی Send کلیک کنید.

POST

پاسخ به همراه شناسه ی محصول نیز باز می گردد.

متد “ Post ” از کنترل کننده، وظیفه ی ایجاد یک منبع در پایگاه داده و ارسال پاسخ را بر عهده دارد.

خط return CreatedAtAction(nameof(Get), new { id=product.Id }, product); مکان منبع ایجاد شده را برمی گرداند که می تواند در خاصیت Location در پاسخ تحت سربرگ Headers مورد بررسی قرار بگیرد.

یک انتخاب کوئری بر روی جدول محصول اجرا کرده و یک ردیف اضافه شده برای محصول ایجاد شده ی جدید نشان داده می شود.

یک محصول دیگر به همین روش ایجاد کنید.

GET

اکنون یک درخواست GET با همان آدرس ایجاد کنید و در پاسخ، دو رکورد به عنوان یک نتیجه ی JSON نمایش داده می شوند.

GET

DELETE

درخواست حذف را از طریق انتخاب فعل DELETE و الحاق شناسه بصورت ۱ (اگر محصول با شناسه ی ۱ باید حذف شود) اجرا کرده و Send را بزنید.

 

DELETE

در پایگاه داده، یک رکورد با شناسه ی ۱ حذف می شود.

PUT

فعل PUT وظیفه ی بروزرسانی منبع را بر عهده دارد.

فعل PUT را انتخاب کرده، آدرس API را فراهم کنید و در بخش Body، جزئیات اینکه کدام محصول نیاز به بروزرسانی در قالب JSON را دارد فراهم کنید.

برای مثال، محصولی با شناسه ی ۲ را بروزرسانی کرده و نام آن، توصیف، و قیمت آن را از Samsung به iPhone بروز کنید. Send را بزنید.

PUT

جهت مشاهده ی محصول بروز شده، پایگاه داده را بررسی کنید.

Via Docker Containers

اجرای سرویس می تواند از طریق فرمان های docker جهت اجرا در خط فرمان docker و نیز با استفاده از Visual Studio انجام گیرد.

از آنجایی که پشتیبانی از docker را اضافه کردیم، اجرای سرویس در Docker Containers با استفاده از Visual Studio آسان است.

پشتیبانی از container orchestrator را به شکل زیر در Solution اضافه کنید.

Via Docker Containers

انجام این کار، درخواست orchestrator را خواهد کرد. Docker Compose را انتخاب کرده و OK را بزنید.

Docker Compose

هنگامی که به Solution اضافه شد، Solution بصورت زیر دارای docker-compose به همراه dockerignore و docker-compose.yml و فایل بازنویسی شده ی خود خواهد بود.

به محض ذخیره شدن Solution، پروژه را تحت Containers ساخته و یک تصویر docker ایجاد می کند.

تمامی اجرای فرمان ها، هنگام ذخیره ی Solution ، در پنجره ی خروجی قابل مشاهده هستند.

خط فرمان را در حالت admin باز کرده و به همان پوشه ای که فایل های پروژه در آنجاست بروید.

فرمان docker images را جهت مشاهده ی تمامی تصاویر ایجاد شده اجرا کنید.

مشاهده می کنیم که تصویر ProductMicroservice آخرین مورد است.

ProductMicroservice

حال، برنامه را با Docker به عنوان یک گزینه بصورت زیر اجرا کنید.

اکنون فرمان docker ps را جهت مشاهده ی Containers های در حال اجرا، اجرا کنید.

نشان می دهد که Containers بر روی پورت ۳۲۷۷۳:۸۰ در حال اجرا می باشد.

Containers

از آنجایی که Containers در در وضعیت در حال اجراست، خوب است اکنون سرویس در حال اجرا تحت Containers را بیازماییم.

برای آزمودن سرویس، “ values ” را در آدرس با “ product ” بصورت زیر جایگزین کنید.

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

اجرای همان مورد تحت IIS Express به خوبی، یعنی بر روی پورت ۴۴۳۱۲، کار می کند.

“ values ” را با “ product ” برای گرفتن جزئیات محصول جایگزین کنید.

 

از آنجایی که برنامه در IIS Express به خوبی اجرا می شود و نه در Docker Containers ، خطا به وضوح نشان دهنده ی مشکلی در SQL Server می باشد که Docker Containers ما را نمی فهمد یا تحت Docker Containers اجرا نمی شود.

در این سناریو، Docker Containers به عنوان ماشینی مجزا درون کامپیوتر میزبان، اجرا می شود.

بنابراین، جهت اتصال به پایگاه داده ی SQL در ماشین میزبان، اتصالات از راه دور به SQL باید فعال شود. می توانیم آن را برطرف کنیم.

SQL Server Configuration Manage را باز کنید.

اکنون Protocols را برای MSSQLSERVER انتخاب کرده و شماره پورت IPAll تحت بخش TCP/IP را بگیرید.

MSSQLSERVER

Microservice

رشته ی اتصال ذکر شده در فایل JSON به منبع داده ای به عنوان محلی که Docker Containers آن را نمی فهمد، اشاره می کند.

نیاز به آدرس IP مناسب با پورت و احراز هویت SQL دارد.

بنابراین، جزئیات مربوطه، یعنی Data Source به عنوان جزئیات آدرس Ip ، شماره پورت و احراز هویت SQL را بصورت زیر فراهم کنید.

 

Data Source

حال دوباره برنامه را با گزینه ی Docker بصورتی که پیش تر انجام دادیم، اجرا کنید.

Microservice

این بار پاسخ دریافت میشود.

همان را در Postman امتحان کنید.

Postman

 

مجدد با IIS Express URL امتحان کنید.

 

Microservice

این کار اثبات می کند که میکروسرویس در حال اجرا بر روی دو نقطه ی پایانی می باشد و بر روی دو سیستم عامل مجزا بطور محلی استقرار یافته است.

نتیجه گیری

یک Microservice ، سرویسی است که حول یک قابلیت کسب و کار خاص ساخته شده، که می تواند بصورت مجزا استقرار یابد که زمینه ی محدود شده نامیده می شود.

این مقاله در رابطه با میکروسرویس ها بر روی این موضوع که Microservice ها چه هستند و مزیت و برتری آن ها نسبت به معماری سرویس های یکپارچه تمرکز میکند.

این مقاله به تفصیل نحوه ی توسعه ی یک Microservice با استفاده از ASP.NET Core و اجرای آن از طریق IIS و Docker Containers  را توضیح داده است.

علاوه بر این، سرویس می تواند دارای چند تصویر باشد و در زمانی یکسان، بر روی چندین  Containers اجرا شود.

  • پسورد: www.mspsoft.com
زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

    حمید پاسخ

    سلام.ممنون از زحمت شما.
    اما جسارتا باید عرض کنم که ترجمه چندان چنگی به دل نمیزنه و مفهوم خوب منعکس نمیشه.

      زهره سلطانیان پاسخ

      سلام دوست عزیز،
      میشه لطف کنید بگید بیشتر کجاهای مقاله خوب ترجمه نشده و مفهوم رو نمیرسونه؟