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 сақталады.