← Барлық мақалаларға оралу

Strangler Fig Pattern: Legacy MVC-ден .NET Core-ға кезең-кезеңімен миграция

Жарияланды

Strangler Fig деген не?

Strangler Fig pattern, яғни иесін біртіндеп қоршап, кейін алмастыратын фикус ағашының атымен аталған тәсіл, legacy systems-ті кезең-кезеңімен модернизациялау стратегиясы. Бүкіл system-ді бірден толық rewrite жасап тәуекелге барудың орнына, ескі functionality жаңа functionality-мен біртіндеп ауыстырылады, ал system жұмысын жалғастыра береді.

Практикалық кейс: ASP.NET MVC-ден ASP.NET Core-ға миграция

Бізде .NET Framework 4.8 негізіндегі ескі application бар деп елестетейік. Барлығын бірден rewrite жасау тым қауіпті. Сондықтан Strangler Fig pattern қолданамыз.

Бастапқы нүкте мынадай: business service-ке тікелей қатынайтын standard legacy controller.

namespace LegacyMvcApp.Controllers
{
    public class LegacyOrdersController : Controller
    {
        public async Task<ActionResult> Details(int id)
        {
            // Old direct dependency
            var ordersService = new OrderService();
            var order = await ordersService.GetById(id);

            if (order == null)
            {
                return HttpNotFound();
            }

            return View(order);
        }
    }
}

1-қадам. Жаңа ASP.NET Core API дайындау

Алдымен жаңа API жасаймыз. Бұл API ішінде modern business logic және independent controllers болады.

[Route("api/[controller]")]
[ApiController]
public class OrdersController(IOrdersService ordersService) : ControllerBase
{
    [HttpGet("{id}")]
    public ActionResult<Order> Get(int id)
    {
        var order = ordersService.GetById(id);

        if (order == null)
        {
            return NotFound();
        }

        return Ok(order);
    }
}

2-қадам. Ескі MVC жаңа system-ді шақыра бастайды

Legacy controller өз орнында қалады, routes бұрынғыдай жұмыс істейді. Бірақ controller ішінде request енді жаңа ASP.NET Core API-ға жіберіледі.

Production environment ішінде static HttpClient жасағаннан гөрі IHttpClientFactory қолданған дұрыс.

public class LegacyOrdersController : Controller
{
    private static readonly HttpClient _httpClient = new HttpClient();
    private static readonly string _newApiBaseUrl =
        ConfigurationManager.AppSettings["NewApiBaseUrl"];

    public async Task<ActionResult> Details(int id)
    {
        var url = $"{_newApiBaseUrl}/api/orders/{id}";

        // Call the new API to get the order details
        var response = await _httpClient.GetAsync(url);

        if (response.IsSuccessStatusCode)
        {
            var json = await response.Content.ReadAsStringAsync();
            var order = JsonConvert.DeserializeObject<Order>(json);

            if (order == null)
            {
                return HttpNotFound();
            }

            return View(order);
        }

        return new HttpStatusCodeResult((int)response.StatusCode);
    }
}

Осылай UI өзгермейді және URL бұрынғыдай қалады, бірақ functionality енді Core ішінде өмір сүреді.

Тәсілдің артықшылықтары

  • Кезең-кезеңімен процесс. Functionality бір endpoint бойынша көшіріледі.

  • Минималды тәуекел. Қажет болса, ескі logic fallback ретінде қолжетімді болып қалады.

  • Нақты жағдайда тестілеу. Жаңа API бірден real load астында, бірақ controlled mode ішінде жұмыс істейді.

  • Downtime жоқ. Users migration process байқамайды.

Backend көшкеннен кейін не болады?

Бүкіл API .NET Core ішінде жұмыс істей бастағаннан кейін келесі phase бастауға болады. Ескі MVC Views біртіндеп modern frontend-пен ауыстырылады: React, Vue немесе Angular. Ескі system біртіндеп кішірейеді, соңында тек жаңа architecture қалады.

Қорытынды

Strangler Fig pattern - outdated .NET applications модернизациялаудың ең қауіпсіз жолы. Ол logic-ті ASP.NET Core-ға біртіндеп әрі ауыртпалықсыз көшіруге мүмкіндік береді, әр қадамда stability және control сақталады.