CÔNG NGHỆ THÔNG TIN >> BÀI VIẾT CHỌN LỌC

Microservices sử dụng ASP.NET Core 6 và Deploy với Docker

Đăng lúc: 08:41 AM - 20/11/2023 bởi Charles Chung - 818

Trong bài viết này tôi sẽ giới thiệu tổng quan về kiến trúc Microservice và so sánh nó với kiến trúc Monolithic. Sau cùng sẽ hướng dẫn cách tạo Product Microservice  bằng ASP.NET Core 6 - Visual 2022 và triển khai trên Docker.

1. Giới thiệu

Thuật ngữ microservice mô tả một phong cách phát triển phần mềm đã phát triển từ các xu hướng hiện đại để thiết lập các phương pháp nhằm tăng tốc độ và hiệu quả của việc phát triển và quản lý các giải pháp phần mềm trên quy mô lớn. Microservice thiên về việc áp dụng một số nguyên tắc và mẫu kiến trúc nhất định làm kiến trúc. Mỗi microservice hoạt động độc lập nhưng mặt khác cũng đều dựa vào nhau. Tất cả các dịch vụ vi mô trong một dự án đều được triển khai sản xuất theo tốc độ riêng, tại chỗ trên đám mây, độc lập và hoạt động song song.

Trong bài viết này, chúng ta sẽ tìm hiểu khái niệm về Microservices, kiến trúc của chúng và cách tạo microservices trong .NET và C#. Bạn cũng sẽ tìm hiểu các bước để xây dựng, triển khai và thử nghiệm các vi dịch vụ trong .NET bằng cách sử dụng bộ chứa docker.

2. Kiến trúc Microservices

Theo tài liệu của Microsoft thì hình sau đây thể hiện kiểu kiến trúc Microservices

alt text

Dưới đây là các thành phần khác nhau trong kiến trúc microservice

  • Management: Duy trì các nút cho dịch vụ.
  • Identity Provider: Quản lý thông tin nhận dạng và cung cấp dịch vụ xác thực trong mạng phân tán.
  • Service Discovery: Theo dõi các dịch vụ, địa chỉ dịch vụ và điểm cuối.
  • API Gateway: Đóng vai trò là điểm vào của client. Điểm liên hệ duy nhất từ máy khách sẽ trả về phản hồi từ Microservices cơ bản và đôi khi là phản hồi tổng hợp từ nhiều Microservices scơ bản.
  • CDN: Mạng phân phối nội dung để phục vụ các tài nguyên tĩnh, ví dụ: các trang và nội dung web trong mạng phân tán.
  • Static Content: Các tài nguyên tĩnh như trang và nội dung web

Các Microservices được triển khai độc lập với cơ sở dữ liệu riêng cho mỗi dịch vụ nên các Microservice cơ bản biểu diễn như trong hình sau.

3. Kiến trúc Monolithic và Microservices

Các ứng dụng Monolithic giống như một gói hoàn chỉnh có tất cả các thành phần và dịch vụ cần thiết liên quan được gói gọn trong một gói. Sau đây là sơ đồ trình bày kiến trúc Monolithic được đóng gói hoàn chỉnh hoặc dựa trên dịch vụ.

Microservice là một cách tiếp cận để tạo ra các dịch vụ nhỏ, mỗi dịch vụ chạy trong không gian riêng và có thể giao tiếp qua tin nhắn. Đây là những dịch vụ độc lập gọi trực tiếp đến cơ sở dữ liệu của riêng họ.

Sau đây là một ví dụ về sơ đồ biểu diễn kiến trúc microservices.

Trong kiến trúc Monolithic, cơ sở dữ liệu vẫn giữ nguyên cho tất cả các chức năng ngay cả khi tuân theo cách tiếp cận của kiến trúc hướng dịch vụ, trong khi ở Microservice, mỗi dịch vụ sẽ có cơ sở dữ liệu riêng.

4. Docker Containers and Docker installation

Các Container như Dockers và các vùng khác chia nhỏ tài nguyên hệ điều hành, ví dụ: network stack, processes namespace, file system phân cấp và storage stack. Docker giống như ảo hóa hệ điều hành. Bạn có thể tìm hiểu thêm về docker và cài đặt Docker cho Windows theo bài viết sau: Hướng dẫn cài đặt Docker trên Windows 10.

5. Microservice using ASP.NET Core

Trong phần này tôi sẽ trình bày cách tạo Product Microservice  bằng ASP.NET Core step by step. Dịch vụ này sẽ được xây dựng bằng ASP.NET Core 6 và Visual Studio 2022.

Bước 1: Tạo ứng dụng ASP.NET Core API 6.0

  • Đặt tên "ProductService" project và "Hanam88ProductMicroservices" solution.

alt text

  • Lựa chọn các option theo hình dưới và nhân Create

Bước 2: Cài các packages EntityFramework Core

Bước 3: Tạo các Data Models

  • Lớp Models/DataModels/Category.cs

namespace ProductMicroservice.Models.DataModels

{

  [Table("Categories")]

    public class Category

  {

        public Category()

    {

       Products=new List<Product>();

    }

    [Key]

        public int CategoryId { get; set; }

        public string CategoryName { get; set; }

        public string? Description { get; set; }

        public virtual ICollection<Product>? Products { get; set; }

  }

}

  • Lớp Models/DataModels/Product.cs

namespace ProductMicroservice.Models.DataModels

{

  [Table("Products")]

    public class Product

  {

    [Key]

        public string ProductId { get; set; }

        public string ProductName { get; set; }

        public decimal Price { get; set; }

        public string? Description { get; set; }

    [ForeignKey("Category")]

        public int CategoryId { get; set; }

        public virtual Category? Category { get; set; }

  }

}

Bước 4: Tạo lớp Models/BusinessModels/ProductContext.cs kế thừa từ DbContext

namespace ProductMicroservice.Models.BusinessModels

{

public class ProductContext:DbContext

    {

        public ProductContext(DbContextOptions<ProductContext> options):base(options) { }

        public DbSet<Category> Categories { get; set; }

        public DbSet<Product> Products { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)

    {

            //khởi tạo dữ liệu

        modelBuilder.Entity<Category>().HasData(

                new Category { CategoryId=1,CategoryName="Điện tử",Description="Đồ điện tử"},

                new Category { CategoryId = 2, CategoryName = "Điện tử", Description = "Đồ điện tử" },

                new Category { CategoryId = 3, CategoryName = "Thời trang", Description = "Đồ thời trang" },

                new Category { CategoryId = 4, CategoryName = "Gia dụng", Description = "Đồ gia dụng" },

                new Category { CategoryId = 5, CategoryName = "Mỹ nghệ", Description = "Đồ mỹ nghệ" }

            );

    }

    }

}

Bước 5: Tạo Repository để xử lý nghiệp vụ

  • Tạo interface Models/BusinessModels/Repository/IProductRepository.cs

namespace ProductMicroservice.Models.BusinessModels.Repository

{

public interface IProductRepository

    {

        IEnumerable<Product> GetProducts();

        Product GetById(string productId);

        void Insert(Product product);

        void Update(Product product);

        void Delete(string productId);

        void Save();

    }

}

  • Tạo lớp Models/BusinessModels/Repository/ProductRepository.cs thực thi từ interface IProductRepository

namespace ProductMicroservice.Models.BusinessModels.Repository

{

    public class ProductRepository : IProductRepository

  {

        private readonly ProductContext _context;

        public ProductRepository(ProductContext _context)

    {

            this._context = _context;

    }

        public void Delete(string productId)

    {

            var product = _context.Products.Find(productId);

            if(product != null)

            {

                _context.Products.Remove(product);

                Save();

            }

     }

        public Product GetById(string productId)

    {

            return _context.Products.Find(productId);

    }

        public IEnumerable<Product> GetProducts()

    {

            return _context.Products.ToList();

    }

        public void Insert(Product product)

    {

            _context.Add(product);

            Save();

    }

        public void Save()

    {

            _context.SaveChanges();

    }

        public void Update(Product product)

    {

            _context.Update(product);

            Save();

    }

  }

}

Bước 6: Cấu hình chuỗi kết nối trong file appsettings.json

{

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft.AspNetCore": "Warning"

    }

  },

  "AllowedHosts": "*",

  "ConnectionStrings": {

    "ProductConnection": "server=172.16.0.70,1433;database=ProductDB;uid=sa;pwd=123465;MultipleActiveResultSets=True;"

  }

}

Bước 7: Cấu hình dependency injection trong tệp Program.cs

//cấu hình dependency injection

builder.Services.AddDbContext<ProductContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("ProductConnection")));

builder.Services.AddTransient<IProductRepository, ProductRepository>();

Bước 8: Sử dụng Migration và sinh database

  • Mở cửa sổ Package Manager Console

  • Tại cửa sổ gõ lệnh Add-Migration InitialCreate để sinh code migration

  • Tiếp theo gõ lệnh Update-Database để tạo database

 

Bước 9: Tạo lớp controller Controllers/ProductController.cs

namespace ProductService.Controllers

{

    [Route("api/[controller]")]

    [ApiController]

    public class ProductController : ControllerBase

  {

        private IProductRepository repository;

        public ProductController(IProductRepository repository)

    {

            this.repository = repository;

    }

        // GET: api/<ProductController>

    [HttpGet]

        public IActionResult Get()

    {

            return new OkObjectResult(repository.GetProducts());

    }

        // GET api/<ProductController>/5

    [HttpGet("{id}")]

        public IActionResult Get(string id)

    {

            return new OkObjectResult(repository.GetById(id));

    }

        // POST api/<ProductController>

    [HttpPost]

        public IActionResult Post([FromBody] Product p)

    {

            using(var scope=new TransactionScope())

        {

            repository.Insert(p);

            scope.Complete();

                return CreatedAtAction(nameof(Get),new { id=p.ProductId}, p);

        }

   }

        // PUT api/<ProductController>/5

        [HttpPut("{id}")]

        public IActionResult Put(string id, [FromBody] Product p)

    {

            if (id != p.ProductId)

                return new NotFoundObjectResult("Mã số không khớp");

            using (var scope = new TransactionScope())

      {

           repository.Update(p);

           scope.Complete();

               return new OkResult();

      }

    }

        // DELETE api/<ProductController>/5

        [HttpDelete("{id}")]

        public IActionResult Delete(string id)

    {

            using (var scope = new TransactionScope())

      {    

           repository.Delete(id);

           scope.Complete();

               return new OkResult();

       }

    }

  }

}

Bước 10: Mở file Properties/launchSettings.json và sửa lại như sau:

  • Project hoàn chỉnh sẽ có cấu trúc như sau

Bước 11: Chạy Project với IIS Express tại https://localhost:44323/api/Product

Bước 12: Mở phần mềm Postman để post dữ liệu và kiểm tra kết quả

 

Bước 12: Chạy Project với Docker (lưu ý bạn phải cài docker trên máy rồi nhé)

  • Khởi động Docker (nếu lúc tạo project khởi động rồi thì thôi)

 

Lưu ý: Khi triển khai trên docker thì bạn phải Enable giao thức TCP/IP trong SQL Server lên (xem bài viết Bật giao thức TCP/IP và đổi cổng trong SQL Server 2019), chuỗi kết nối với SQL Server bạn phải sử dụng địa chỉ IP của máy bạn( mở Command window và gõ ipconfig để xem địa chỉ IP)

Link download source code bài Microservices sử dụng ASP.NET Core 6 và Deploy với Docker

Nguồn tham khảo: https://www.c-sharpcorner.com/article/microservice-using-asp-net-core/

Video đang quay...

thay lời cảm ơn!

QUẢNG CÁO - TIẾP THỊ