Table of Contents
- 연혁
마이크로서비스 아키텍처는 확장 가능한, 독립적 인, 탄력있는 소프트웨어 시스템을 구축하기위한 지배적 인 패턴이되었습니다. 그러나, 모놀리 응용 프로그램에서 이동하여 분산 된 서비스로 인해 서비스, 불분명 경계, 테스트 및 배포에서 어려움 사이의 새로운 복잡성을 제공합니다. SOLID 원칙을 microservices에 적용하면 이러한 도전 헤드온을 해결합니다. 이러한 다섯 가지 목표 지향적 인 디자인 가이드라인은 서비스 경계와 상호 서비스 통신에 적응할 때, 각 조직의 조직의 규모를 쉽게 유지할 수 있습니다. 이 응용 프로그램은 다양한 유형의 애플리케이션을 통합하고, 각 조직의 조직의 특정 목표를 달성 할 수 있습니다.
SOLID 원칙은 무엇입니까?
SOLID는 유지 및 확장 가능한 객체 중심 코드를 격려하는 다섯 가지 디자인 원칙을 나타내는 Robert C. Martin (Uncle Bob)가 소개 한 약어입니다. 마이크로 서비스 컨텍스트에서 이러한 원칙은 분리, 집중 서비스 및 명확한 계약으로 번역합니다.
단일 책임 원칙 (SRP)
클래스 또는 모듈은 하나가 있어야하며, 단지 하나의 이유가 변경되어야합니다. 마이크로 서비스에서, 이것은 각 서비스가 단일 비즈니스 기능 또는 하위 도메인을 소유해야 합니다. 예를 들어, 주문 관리 서비스는 주문 라이프 사이클 이벤트를 처리하거나 재고 추적하지 않아야 합니다. 이것은 변경의 폭발 반경을 줄이고 독립적으로 배포할 수 있습니다.
개방/닫히는 원리 (OCP)
소프트웨어 엔티티티티는 확장을 위해 열려 있어야하지만 수정을 위해 닫아야 합니다. 마이크로 서비스에 적용된 서비스는 기존 코드를 수정하지 않고 새로운 기능으로 확장 될 수있는 안정적인 인터페이스 (API 또는 이벤트 계약)를 노출해야합니다. 이것은 종종 버전 API, 이벤트 스키마 진화 또는 플러그인 아키텍처를 통해 달성됩니다.
Liskov 대용법 (LSP)
수퍼 클래스의 개체는 프로그램의 정확한 영향을받지 않고 하위 클래스의 개체와 교체해야합니다. 마이크로 서비스 용 LSP는 서비스 인터페이스의 다른 구현을 보장합니다 (예 : Stripe에서 PayPal로 전환 할 수있는 지불 게이트웨이) 일관성있게 행동하고 소비자를 끊지 않고 교환 할 수 있습니다.
인터페이스 분리 원리 (ISP)
많은 클라이언트 별 인터페이스는 하나의 범용 인터페이스보다 더 낫습니다. 마이크로 서비스에서, 이것은 작은, 집중된 API 또는 이벤트 정의에 각 소비자의 필요에 맞게 번역됩니다. 예를 들어, 고객 서비스는 단말 "고객" 노선 대신 프로파일 검색, 주소 관리 및 충성도 상태에 대한 별도의 엔드 포인트를 노출 할 수 있습니다.
의존성 전환 원리 (DIP)
요약에 따라, concretions. microservices에서 서비스는 메시지 중개인과 같은 초록색 인터페이스에 따라야 합니다. API 게이트웨이, 또는 다른 서비스에 대한 참조보다 서비스 메쉬. 이것은 회전 구현을 교환, 회로 차단기를 도입하거나 비즈니스 논리를 변경하지 않고 캐싱 레이어를 추가 할 수 있습니다.
왜 SOLID 원리는 Microservices에서 중요합니까?
Microservices는 명확하게 경계, 느슨한 연결 및 높은 응집을 요구합니다. SOLID 원리는 이 질을 달성하기 위하여 입증한 기구를 제공합니다. 그(것)들 없이, 팀은 수시로 “분배된 monoliths” 같이 반대로 변덕으로, 서비스가 공유한 데이타베이스 또는 chatty APIs를 통해서 단단하게 결합됩니다. SOLID 적용은 건축 수준에 있는 관심사의 별거를 위해 이것을 막습니다.
또한, 서비스의 수가 성장함에 따라 변화가 급격히 감소하는 비용으로 의존이 관리되지 않는 경우. SOLID 원칙은 의존성을 유지하고, 독립적으로 서비스를 진화 할 수 있도록 팀과 전환 할 수 있습니다. 이 마이크로 서비스 목표와 직접 정렬 : 독립적 인 배포 가능성, 스케일링 및 탄력.
Microservices의 SOLID 원칙 적용의 이점
향상된 유지
각 서비스는 단 하나 책임을 져서, 1개의 서비스로 거의 영향을 미칩니다. 예를 들어, 인증 서비스로 새로운 사용자 검증 단계를 추가하면 사용자 프로필 서비스에 변경할 필요가 없습니다. 이 고립은 재발견 테스트 범위와 배포 위험을 감소시킵니다. 팀은 자체 캐비티에서 개별 서비스에 업데이트를 해제할 수 있으며, 배달주기를 가속화합니다.
향상된 확장성
SRP 및 ISP와 함께 설계된 서비스는 자연적으로 더 많은 과립입니다. 이 과립은 조직이 더 높은 수요를 경험하는 구성 요소 만 확장 할 수 있습니다. 예를 들어, 비디오 스트리밍 플랫폼은 메타 데이터 조회 서비스에서 독립적으로 변환 서비스를 확장 할 수 있습니다. 의존도가 (DIP)이기 때문에 서비스가 업스트림 또는 다운스트림 파트너를 사기가 필요하지 않습니다.
더 큰 유연성과 재사용성
인터페이스 분리는 소비자가 필요로 하는지 어느 서비스를 노출하는지 보증합니다. 이 연결을 최소화하고 여러 소비자를 통해 재사용할 수 있는 인터페이스를 제공합니다. 예를 들어, SMS를 위한 별도의 인터페이스를 가진 알림 서비스는 주문, 청구 및 계정 서비스에 의해 변경되는 변경 없이 재사용될 수 있습니다. 오픈/닫힌 원리는 더 새로운 알림 채널(예: WebSocket)을 기존 인터페이스를 변경하지 않고 추가할 수 있습니다.
더 나은 시험
잘 정의된 인터페이스를 가진 고립된 서비스는 시험하기 매우 쉽습니다. 구체적인 서비스의 대신에 요약 (DIP)에 달려 있는 단위 테스트는 개발자가 조롱하거나 텁을 사용할 수 있도록 허용합니다. 통합 테스트는 각 서비스가 시험 마구에 대하여 고립에서 실행될 수 있기 때문에 더 간단합니다. 더 높은 시험 적용은 몇몇 생산 사건 및 빠른 의견 반복에 지도합니다.
결함 포용력과 탄력
DIP에 대한 접착으로, 서비스는 메시지 큐 또는 서비스 메쉬 프록시와 같은 초록 통신 채널에 의존합니다. 이러한 요약은 서비스 논리를 변경하지 않고 retries, timeouts, circuit breakers 및 bulkheads를 구현할 수 있습니다. 예를 들어, 메시지 브로커 (DIP)를 통해 지불 이벤트를 보내 주문 서비스는 일시적으로 사용할 수 없는 경우에도 계속 기능을 계속할 수 있습니다. 이벤트는 나중에 처리에 대한 할당됩니다.
Easier 온보딩 및 팀 자율
서비스 SRP와 ISP를 따르는 경우, 그들의 책임은 명확하고 제한적입니다. 새로운 개발자는 서비스의 목적을 빨리 이해하고 이해할 수 있습니다. 팀은 다른 사람의 깊은 지식이 필요없는 관련 서비스의 세트를 소유 할 수 있습니다. 이것은 마이크로 서비스 약속을 가진 자율적이고, 횡단 기능적인 팀의 유형을 가능하게 합니다.
Microservices의 SOLID의 실제 응용
SRP와 서비스 경계 정의
도메인을 경계 상황에 맞게 변경하여 시작하십시오. 각 컨텍스트는 서비스가됩니다. 예를 들어 전자 상거래 시스템에서 카탈로그, 카트, 주문, 지불, 배송 및 리뷰에 대한 별도의 서비스를 만듭니다. 각 서비스는 데이터 및 비즈니스 규칙을 소유합니다. 책임감을 섞는 "비옥 서비스"를 만들 수 없습니다.
OCP 및 ISP와 안정적인 인터페이스 설계
Create interface Definitions (contracts) using protobuf, OpenAPI, 또는 AsyncAPI. 이 인터페이스는 버전과 확장 가능. 예를 들어, "주문 생성" 이벤트는 필드를 포함해야하지만 옵션 속성을 통해 미래 필드를 허용. 기존의 하나 수정 대신 새로운 엔드포인트 또는 메시지 유형을 추가하여 변경을 방지하십시오.
LSP와 Substitutability를 관리
여러 서비스가 동일한 인터페이스(예: 다중 결제 게이트웨이 어댑터)를 구현할 때 계약을 표준화합니다. 예상 행동(예: 결제를 수락하는 경우, 일관된 오류 코드와 함께 성공 또는 실패를 반환)에 어떤 구현을 준수하는 통합 테스트를 작성합니다. 이로 인해 게이트웨이를 안전하게 교환합니다.
메시징 및 서비스 메시를 가진 의존성
서비스 대신 서비스 B에 직접 HTTP 통화를 만드는, 서비스 A는 메시지 브로커 (Kafka, RabbitMQ)에 이벤트를 게시하거나 서비스 메쉬 (Istio, Linkerd)를 사용합니다. 서비스 메쉬는 재try, timeout 및 회로 브레이징 정책을 처리 할 수 있습니다. 서비스 내부의 비즈니스 논리 A는 소멸 네트워크에 대한 임신 남아 있습니다.
도전과 생각
마이크로서비스의 SOLID 원칙을 적용하면 도전이 없습니다. (ISP는 너무 적극적으로 적용)는 채팅 인터페이스와 너무 많은 서비스로 이어질 수 있으며, 운영 오버 헤드를 늘리고 있습니다. 마찬가지로 엄격한 SRP는 팀에게 "nanoservices"라는 결과, "nanoservices"의 모든 작은 단위를 위해 마이크로서비스를 만들 수 있습니다. 균형은 키입니다.
또 다른 도전은 버전화 및 백워드 호환성입니다. OCP가 주의적인 저작물 정책을 요구합니다. schema Registry (Confluent Schema Registry, Apicurio)와 같은 도구는 호환성 수준을 관리할 수 있습니다.
마지막으로, 팀 문화 및 조직 정렬 문제. 명확한 소유권 및 커뮤니케이션 없이, 심지어 잘 정의된 SOLID 서비스는 조직 습관을 통해 단단히 결합 될 수 있습니다 (예를들면, 공유 데이터베이스 또는 공유 라이브러리). 지속적인 통합 및 DevOps 관행은 독립적 인 배포를 지원해야합니다.
관련 기사
마이크로서비스 아키텍처의 SOLID 원칙을 채택하는 것은 은 총알이 아니지만, 유지 보수, 확장성 및 탄력있는 건물 시스템에 대한 강력한 가이드입니다. 명확한 책임, 안정적인 계약, substitutability, 미세 곡물 인터페이스 및 통합 된 의존성에 초점을 맞추고 팀이 많은 일반적인 pitfalls를 방지 할 수 있습니다. 시스템 성장과 진화로 떨어져있는 고급 디자인의 투자는 [2] [2]] [2]]] [2]]] [2]]] [2]]] [2]]]] [2]]]] [2]]]]] [2]]]]]] [2]]]]]]] [2]]]]]]]]]]]] [2]]]]]]]]] [] []]] [[]]]]]]]]]]]] [[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] [[[[[[[[[[[[[[]]]]]]]]]]]]]