[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mikroservisy-chto-takoe-pattern-strangler-fig":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},833,"chto-takoe-pattern-strangler-fig",23,"mikroservisy","Микросервисы","🔗","Что такое паттерн Strangler Fig?","Strangler Fig (душитель) — это паттерн постепенной миграции от монолита к микросервисам. Вместо рискованного «Big Bang» переписывания, новая функциональность реализуется в микросервисах, а существующая постепенно перемещается из монолита.\n\n> Аналогия из жизни: название происходит от тропического фикуса-душителя, который обвивает другое дерево и постепенно замещает его. Монолит — это старое дерево, микросервисы — новые побеги.\n\n### Этапы миграции\n\n```\nЭтап 1: Монолит обрабатывает все запросы\n┌──────────┐\n│ Клиенты  │──► Монолит\n└──────────┘\n\nЭтап 2: Фасад перенаправляет часть запросов\n┌──────────┐    ┌─────────┐    ┌──────────────┐\n│ Клиенты  │──► │ Gateway │──► │   Монолит    │ (старые функции)\n└──────────┘    └────┬────┘    └──────────────┘\n                     └──────► Микросервис A      (мигрированные)\n\nЭтап 3: Большинство функций мигрировано\n┌──────────┐    ┌─────────┐    ┌──────────────┐\n│ Клиенты  │──► │ Gateway │──► │   Монолит    │ (минимум)\n└──────────┘    └────┬────┘    └──────────────┘\n                     ├──────► Микросервис A\n                     ├──────► Микросервис B\n                     └──────► Микросервис C\n\nЭтап 4: Монолит полностью заменён\n```\n\n\u003Cdetails>\u003Csummary>Реализация через Spring Cloud Gateway\u003C\u002Fsummary>\n\n```yaml\nspring:\n  cloud:\n    gateway:\n      routes:\n        # Новый функционал — микросервис\n        - id: new-payments\n          uri: lb:\u002F\u002Fpayment-service\n          predicates:\n            - Path=\u002Fapi\u002Fv2\u002Fpayments\u002F**\n\n        # Старый функционал — пока в монолите\n        - id: legacy-reports\n          uri: http:\u002F\u002Fmonolith:8080\n          predicates:\n            - Path=\u002Fapi\u002Freports\u002F**\n\n        # Постепенная миграция: сначала 10% трафика на новый сервис\n        - id: canary-customers\n          uri: lb:\u002F\u002Fcustomer-service\n          predicates:\n            - Path=\u002Fapi\u002Fcustomers\u002F**\n            - Weight=new, 10\n\n        - id: legacy-customers\n          uri: http:\u002F\u002Fmonolith:8080\n          predicates:\n            - Path=\u002Fapi\u002Fcustomers\u002F**\n            - Weight=legacy, 90\n```\n\n\u003C\u002Fdetails>\n\n### Стратегии выделения микросервисов из монолита\n\n1. Новая функциональность — всё новое пишем как микросервис.\n2. По бизнес-домену — выделяем наиболее изолированные модули.\n3. По частоте изменений — выделяем то, что часто меняется.\n4. По требованиям к масштабированию — выделяем «горячие» модули.\n\n### Anti-Corruption Layer\n\nAnti-Corruption Layer — слой-адаптер между микросервисом и монолитом, который транслирует модели и предотвращает загрязнение новой чистой модели старыми структурами.\n\n\u003Cdetails>\u003Csummary>Пример Anti-Corruption Layer\u003C\u002Fsummary>\n\n```java\n@Service\npublic class LegacyCustomerAdapter implements CustomerProvider {\n    private final LegacyMonolithClient monolithClient;\n\n    @Override\n    public Customer getCustomer(Long id) {\n        \u002F\u002F Получаем данные из монолита в его формате\n        LegacyCustomerDto legacy = monolithClient.fetchCustomer(id);\n        \u002F\u002F Преобразуем в нашу чистую доменную модель\n        return Customer.builder()\n            .id(legacy.getCustId())           \u002F\u002F custId → id\n            .fullName(legacy.getFio())         \u002F\u002F fio → fullName\n            .email(legacy.getElectronicMail()) \u002F\u002F electronicMail → email\n            .build();\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n> **На собеседовании:** ключевой посыл — постепенность и безопасность миграции. Упомяните API Gateway как фасад и Anti-Corruption Layer для защиты модели. Частая ошибка — забыть про ACL и допустить «утечку» старых абстракций в новые сервисы.","","middle",[15],"microservices",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Что такое паттерн Strangler Fig? — Gymterview","Strangler Fig (душитель) — это паттерн постепенной миграции от монолита к микросервисам. Вместо рискованного «Big Bang» переписывания, новая функциональность ре","Strangler Fig (душитель) — это паттерн постепенной миграции от монолита к микросервисам. Вместо рискованного «Big Bang» ",[15,13],"Strangler Fig (душитель) — это паттерн постепенной миграции от монолита к микросервисам. Вместо рискованного «Big Bang» переписывания, новая функциональность реализуется в микросервисах, а существующая постепенно перемещается из монолита.",true]