إنشاء ونشر واختبار الخدمات المصغرة باستخدام .NET و C # و Docker

تعرف على مفهوم هندسة الخدمات المصغرة. تعرف على كيفية إنشاء ونشر واختبار بنية الخدمات المصغرة في .NET و C # باستخدام حاوية Docker.

الخدمات المصغرة

يصور مصطلح الخدمات المصغرة أسلوب تطوير البرمجيات الذي نما من الاتجاهات المعاصرة إلى إعداد الممارسات التي تهدف إلى زيادة سرعة وكفاءة تطوير وإدارة حلول البرمجيات على نطاق واسع. الخدمات المصغرة هي أكثر حول تطبيق عدد معين من المبادئ والأنماط المعمارية مثل الهندسة المعمارية. تعيش كل خدمة صغيرة بشكل مستقل ، ولكن من ناحية أخرى ، تعتمد جميعها أيضًا على بعضها البعض. يتم نشر جميع الخدمات المصغرة في المشروع في الإنتاج وفقًا لسرعتها الخاصة ، في مكان العمل على السحابة ، بشكل مستقل ، تعيش جنبًا إلى جنب.

في هذه المقالة ، سوف نتعلم مفهوم الخدمات المصغرة وبنيتها وكيفية إنشاء الخدمات المصغرة في .NET و C #. ستتعلم أيضًا خطوات إنشاء الخدمات المصغرة ونشرها واختبارها في .NET باستخدام حاوية عامل إرساء.

هندسة الخدمات المصغرة

تُظهر الصورة التالية من Microsoft Docs نمط بنية الخدمات المصغرة.

 

هناك العديد من المكونات في بنية الخدمات المصغرة بصرف النظر عن الخدمات المصغرة نفسها.

الإدارة . يحافظ على العقد الخاصة بالخدمة.

مزود الهوية . يدير معلومات الهوية ويوفر خدمات المصادقة داخل شبكة موزعة.

اكتشاف الخدمة . يتتبع الخدمات وعناوين الخدمة ونقاط النهاية.

بوابة API . بمثابة نقطة دخول العميل. نقطة اتصال واحدة من العميل والتي بدورها تعرض ردودًا من الخدمات المصغرة الأساسية وأحيانًا استجابة مجمعة من خدمات مصغرة أساسية متعددة.

CDN . شبكة توصيل المحتوى لخدمة الموارد الثابتة مثل الصفحات ومحتوى الويب في شبكة موزعة

المحتوى الثابت الموارد الثابتة مثل الصفحات ومحتوى الويب

يتم نشر الخدمات المصغرة بشكل مستقل مع قاعدة البيانات الخاصة بها لكل خدمة بحيث تبدو الخدمات المصغرة الأساسية كما هو موضح في الصورة التالية.

 

Monolithic مقابل Microservices Architecture

التطبيقات المتجانسة هي أكثر من حزمة واحدة كاملة تحتوي على جميع المكونات والخدمات اللازمة ذات الصلة المغلفة في حزمة واحدة.

فيما يلي التمثيل التخطيطي للعمارة المتجانسة كونها حزمة كاملة أو قائمة على الخدمة.

 

Microservice هي طريقة لإنشاء خدمات صغيرة تعمل كل منها في مساحتها الخاصة ويمكن التواصل عبر الرسائل. هذه خدمات مستقلة تقوم باستدعاء قاعدة البيانات الخاصة بها مباشرة.

فيما يلي تمثيل تخطيطي لبنية الخدمات المصغرة.

 

في البنية المتجانسة ، تظل قاعدة البيانات كما هي بالنسبة لجميع الوظائف حتى إذا تم اتباع نهج للبنية الموجهة نحو الخدمة ، بينما في الخدمات المصغرة ، سيكون لكل خدمة قاعدة بيانات خاصة بها.

حاويات Docker وتركيب Docker

تقوم الحاويات مثل Dockers وغيرها بتقسيم موارد نظام التشغيل ، على سبيل المثال مكدس الشبكة ومساحة العمليات وتسلسل نظام الملفات ومكدس التخزين. يشبه عمال الرصيف إضفاء الطابع الافتراضي على نظام التشغيل. تعرف على المزيد حول عمال الرصيف هنا . افتح عنوان URL هذا وانقر فوق Download from Docker hub. بمجرد التنزيل ، قم بتسجيل الدخول إلى Docker واتبع التعليمات لتثبيت Docker لـ Windows.

Microservice باستخدام ASP.NET Core

سيوضح هذا القسم كيفية إنشاء خدمة مصغرة للمنتج باستخدام ASP.NET Core خطوة بخطوة بمساعدة الصور. سيتم بناء الخدمة باستخدام ASP.NET Core 2.1 و Visual Studio 2017. يأتي Asp.NET Core مدمجًا مع VS 2017. سيكون لهذه الخدمة قاعدة بيانات DBcontext وقاعدة بيانات مع المستودع المعزول بحيث يمكن نشر الخدمة بشكل مستقل.

 

إنشاء حل تطبيق ASP.NET Core

  1. افتح Visual Studio وأضف مشروعًا جديدًا.

  2. اختر التطبيق باعتباره تطبيق ويب ASP.NET Core ومنحه اسمًا ذا معنى.

  3. بعد ذلك ، اختر API كنوع المشروع وتأكد من تحديد خيار "Enable Docker Support" مع نوع نظام التشغيل مثل Linux.

  4. سيبدو الحل كما هو موضح أدناه.

مضيفا النماذج

  1. أضف مجلدًا جديدًا باسم "Model" إلى المشروع.

  2. في مجلد الطرازات ، أضف فئة باسم المنتج.

  3. أضف بعض الخصائص مثل المعرف والاسم والوصف والسعر إلى فئة المنتج. يجب أن يكون المنتج أيضًا من نوع ما ولهذا ، يتم تحديد نموذج الفئة وإضافة خاصية CategoryId إلى نموذج المنتج.

  4. وبالمثل ، أضف نموذج الفئة.

تمكين EF Core

على الرغم من أن مشروع .NET Core API يحتوي على دعم داخلي لـ EF Core ويتم تنزيل جميع التبعيات ذات الصلة في وقت إنشاء المشروع وتجميعه والتي يمكن العثور عليها ضمن قسم SDK في المشروع كما هو موضح أدناه.

 

يجب أن يكون Microsoft.EntityFrameworkCore.SqlServer (2.1.1) هو الحزمة داخل حزمة SDK التي تم تنزيلها. إذا لم يكن موجودًا ، فيمكن إضافته صراحةً إلى المشروع عبر حزم Nuget.

إضافة EF Core DbContext

هناك حاجة إلى سياق قاعدة البيانات حتى تتمكن النماذج من التفاعل مع قاعدة البيانات.

  1. قم بإضافة مجلد جديد يسمى DBContexts إلى المشروع.

  2. أضف فئة جديدة تسمى ProductContext تتضمن خصائص DbSet للمنتجات والفئات. OnModelCreating هي طريقة يمكن من خلالها نقل البيانات الرئيسية إلى قاعدة البيانات. لذلك ، أضف طريقة OnModelCreating وأضف بعض فئات العينات التي ستتم إضافتها إلى قاعدة البيانات مبدئيًا في جدول الفئات عند إنشاء قاعدة البيانات.



    كود 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.

افتح ملف Startup.cs لإضافة موفر قاعدة بيانات خادم SQL لـ EF Core. قم بإضافة خدمات التعليمات البرمجية .AddDbContext <ProductContext> (o => o.UseSqlServer (Configuration.GetConnectionString ("ProductDB"))) ؛ تحت طريقة ConfigureServices. لاحظ أنه في طريقة GetConnectionString ، يتم تمرير اسم مفتاح سلسلة الاتصال التي تمت إضافتها في ملف appsettings.

 

إضافة المستودع

يعمل المستودع كمكون صغير للخدمة المصغرة التي تغلف طبقة الوصول إلى البيانات وتساعد في استمرارية البيانات وقابلية الاختبار أيضًا.

  1. أضف مجلدًا جديدًا باسم Repository في المشروع وأضف اسم واجهة IProductRepository في هذا المجلد. أضف الأساليب في الواجهة التي تنفذ عمليات CRUD للخدمة المصغرة للمنتج.

  2. أضف فئة محددة جديدة تسمى ProductRepository في نفس مجلد Repository الذي يقوم بتنفيذ IProductRepository. كل هذه الطرق تحتاج:

  3. أضف التنفيذ للطرق عبر الوصول إلى طرق السياق.

    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();
    }
  }
}
  • افتح فئة بدء التشغيل في المشروع وأضف الكود كخدمات. AddTransient <IProductRepository، ProductRepository> ()؛ داخل طريقة ConfigureServices بحيث يتم حل تبعية المستودع في وقت التشغيل عند الحاجة.

إضافة وحدة تحكم

يجب أن تحتوي الخدمة المصغرة على نقطة نهاية تحتاج إلى وحدة تحكم والتي تعرض طرق HTTP للعميل كنقاط نهاية لطرق الخدمة.

  1. انقر بزر الماوس الأيمن فوق مجلد وحدات التحكم وأضف وحدة تحكم جديدة كما هو موضح أدناه.

  2. حدد الخيار "API Controller مع إجراءات القراءة / الكتابة" لإضافة وحدة التحكم.

  3. أدخل اسم وحدة التحكم على أنه ProductController.

  4. ستتم إضافة فئة ProductController في مجلد Controllers مع إجراءات القراءة / الكتابة الافتراضية التي سيتم استبدالها لاحقًا بإجراءات قراءة / كتابة المنتج وسيتم إنشاء طرق HTTP لتكون بمثابة نقطة نهاية للخدمة.

  5. يمكن حذف ValuesController لأنه ليس هناك حاجة إليه.

  6. أضف التنفيذ إلى الطرق عن طريق استدعاء طرق المستودع كما هو موضح أدناه. يظهر التطبيق الأساسي هنا من أجل فهم المفهوم. يمكن توجيه السمات ويمكن تزيينها بمزيد من التعليقات التوضيحية حسب الحاجة.

    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();
    }
  }
}

الهجرات الأساسية لإطار الكيان

تسمح لنا عمليات الترحيل بتوفير رمز لتغيير قاعدة البيانات من إصدار إلى آخر.

  1. افتح وحدة تحكم مدير الحزم.

  2. لتمكين الترحيل ، اكتب الأمر Add-Migration وأعطه اسمًا ذا معنى على سبيل المثال InitialCreate واضغط على Enter.

  3. بمجرد تنفيذ الأمر ، إذا نظرنا إلى حلنا الآن ، فسنلاحظ وجود مجلد هجرات جديد. ويحتوي على ملفين. الأول ، لقطة من نموذج السياق الحالي لدينا. لا تتردد في التحقق من الملفات. الملفات تشرح نفسها بنفسها.

  4. لضمان تطبيق عمليات الترحيل على قاعدة البيانات ، هناك أمر آخر لذلك. يطلق عليه تحديث قاعدة البيانات إذا تم تنفيذه ، فسيتم تطبيق عمليات الترحيل على قاعدة البيانات الحالية.

  5. تحقق من SQL Server Management Studio للتحقق من إنشاء قاعدة البيانات.

  6. عند عرض بيانات جدول الفئات ، يتم عرض البيانات الرئيسية الافتراضية لثلاث فئات.

قم بتشغيل Product Microservice

يمكن تشغيل الخدمة عبر IIS Express ، أي Visual Studio الافتراضي أو عبر حاوية Docker أيضًا.

عبر IIS Express

اختر IIS Express في Visual Studio كما هو موضح أدناه واضغط على F5 أو انقر فوق زر IIS Express نفسه.

 

سيتم تشغيل التطبيق بمجرد بدء تشغيل صفحة المتصفح. نظرًا لأنه لا يوجد شيء لعرضه ، فسيكون فارغًا ، ولكن يمكن اختبار الخدمة عبر أي عميل اختبار API. هنا يستخدم Postman لاختبار نقاط نهاية الخدمة. احتفظ به مفتوحًا وتشغيل التطبيق.

 

قم بتثبيت Postman إذا لم يكن موجودًا على الجهاز وقم بتشغيله.

 

بريد

لاختبار طريقة POST ؛ على سبيل المثال ، قم بإنشاء مورد جديد ، وحدد الطريقة كـ POST في ساعي البريد وقم بتوفير نقطة النهاية ، مثل https: // localhost: 44312 / api / product وفي قسم الجسم ، أضف JSON مشابهًا لامتلاك خصائص نموذج المنتج كما هو موضح أدناه و انقر فوق إرسال.

 

يتم إرجاع الاستجابة مع معرف المنتج أيضًا.

 

طريقة "النشر" لوحدة التحكم هي المسؤولة عن إنشاء مورد في قاعدة البيانات وإرسال الرد.

إرجاع السطر CreatedAtAction (nameof (Get) ، جديد {id = product.Id} ، المنتج) ؛ يُرجع موقع المورد الذي تم إنشاؤه والذي يمكن التحقق منه في سمة الموقع في الاستجابة ضمن علامة التبويب "الرؤوس".

 

قم بإجراء استعلام تحديد في جدول المنتج وسيتم عرض صف مضاف للمنتج الذي تم إنشاؤه حديثًا.

 

قم بإنشاء منتج آخر بطريقة مماثلة.

 

احصل على

قم بإجراء طلب GET الآن بنفس العنوان ويتم عرض سجلين كاستجابة نتيجة JSON.

 

حذف

قم بتنفيذ طلب الحذف عن طريق تحديد DELETE كفعل ومعرف إلحاق كـ 1 (إذا كان المنتج ذو المعرف 1 بحاجة إلى حذفه) واضغط على إرسال.

 

في قاعدة البيانات ، يتم حذف سجل واحد بالمعرف 1.

 

وضع

فعل PUT مسؤول عن تحديث المورد. حدد فعل PUT ، وقم بتوفير عنوان API ، وفي قسم النص ، قدم تفاصيل المنتج الذي يحتاج إلى تحديث بتنسيق JSON. على سبيل المثال ، قم بتحديث المنتج بـ Id 2 وقم بتحديث اسمه ووصفه وسعره من Samsung إلى iPhone المحدد. اضغط على إرسال.

 

تحقق من قاعدة البيانات لرؤية المنتج المحدث.

 

عبر حاويات Docker

يمكن أن يتم تشغيل الخدمة عبر أوامر docker ليتم تشغيلها في موجه أوامر docker واستخدام الاستوديو المرئي أيضًا. نظرًا لأننا أضفنا دعم عامل الإرساء ، فمن السهل تشغيل الخدمة في حاوية عامل الإرساء باستخدام الاستوديو المرئي.

  1. أضف دعم منظم الحاوية في الحل كما هو موضح أدناه.

  2. هذا سوف يسأل عن المنسق. حدد Docker Compose واضغط على OK.



    بمجرد إضافته إلى الحل ، سيبدو الحل كما هو موضح أدناه بعد إنشاء عامل ميناء باستخدام dockerignore و docker-compose.yml وملف التجاوز الخاص به.



    بمجرد حفظ الحل ، فإنه يبني المشروع تحت الحاوية وينشئ صورة عامل إرساء. يمكن رؤية تنفيذ جميع الأوامر في نافذة الإخراج عند حفظ الحل.
  3. افتح موجه الأوامر في وضع المسؤول وانتقل إلى نفس المجلد حيث توجد ملفات المشروع.

  4. قم بتشغيل الأمر docker images لمشاهدة جميع الصور التي تم إنشاؤها. نرى صورة ProductMicroservice هي الأحدث.

  5. الآن قم بتشغيل التطبيق باستخدام Docker كخيار كما هو موضح أدناه.

  6. الآن ، قم بتشغيل الأمر docker ps لرؤية الحاويات قيد التشغيل. يظهر أن الحاوية تعمل على منفذ 32773: 80.

  7. نظرًا لأن الحاوية في حالة تشغيل ، فمن الجيد اختبار الخدمة التي تعمل الآن تحت الحاوية. لاختبار الخدمة ، استبدل "قيم" بكلمة "منتج" في العنوان كما هو موضح أدناه. من الناحية المثالية ، يجب أن تحصل على تفاصيل المنتج. لكنه يعطي استثناء كما هو موضح أدناه.

  8. تشغيل نفس الشيء ضمن IIS Express يعمل بشكل جيد على سبيل المثال على المنفذ 44312. استبدل "القيم" بالمنتج للحصول على تفاصيل المنتج ،

  9. نظرًا لأن تطبيق IIS Express يعمل بشكل جيد وليس في حاوية عامل الميناء ، فإن الخطأ يظهر بوضوح أن هناك خطأ ما في خادم SQL لأنه لا يفهم حاوية عامل الإرساء أو أنه لا يعمل تحت حاوية عامل الإرساء. في هذا السيناريو ، يتم تشغيل حاوية عامل الإرساء كجهاز منفصل داخل الكمبيوتر المضيف. لذلك ، للاتصال بقاعدة بيانات SQL في الجهاز المضيف ، يجب تمكين الاتصالات عن بُعد بـ SQL. يمكننا إصلاح هذا.
     
  10. افتح مدير تكوين خادم SQL. حدد الآن بروتوكولات لـ MSSQLSERVER واحصل على رقم منفذ IPAll ضمن قسم TCP / IP.






  11. تشير سلسلة الاتصال المذكورة في ملف JSON إلى أن مصدر البيانات محلي لا تفهمه حاوية عامل الإرساء. يحتاج إلى عناوين IP مناسبة مع مصادقة المنفذ و SQL. لذلك ، قم بتوفير التفاصيل ذات الصلة ، مثل مصدر البيانات كعنوان IP ورقم المنفذ وتفاصيل مصادقة SQL كما هو موضح أدناه.

  12. الآن قم بتشغيل التطبيق مرة أخرى باستخدام Docker كخيار كما تم القيام به سابقًا.



    هذه المرة تم تلقي الرد.
  13. اختبار نفسه في ساعي البريد.

  14. اختبر مرة أخرى باستخدام IIS Express URL.

هذا يثبت أن الخدمة المصغرة تعمل على نقطتي نهاية وعلى نظامي تشغيل يتم نشرهما محليًا بشكل مستقل.

استنتاج

الخدمة المصغرة هي خدمة مبنية على قدرة عمل محددة ، والتي يمكن نشرها بشكل مستقل وهو ما يسمى السياق المحدود. ركزت هذه المقالة على الخدمات المصغرة على ماهية الخدمات المصغرة ومزاياها على بنية الخدمات المتجانسة. وصفت المقالة بالتفصيل تطوير خدمة مصغرة باستخدام ASP.NET Core وتشغيلها عبر IIS و Docker container. وبالمثل ، يمكن أن تحتوي الخدمة على صور متعددة ويمكن تشغيلها على حاويات متعددة في نفس الوقت.

مصدر المقال الأصلي في https://www.c-sharpcorner.com

#microservice #aspdotnet #dotnet #csharp #docker

What is GEEK

Buddha Community

إنشاء ونشر واختبار الخدمات المصغرة باستخدام .NET و C # و Docker
Einar  Hintz

Einar Hintz

1602560783

jQuery Ajax CRUD in ASP.NET Core MVC with Modal Popup

In this article, we’ll discuss how to use jQuery Ajax for ASP.NET Core MVC CRUD Operations using Bootstrap Modal. With jQuery Ajax, we can make HTTP request to controller action methods without reloading the entire page, like a single page application.

To demonstrate CRUD operations – insert, update, delete and retrieve, the project will be dealing with details of a normal bank transaction. GitHub repository for this demo project : https://bit.ly/33KTJAu.

Sub-topics discussed :

  • Form design for insert and update operation.
  • Display forms in modal popup dialog.
  • Form post using jQuery Ajax.
  • Implement MVC CRUD operations with jQuery Ajax.
  • Loading spinner in .NET Core MVC.
  • Prevent direct access to MVC action method.

Create ASP.NET Core MVC Project

In Visual Studio 2019, Go to File > New > Project (Ctrl + Shift + N).

From new project window, Select Asp.Net Core Web Application_._

Image showing how to create ASP.NET Core Web API project in Visual Studio.

Once you provide the project name and location. Select Web Application(Model-View-Controller) and uncheck HTTPS Configuration. Above steps will create a brand new ASP.NET Core MVC project.

Showing project template selection for .NET Core MVC.

Setup a Database

Let’s create a database for this application using Entity Framework Core. For that we’ve to install corresponding NuGet Packages. Right click on project from solution explorer, select Manage NuGet Packages_,_ From browse tab, install following 3 packages.

Showing list of NuGet Packages for Entity Framework Core

Now let’s define DB model class file – /Models/TransactionModel.cs.

public class TransactionModel
{
    [Key]
    public int TransactionId { get; set; }

    [Column(TypeName ="nvarchar(12)")]
    [DisplayName("Account Number")]
    [Required(ErrorMessage ="This Field is required.")]
    [MaxLength(12,ErrorMessage ="Maximum 12 characters only")]
    public string AccountNumber { get; set; }

    [Column(TypeName ="nvarchar(100)")]
    [DisplayName("Beneficiary Name")]
    [Required(ErrorMessage = "This Field is required.")]
    public string BeneficiaryName { get; set; }

    [Column(TypeName ="nvarchar(100)")]
    [DisplayName("Bank Name")]
    [Required(ErrorMessage = "This Field is required.")]
    public string BankName { get; set; }

    [Column(TypeName ="nvarchar(11)")]
    [DisplayName("SWIFT Code")]
    [Required(ErrorMessage = "This Field is required.")]
    [MaxLength(11)]
    public string SWIFTCode { get; set; }

    [DisplayName("Amount")]
    [Required(ErrorMessage = "This Field is required.")]
    public int Amount { get; set; }

    [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime Date { get; set; }
}

C#Copy

Here we’ve defined model properties for the transaction with proper validation. Now let’s define  DbContextclass for EF Core.

#asp.net core article #asp.net core #add loading spinner in asp.net core #asp.net core crud without reloading #asp.net core jquery ajax form #asp.net core modal dialog #asp.net core mvc crud using jquery ajax #asp.net core mvc with jquery and ajax #asp.net core popup window #bootstrap modal popup in asp.net core mvc. bootstrap modal popup in asp.net core #delete and viewall in asp.net core #jquery ajax - insert #jquery ajax form post #modal popup dialog in asp.net core #no direct access action method #update #validation in modal popup

إنشاء ونشر واختبار الخدمات المصغرة باستخدام .NET و C # و Docker

تعرف على مفهوم هندسة الخدمات المصغرة. تعرف على كيفية إنشاء ونشر واختبار بنية الخدمات المصغرة في .NET و C # باستخدام حاوية Docker.

الخدمات المصغرة

يصور مصطلح الخدمات المصغرة أسلوب تطوير البرمجيات الذي نما من الاتجاهات المعاصرة إلى إعداد الممارسات التي تهدف إلى زيادة سرعة وكفاءة تطوير وإدارة حلول البرمجيات على نطاق واسع. الخدمات المصغرة هي أكثر حول تطبيق عدد معين من المبادئ والأنماط المعمارية مثل الهندسة المعمارية. تعيش كل خدمة صغيرة بشكل مستقل ، ولكن من ناحية أخرى ، تعتمد جميعها أيضًا على بعضها البعض. يتم نشر جميع الخدمات المصغرة في المشروع في الإنتاج وفقًا لسرعتها الخاصة ، في مكان العمل على السحابة ، بشكل مستقل ، تعيش جنبًا إلى جنب.

في هذه المقالة ، سوف نتعلم مفهوم الخدمات المصغرة وبنيتها وكيفية إنشاء الخدمات المصغرة في .NET و C #. ستتعلم أيضًا خطوات إنشاء الخدمات المصغرة ونشرها واختبارها في .NET باستخدام حاوية عامل إرساء.

هندسة الخدمات المصغرة

تُظهر الصورة التالية من Microsoft Docs نمط بنية الخدمات المصغرة.

 

هناك العديد من المكونات في بنية الخدمات المصغرة بصرف النظر عن الخدمات المصغرة نفسها.

الإدارة . يحافظ على العقد الخاصة بالخدمة.

مزود الهوية . يدير معلومات الهوية ويوفر خدمات المصادقة داخل شبكة موزعة.

اكتشاف الخدمة . يتتبع الخدمات وعناوين الخدمة ونقاط النهاية.

بوابة API . بمثابة نقطة دخول العميل. نقطة اتصال واحدة من العميل والتي بدورها تعرض ردودًا من الخدمات المصغرة الأساسية وأحيانًا استجابة مجمعة من خدمات مصغرة أساسية متعددة.

CDN . شبكة توصيل المحتوى لخدمة الموارد الثابتة مثل الصفحات ومحتوى الويب في شبكة موزعة

المحتوى الثابت الموارد الثابتة مثل الصفحات ومحتوى الويب

يتم نشر الخدمات المصغرة بشكل مستقل مع قاعدة البيانات الخاصة بها لكل خدمة بحيث تبدو الخدمات المصغرة الأساسية كما هو موضح في الصورة التالية.

 

Monolithic مقابل Microservices Architecture

التطبيقات المتجانسة هي أكثر من حزمة واحدة كاملة تحتوي على جميع المكونات والخدمات اللازمة ذات الصلة المغلفة في حزمة واحدة.

فيما يلي التمثيل التخطيطي للعمارة المتجانسة كونها حزمة كاملة أو قائمة على الخدمة.

 

Microservice هي طريقة لإنشاء خدمات صغيرة تعمل كل منها في مساحتها الخاصة ويمكن التواصل عبر الرسائل. هذه خدمات مستقلة تقوم باستدعاء قاعدة البيانات الخاصة بها مباشرة.

فيما يلي تمثيل تخطيطي لبنية الخدمات المصغرة.

 

في البنية المتجانسة ، تظل قاعدة البيانات كما هي بالنسبة لجميع الوظائف حتى إذا تم اتباع نهج للبنية الموجهة نحو الخدمة ، بينما في الخدمات المصغرة ، سيكون لكل خدمة قاعدة بيانات خاصة بها.

حاويات Docker وتركيب Docker

تقوم الحاويات مثل Dockers وغيرها بتقسيم موارد نظام التشغيل ، على سبيل المثال مكدس الشبكة ومساحة العمليات وتسلسل نظام الملفات ومكدس التخزين. يشبه عمال الرصيف إضفاء الطابع الافتراضي على نظام التشغيل. تعرف على المزيد حول عمال الرصيف هنا . افتح عنوان URL هذا وانقر فوق Download from Docker hub. بمجرد التنزيل ، قم بتسجيل الدخول إلى Docker واتبع التعليمات لتثبيت Docker لـ Windows.

Microservice باستخدام ASP.NET Core

سيوضح هذا القسم كيفية إنشاء خدمة مصغرة للمنتج باستخدام ASP.NET Core خطوة بخطوة بمساعدة الصور. سيتم بناء الخدمة باستخدام ASP.NET Core 2.1 و Visual Studio 2017. يأتي Asp.NET Core مدمجًا مع VS 2017. سيكون لهذه الخدمة قاعدة بيانات DBcontext وقاعدة بيانات مع المستودع المعزول بحيث يمكن نشر الخدمة بشكل مستقل.

 

إنشاء حل تطبيق ASP.NET Core

  1. افتح Visual Studio وأضف مشروعًا جديدًا.

  2. اختر التطبيق باعتباره تطبيق ويب ASP.NET Core ومنحه اسمًا ذا معنى.

  3. بعد ذلك ، اختر API كنوع المشروع وتأكد من تحديد خيار "Enable Docker Support" مع نوع نظام التشغيل مثل Linux.

  4. سيبدو الحل كما هو موضح أدناه.

مضيفا النماذج

  1. أضف مجلدًا جديدًا باسم "Model" إلى المشروع.

  2. في مجلد الطرازات ، أضف فئة باسم المنتج.

  3. أضف بعض الخصائص مثل المعرف والاسم والوصف والسعر إلى فئة المنتج. يجب أن يكون المنتج أيضًا من نوع ما ولهذا ، يتم تحديد نموذج الفئة وإضافة خاصية CategoryId إلى نموذج المنتج.

  4. وبالمثل ، أضف نموذج الفئة.

تمكين EF Core

على الرغم من أن مشروع .NET Core API يحتوي على دعم داخلي لـ EF Core ويتم تنزيل جميع التبعيات ذات الصلة في وقت إنشاء المشروع وتجميعه والتي يمكن العثور عليها ضمن قسم SDK في المشروع كما هو موضح أدناه.

 

يجب أن يكون Microsoft.EntityFrameworkCore.SqlServer (2.1.1) هو الحزمة داخل حزمة SDK التي تم تنزيلها. إذا لم يكن موجودًا ، فيمكن إضافته صراحةً إلى المشروع عبر حزم Nuget.

إضافة EF Core DbContext

هناك حاجة إلى سياق قاعدة البيانات حتى تتمكن النماذج من التفاعل مع قاعدة البيانات.

  1. قم بإضافة مجلد جديد يسمى DBContexts إلى المشروع.

  2. أضف فئة جديدة تسمى ProductContext تتضمن خصائص DbSet للمنتجات والفئات. OnModelCreating هي طريقة يمكن من خلالها نقل البيانات الرئيسية إلى قاعدة البيانات. لذلك ، أضف طريقة OnModelCreating وأضف بعض فئات العينات التي ستتم إضافتها إلى قاعدة البيانات مبدئيًا في جدول الفئات عند إنشاء قاعدة البيانات.



    كود 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.

افتح ملف Startup.cs لإضافة موفر قاعدة بيانات خادم SQL لـ EF Core. قم بإضافة خدمات التعليمات البرمجية .AddDbContext <ProductContext> (o => o.UseSqlServer (Configuration.GetConnectionString ("ProductDB"))) ؛ تحت طريقة ConfigureServices. لاحظ أنه في طريقة GetConnectionString ، يتم تمرير اسم مفتاح سلسلة الاتصال التي تمت إضافتها في ملف appsettings.

 

إضافة المستودع

يعمل المستودع كمكون صغير للخدمة المصغرة التي تغلف طبقة الوصول إلى البيانات وتساعد في استمرارية البيانات وقابلية الاختبار أيضًا.

  1. أضف مجلدًا جديدًا باسم Repository في المشروع وأضف اسم واجهة IProductRepository في هذا المجلد. أضف الأساليب في الواجهة التي تنفذ عمليات CRUD للخدمة المصغرة للمنتج.

  2. أضف فئة محددة جديدة تسمى ProductRepository في نفس مجلد Repository الذي يقوم بتنفيذ IProductRepository. كل هذه الطرق تحتاج:

  3. أضف التنفيذ للطرق عبر الوصول إلى طرق السياق.

    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();
    }
  }
}
  • افتح فئة بدء التشغيل في المشروع وأضف الكود كخدمات. AddTransient <IProductRepository، ProductRepository> ()؛ داخل طريقة ConfigureServices بحيث يتم حل تبعية المستودع في وقت التشغيل عند الحاجة.

إضافة وحدة تحكم

يجب أن تحتوي الخدمة المصغرة على نقطة نهاية تحتاج إلى وحدة تحكم والتي تعرض طرق HTTP للعميل كنقاط نهاية لطرق الخدمة.

  1. انقر بزر الماوس الأيمن فوق مجلد وحدات التحكم وأضف وحدة تحكم جديدة كما هو موضح أدناه.

  2. حدد الخيار "API Controller مع إجراءات القراءة / الكتابة" لإضافة وحدة التحكم.

  3. أدخل اسم وحدة التحكم على أنه ProductController.

  4. ستتم إضافة فئة ProductController في مجلد Controllers مع إجراءات القراءة / الكتابة الافتراضية التي سيتم استبدالها لاحقًا بإجراءات قراءة / كتابة المنتج وسيتم إنشاء طرق HTTP لتكون بمثابة نقطة نهاية للخدمة.

  5. يمكن حذف ValuesController لأنه ليس هناك حاجة إليه.

  6. أضف التنفيذ إلى الطرق عن طريق استدعاء طرق المستودع كما هو موضح أدناه. يظهر التطبيق الأساسي هنا من أجل فهم المفهوم. يمكن توجيه السمات ويمكن تزيينها بمزيد من التعليقات التوضيحية حسب الحاجة.

    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();
    }
  }
}

الهجرات الأساسية لإطار الكيان

تسمح لنا عمليات الترحيل بتوفير رمز لتغيير قاعدة البيانات من إصدار إلى آخر.

  1. افتح وحدة تحكم مدير الحزم.

  2. لتمكين الترحيل ، اكتب الأمر Add-Migration وأعطه اسمًا ذا معنى على سبيل المثال InitialCreate واضغط على Enter.

  3. بمجرد تنفيذ الأمر ، إذا نظرنا إلى حلنا الآن ، فسنلاحظ وجود مجلد هجرات جديد. ويحتوي على ملفين. الأول ، لقطة من نموذج السياق الحالي لدينا. لا تتردد في التحقق من الملفات. الملفات تشرح نفسها بنفسها.

  4. لضمان تطبيق عمليات الترحيل على قاعدة البيانات ، هناك أمر آخر لذلك. يطلق عليه تحديث قاعدة البيانات إذا تم تنفيذه ، فسيتم تطبيق عمليات الترحيل على قاعدة البيانات الحالية.

  5. تحقق من SQL Server Management Studio للتحقق من إنشاء قاعدة البيانات.

  6. عند عرض بيانات جدول الفئات ، يتم عرض البيانات الرئيسية الافتراضية لثلاث فئات.

قم بتشغيل Product Microservice

يمكن تشغيل الخدمة عبر IIS Express ، أي Visual Studio الافتراضي أو عبر حاوية Docker أيضًا.

عبر IIS Express

اختر IIS Express في Visual Studio كما هو موضح أدناه واضغط على F5 أو انقر فوق زر IIS Express نفسه.

 

سيتم تشغيل التطبيق بمجرد بدء تشغيل صفحة المتصفح. نظرًا لأنه لا يوجد شيء لعرضه ، فسيكون فارغًا ، ولكن يمكن اختبار الخدمة عبر أي عميل اختبار API. هنا يستخدم Postman لاختبار نقاط نهاية الخدمة. احتفظ به مفتوحًا وتشغيل التطبيق.

 

قم بتثبيت Postman إذا لم يكن موجودًا على الجهاز وقم بتشغيله.

 

بريد

لاختبار طريقة POST ؛ على سبيل المثال ، قم بإنشاء مورد جديد ، وحدد الطريقة كـ POST في ساعي البريد وقم بتوفير نقطة النهاية ، مثل https: // localhost: 44312 / api / product وفي قسم الجسم ، أضف JSON مشابهًا لامتلاك خصائص نموذج المنتج كما هو موضح أدناه و انقر فوق إرسال.

 

يتم إرجاع الاستجابة مع معرف المنتج أيضًا.

 

طريقة "النشر" لوحدة التحكم هي المسؤولة عن إنشاء مورد في قاعدة البيانات وإرسال الرد.

إرجاع السطر CreatedAtAction (nameof (Get) ، جديد {id = product.Id} ، المنتج) ؛ يُرجع موقع المورد الذي تم إنشاؤه والذي يمكن التحقق منه في سمة الموقع في الاستجابة ضمن علامة التبويب "الرؤوس".

 

قم بإجراء استعلام تحديد في جدول المنتج وسيتم عرض صف مضاف للمنتج الذي تم إنشاؤه حديثًا.

 

قم بإنشاء منتج آخر بطريقة مماثلة.

 

احصل على

قم بإجراء طلب GET الآن بنفس العنوان ويتم عرض سجلين كاستجابة نتيجة JSON.

 

حذف

قم بتنفيذ طلب الحذف عن طريق تحديد DELETE كفعل ومعرف إلحاق كـ 1 (إذا كان المنتج ذو المعرف 1 بحاجة إلى حذفه) واضغط على إرسال.

 

في قاعدة البيانات ، يتم حذف سجل واحد بالمعرف 1.

 

وضع

فعل PUT مسؤول عن تحديث المورد. حدد فعل PUT ، وقم بتوفير عنوان API ، وفي قسم النص ، قدم تفاصيل المنتج الذي يحتاج إلى تحديث بتنسيق JSON. على سبيل المثال ، قم بتحديث المنتج بـ Id 2 وقم بتحديث اسمه ووصفه وسعره من Samsung إلى iPhone المحدد. اضغط على إرسال.

 

تحقق من قاعدة البيانات لرؤية المنتج المحدث.

 

عبر حاويات Docker

يمكن أن يتم تشغيل الخدمة عبر أوامر docker ليتم تشغيلها في موجه أوامر docker واستخدام الاستوديو المرئي أيضًا. نظرًا لأننا أضفنا دعم عامل الإرساء ، فمن السهل تشغيل الخدمة في حاوية عامل الإرساء باستخدام الاستوديو المرئي.

  1. أضف دعم منظم الحاوية في الحل كما هو موضح أدناه.

  2. هذا سوف يسأل عن المنسق. حدد Docker Compose واضغط على OK.



    بمجرد إضافته إلى الحل ، سيبدو الحل كما هو موضح أدناه بعد إنشاء عامل ميناء باستخدام dockerignore و docker-compose.yml وملف التجاوز الخاص به.



    بمجرد حفظ الحل ، فإنه يبني المشروع تحت الحاوية وينشئ صورة عامل إرساء. يمكن رؤية تنفيذ جميع الأوامر في نافذة الإخراج عند حفظ الحل.
  3. افتح موجه الأوامر في وضع المسؤول وانتقل إلى نفس المجلد حيث توجد ملفات المشروع.

  4. قم بتشغيل الأمر docker images لمشاهدة جميع الصور التي تم إنشاؤها. نرى صورة ProductMicroservice هي الأحدث.

  5. الآن قم بتشغيل التطبيق باستخدام Docker كخيار كما هو موضح أدناه.

  6. الآن ، قم بتشغيل الأمر docker ps لرؤية الحاويات قيد التشغيل. يظهر أن الحاوية تعمل على منفذ 32773: 80.

  7. نظرًا لأن الحاوية في حالة تشغيل ، فمن الجيد اختبار الخدمة التي تعمل الآن تحت الحاوية. لاختبار الخدمة ، استبدل "قيم" بكلمة "منتج" في العنوان كما هو موضح أدناه. من الناحية المثالية ، يجب أن تحصل على تفاصيل المنتج. لكنه يعطي استثناء كما هو موضح أدناه.

  8. تشغيل نفس الشيء ضمن IIS Express يعمل بشكل جيد على سبيل المثال على المنفذ 44312. استبدل "القيم" بالمنتج للحصول على تفاصيل المنتج ،

  9. نظرًا لأن تطبيق IIS Express يعمل بشكل جيد وليس في حاوية عامل الميناء ، فإن الخطأ يظهر بوضوح أن هناك خطأ ما في خادم SQL لأنه لا يفهم حاوية عامل الإرساء أو أنه لا يعمل تحت حاوية عامل الإرساء. في هذا السيناريو ، يتم تشغيل حاوية عامل الإرساء كجهاز منفصل داخل الكمبيوتر المضيف. لذلك ، للاتصال بقاعدة بيانات SQL في الجهاز المضيف ، يجب تمكين الاتصالات عن بُعد بـ SQL. يمكننا إصلاح هذا.
     
  10. افتح مدير تكوين خادم SQL. حدد الآن بروتوكولات لـ MSSQLSERVER واحصل على رقم منفذ IPAll ضمن قسم TCP / IP.






  11. تشير سلسلة الاتصال المذكورة في ملف JSON إلى أن مصدر البيانات محلي لا تفهمه حاوية عامل الإرساء. يحتاج إلى عناوين IP مناسبة مع مصادقة المنفذ و SQL. لذلك ، قم بتوفير التفاصيل ذات الصلة ، مثل مصدر البيانات كعنوان IP ورقم المنفذ وتفاصيل مصادقة SQL كما هو موضح أدناه.

  12. الآن قم بتشغيل التطبيق مرة أخرى باستخدام Docker كخيار كما تم القيام به سابقًا.



    هذه المرة تم تلقي الرد.
  13. اختبار نفسه في ساعي البريد.

  14. اختبر مرة أخرى باستخدام IIS Express URL.

هذا يثبت أن الخدمة المصغرة تعمل على نقطتي نهاية وعلى نظامي تشغيل يتم نشرهما محليًا بشكل مستقل.

استنتاج

الخدمة المصغرة هي خدمة مبنية على قدرة عمل محددة ، والتي يمكن نشرها بشكل مستقل وهو ما يسمى السياق المحدود. ركزت هذه المقالة على الخدمات المصغرة على ماهية الخدمات المصغرة ومزاياها على بنية الخدمات المتجانسة. وصفت المقالة بالتفصيل تطوير خدمة مصغرة باستخدام ASP.NET Core وتشغيلها عبر IIS و Docker container. وبالمثل ، يمكن أن تحتوي الخدمة على صور متعددة ويمكن تشغيلها على حاويات متعددة في نفس الوقت.

مصدر المقال الأصلي في https://www.c-sharpcorner.com

#microservice #aspdotnet #dotnet #csharp #docker

Eric  Bukenya

Eric Bukenya

1618666860

.NET Conf 2020 Demos & Sessions for .NET 5 + Virtual Events!

This year’s .NET Conf was the largest one yet, with over 80 live sessions across three days that were co-organized and presented by the .NET community and Microsoft. On top of all of that, it also marked the release of .NET 5.0  that brings a full set of new capabilities, performance gains, and new languages features for developers to create amazing apps. If you missed this year’s .NET Conf live stream, don’t worry because we have you covered!

#.net #.net core #asp.net #c# #.net conf #.net foundation #community #demos

Iliana  Welch

Iliana Welch

1597368540

Docker Tutorial for Beginners 8 - Build and Run C++ Applications in a Docker Container

Docker is an open platform that allows use package, develop, run, and ship software applications in different environments using containers.
In this course We will learn How to Write Dockerfiles, Working with the Docker Toolbox, How to Work with the Docker Machine, How to Use Docker Compose to fire up multiple containers, How to Work with Docker Kinematic, Push images to Docker Hub, Pull images from a Docker Registery, Push stacks of servers to Docker Hub.
How to install Docker on Mac.

#docker tutorial #c++ #docker container #docker #docker hub #devopstools

Rider 2021.1: Updates to Docker and C# Support, Scaffolding in ASP.NET, and More!

Update to Docker Support

Adding Docker support to a project in Rider is now easier – you can generate the Dockerfile while creating a new project. Just select Docker Support in the New project dialog. If you want to add a Dockerfile to an existing project, use** Add | Docker Support** in the context menu for a project in the Solution Explorer tool window.

Rider can also run Dockerfiles generated by Visual Studio with no additional changes required from you.

#net-tools #releases #debugger #c# #c++ #c