0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Sự Linh Hoạt Trong Triển Khai .NET: Các Mô-đun Hosuto

Đăng vào 2 ngày trước

• 7 phút đọc

Giới thiệu

Trong bối cảnh phát triển phần mềm hiện đại, việc triển khai ứng dụng linh hoạt là rất quan trọng, đặc biệt là trong môi trường doanh nghiệp. Chúng ta đang sống trong thời đại của kiến trúc cloud-native và microservices, nhưng thực tế mà nhiều doanh nghiệp phải đối mặt là không phải khách hàng nào cũng có nhu cầu giống nhau. Một số khách hàng muốn cài đặt đơn giản với một cú nhấp chuột và có thể chạy trên một máy chủ duy nhất, trong khi những khách hàng khác cần các triển khai cloud-native có khả năng mở rộng theo chiều ngang. Việc xây dựng các phiên bản monolithic và microservices riêng biệt cho cùng một sản phẩm không phải là giải pháp bền vững.

Để giải quyết vấn đề này, chúng tôi đã phát triển Hosuto cách đây vài năm. Đây là một thư viện .NET cho phép bạn viết mã module một lần và triển khai theo bất kỳ cách nào bạn cần - được gói lại thành một monolith hoặc phân phối dưới dạng microservices. Chúng tôi đã sử dụng Hosuto làm nền tảng cho nhiều sản phẩm của mình, từ tích hợp SAP đến các dự án mã nguồn mở như eryph.

Cách Hosuto Hoạt Động

Hosuto cho phép bạn xây dựng các mô-đun thay vì monolith hoặc microservices. Các mô-đun này có thể chạy cùng nhau trong một quy trình hoặc phân phối qua nhiều dịch vụ khác nhau. Mã của mô-đun vẫn giữ nguyên bất kể cấu hình triển khai.

Kiến trúc xoay quanh một host cha (ModulesHost) điều phối nhiều mô-đun. Mỗi mô-đun chạy trong một ngữ cảnh host độc lập (IModuleHost<T>) với container tiêm phụ thuộc riêng, trong khi vẫn có quyền truy cập vào các dịch vụ chung từ container DI của host cha. Thiết kế này cung cấp sự cô lập cho các mô-đun trong khi cho phép chia sẻ tài nguyên - các mô-đun không thể can thiệp vào dịch vụ của nhau, nhưng chúng có thể truy cập hạ tầng chung như cấu hình, ghi log và message bus.

Tùy Chọn Triển Khai

  • Tùy Chọn 1: Gói lại (Bundled)
  • Tùy Chọn 2: Phân phối (Distributed)

Cấu Trúc Mô-đun

Một mô-đun là một lớp C# xác định các dịch vụ và cấu hình của nó:

csharp Copy
public class OrderModule : IWebModule
{
    public string Path => "/orders";

    public void ConfigureServices(IServiceProvider serviceProvider, IServiceCollection services)
    {
        // Tiêm các dịch vụ chung từ host
        services.AddSingleton(serviceProvider.GetRequiredService<IEventBus>());

        // Cấu hình các dịch vụ riêng cho mô-đun
        services.AddScoped<IOrderService, OrderService>();
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Triển Khai Gói Lại

Để phát triển hoặc triển khai đơn giản, chạy tất cả các mô-đun trong một quy trình:

csharp Copy
// Program.cs - Mọi thứ trong một quy trình
public static IHostBuilder CreateHostBuilder(string[] args)
{
    var services = new ServiceCollection()
        .AddSingleton<IEventBus, InMemoryEventBus>()
        .AddSingleton<IOrderRepository, OrderRepository>();

    return ModulesHost.CreateDefaultBuilder(args)
        .UseServiceCollection(services)
        .UseAspNetCoreWithDefaults()
        .HostModule<OrderModule>()        // API Đặt hàng
        .HostModule<PaymentModule>()      // API Thanh toán
        .HostModule<InventoryModule>()    // API Kho
        .HostModule<UIModule>()           // Giao diện Web
        .ConfigureAppConfiguration(config => config
            .AddInMemoryCollection(new Dictionary<string, string>
            {
                ["bus:type"] = "inmemory",      // Giao tiếp trong quy trình
                ["databus:type"] = "inmemory"
            }));
}

Triển Khai Phân Phối

Để mở rộng các thành phần riêng lẻ, tách các mô-đun ra thành các dịch vụ riêng mà không cần chỉnh sửa mã mô-đun:

csharp Copy
// OrderService/Program.cs - Chỉ còn mô-đun Đặt hàng
public static IHostBuilder CreateHostBuilder(string[] args)
{
    var services = new ServiceCollection()
        .AddRabbitMqEventBus()  // Bus sự kiện phân phối
        .AddCosmosDbRepository(); // Cơ sở dữ liệu chung

    return ModulesHost.CreateDefaultBuilder(args)
        .UseServiceCollection(services)
        .UseAspNetCoreWithDefaults()
        .HostModule<OrderModule>()  // Chỉ mô-đun Đặt hàng
        .ConfigureAppConfiguration(config => config
            .AddEnvironmentVariables("MYAPP_")
            .AddInMemoryCollection(new Dictionary<string, string>
            {
                ["bus:type"] = "rabbitmq",
                ["bus:connectionstring"] = "amqp://guest:guest@rabbitmq"
            }));
}

Ví Dụ Sản Xuất: SAPHub

SAPHub là một ví dụ điển hình cho việc sử dụng Hosuto trong môi trường sản xuất.

SAPHub cung cấp một REST API cho truy cập dữ liệu SAP bất đồng bộ, được xây dựng với ba mô-đun:

  • Mô-đun API: Các điểm cuối REST cho khách hàng bên ngoài
  • Mô-đun UI: Giao diện quản lý dựa trên Blazor
  • Mô-đun Kết Nối SAP: Xử lý tích hợp hệ thống SAP

Sự giao tiếp giữa các mô-đun được xác định bởi cấu hình:

Phát triển (In-Memory):

json Copy
{
  "bus": { "type": "inmemory" },
  "databus": { "type": "inmemory" }
}

Sản xuất (Phân phối):

json Copy
{
  "bus": {
    "type": "rabbitmq",
    "connectionstring": "amqp://guest:guest@rabbitmq"
  },
  "databus": {
    "type": "azurestorage",
    "connectionstring": "DefaultEndpointsProtocol=https;..."
  }
}

Các Cách Triển Khai Khác Nhau

Tất cả cùng nhau:

csharp Copy
// SAPHub.Server - Mọi thứ trong một quy trình
.HostModule<ApiModule>()
.HostModule<UIModule>()
.HostModule<SAPConnectorModule>()

Dịch vụ Chỉ API:

csharp Copy
// SAPHub.ApiEndpoint - Chỉ API
.HostModule<ApiModule>()

Dịch vụ Chỉ Kết Nối:

csharp Copy
// SAPHub.SAPConnector - Chỉ tích hợp SAP
.HostModule<SAPConnectorModule>()

Lợi Ích

Hosuto cung cấp sự linh hoạt trong triển khai. Mã mô-đun giống nhau có thể được triển khai gói lại trong một quy trình hoặc phân phối qua nhiều dịch vụ, tùy thuộc vào yêu cầu của bạn.

Bạn Muốn Thử Ngay?

Dưới đây là cách để bắt đầu:

Cài đặt gói:

bash Copy
dotnet add package Dbosoft.Hosuto

Tạo một mô-đun:

csharp Copy
public class MyModule : IWebModule
{
    public string Path => "/api";

    public void ConfigureServices(IServiceProvider serviceProvider, IServiceCollection services)
    {
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseRouting();
        app.UseEndpoints(endpoints => endpoints.MapControllers());
    }
}

Chạy nó:

csharp Copy
ModulesHost.CreateDefaultBuilder(args)
    .UseAspNetCoreWithDefaults()
    .HostModule<MyModule>()
    .Build()
    .Run();

Khi yêu cầu mở rộng xuất hiện, bạn có thể tách các mô-đun ra thành các dịch vụ riêng mà không cần chỉnh sửa mã.

Kết Luận

Hosuto giải quyết thách thức về sự linh hoạt trong triển khai phần mềm doanh nghiệp. Thay vì cam kết vào kiến trúc monolithic hoặc microservices ngay từ đầu, các nhóm có thể bắt đầu với triển khai gói lại và chuyển đổi sang các dịch vụ phân phối khi yêu cầu phát triển. Mã mô-đun vẫn không thay đổi giữa các cấu hình triển khai, cho phép sự tiến hóa kiến trúc mà không cần viết lại. Cách tiếp cận này giảm thiểu cả độ phức tạp ban đầu và nợ kỹ thuật lâu dài.


Muốn thấy Hosuto hoạt động? Hãy xem ứng dụng mẫu SAPHub hoặc khám phá tài liệu về Hosuto để bắt đầu với các ứng dụng .NET linh hoạt của riêng bạn.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào