- 수정예정
'개발 > MSA' 카테고리의 다른 글
[MSA] 헥사고날 아키텍처와 MSA 전환 (0) | 2024.11.03 |
---|---|
DDD와 Event Storming (3) | 2024.11.02 |
[k8s] kubernetes 클러스터 (1) | 2024.04.06 |
[k8s] kubernetes란? (0) | 2024.02.29 |
[MSA] MSA (Microservices Architecture) 표준 아키텍처 (0) | 2024.02.15 |
[MSA] 헥사고날 아키텍처와 MSA 전환 (0) | 2024.11.03 |
---|---|
DDD와 Event Storming (3) | 2024.11.02 |
[k8s] kubernetes 클러스터 (1) | 2024.04.06 |
[k8s] kubernetes란? (0) | 2024.02.29 |
[MSA] MSA (Microservices Architecture) 표준 아키텍처 (0) | 2024.02.15 |
이전글에서 MSA개요와 Event Storming에 대해 다뤘고,
👉MSA개요
👉Event Storming
이번글부터는 MSA 구현방법을 하나씩 다뤄보겠습니다.
MSA의 서비스 구현은 기본적으로 헥사고날 아키텍처를 준용합니다.
헥사고날 아키텍처란? 느슨하게 결합된 MSA 서비스 구현을 목표로
Micro Service 단위로 분리된 각 서비스마다 외부와의 연동을 위한 In/Out-Bound Adapter, DB접근을 위한 ORM을 구성하고,
서비스(도메인)별 언어활용을 통한 코드 작성 및 기술적 구현을 진행하는 아키텍처
위 사진과 같이 헥사고날 아키텍처를 준용하여 서비스를 구현한다면 MSA 목표인 독립성을 달성할 수 있을 것으로 기대합니다.
아래는 SpringBoot 기반의 헥사고날 아키텍처를 표현한 사진입니다.
👉이전글에서 언급한 Event Storming을 활용하여 MSA 서비스를 설계한다면,
보다 쉽게 헥사고날 아키텍처를 준용하여 SpringBoot기반의 서비스를 설계할 수 있습니다.
아래는 Event Storming 스티커와 SpringBoot 모듈간 매핑 관계입니다.
레거시에서 MSA로의 전환을 시작할 때, 일반적으로 아래 내용이 검토되어야 합니다.
그리고 Strangler 패턴을 적용하여 보다 안정적인 전환이 가능합니다.
Strangler 패턴이란? 레거시 모놀리스에서 Micro Service로 구현할 일부 모듈을 점진적으로 확대 분류하여 Micro Service로 구현함으로서
MSA 전환 시, 비즈니스 영향도를 최소화하는 패턴
해당 Strangler 패턴을 적용하기 위해서는 MSA로 분리된 서비스와 기존 모노리스를 어떻게 연동할 지에 대한 방법을 고민해야 합니다.
아래는 레거시와 MSA간 API 통합 방법입니다.
레거시와 MSA 서비스간의 단일 진입점인 API Gateway를 구성하여 URL 기반의 라우팅이 되도록 구성한다면,
MSA로의 점진적 전환을 위한 Strangler 패턴을 적용할 수 있습니다.
예를들어, Front 모듈에서 Back 모듈로 임의의 요청을 보낼 때의 url로 레거시 서비스와 MSA 서비스를 구분할 수 있다면,
API Gateway에서의 간단한 설정을 통해 url을 통해 레거시와 MSA를 구분한 라우팅이 가능하도록 설계할 수 있습니다. 이를 통해 레거시와 MSA를 통합할 수 있죠.
API Gateway와 Service Registry의 자세한 내용은 추후 별도 글로 다뤄보도록 하겠습니다.
[MSA] API Gateway와 Circuit Breaker (0) | 2024.11.07 |
---|---|
DDD와 Event Storming (3) | 2024.11.02 |
[k8s] kubernetes 클러스터 (1) | 2024.04.06 |
[k8s] kubernetes란? (0) | 2024.02.29 |
[MSA] MSA (Microservices Architecture) 표준 아키텍처 (0) | 2024.02.15 |
DDD란? 소프트웨어 개발 전체 LifeCycle에서 도메인 중심의 사고를 장려하는 소프트웨어 개발 철학
도메인은 특정 분야의 비즈니스라고 볼 수도 있는데,
비즈니스 관점으로 소프트웨어 구조를 설계해보자는 패러다임(?)이라고 생각하면 쉬울 것 같습니다.
예시로 A호텔에서 IT회사인 B테크 회사에게 호텔 예약 플랫폼 개발 사업을 발주했다고 가정해보겠습니다.
기존대로라면 B테크 회사는 대중적으로 활용되었던 폭포수 모델을 활용하여 플랫폼 개발에 나설거에요.
요구사항 수집 -> 설계 -> 개발...
여기서 B테크는 고객의 요구사항을 데이터 및 시스템 중심으로 설계하여 개발을 진행합니다.
B테크는 고객의 요구사항을 데이터 및 시스템 관점으로 설계해야 하는 다소 까다로운 과정을 거치게 되고,
고객의 요구사항이 긴급하게 바뀌었을 때는 해당 과정을 다시 진행해야 하기 때문에 유연하게 대처하기 힘듭니다.
하지만 B테크가 DDD를 적용한다면?
위에서 언급한 DDD의 장점을 누리기 위해서는 비즈니스 종사자와 개발자가 코드 기반으로 원할한 소통이 보장되어야 합니다.
이를 위해 아래의 규칙이 준수되어야 하죠.
: 비즈니스 종사자와 개발자가 모두 이해할 수 있는 네이밍을 활용해야 합니다. (ex. create_reservation -> make_reservation)
: 다른 도메인간 언어 통일이 되었을 때, 오히려 혼란을 야기할 수 있습니다.
AS-IS
public void createReservation(User user, Seat seat, LocalDateTime startTime, LocalDateTime endTime){
Reservation reservation = new Reservation();
reservation.setUserId(user.id);
reservation.setSeatId(seat.id);
reservation.setStartTime(startTime);
reservtiion.setEndTime(endTime);
this.reservationRepository.save(reservation);
}
TO-BE
public void makeReservation(User user, Seat seat, LocalDateTime startTime, LocalDateTime endTime){
this.reservationCommandService
.makeReservation(user, seat, startTime, endTime);
}
MSA개요는 👉MSA개요 글 참고
위와 같은 DDD 적용 규칙은 모놀리스 아키텍처보다 MSA에서 더 쉽게 적용될 수 있습니다.
모놀리스에서는 다른 도메인간 언어 통일이 필요하다는 등의 이유가 있기 때문이에요.
그렇기 때문에 DDD는 MSA에서 많이 활용되고 있는 방법론입니다.
DDD를 MSA에 적용한다고 했을 때,
서비스를 얼마나 분해할 지에 대해서는 아래 기준을 고려하여 결정합니다.
도메인을 어떻게 연동할 지에 대해서는
연관성 및 중요도가 높을 수록 아래 우선순위대로 연동방식을 고려해야 합니다.
Event Storming이란? 시스템에서 발생하는 이벤트 중심으로 분석 및 설계하는 기법으로 MSA 기반의 도메인에 대한 빠른 이해를 도모
전통적 방식에서 진행하던 UML 및 ERD 설계 대신에 비즈니스 종사자와 함께 진행하는 과정으로 보면 됩니다.
포스트잇 유형
방법 : 아래 언급된 순서에 맞게 포스트잇을 겹쳐 붙이는 방식, 연동의 경우는 선으로 연결, 분리된 도메인은 Bounded Context로서 분리 표시
순서
다음 글은 MSA 구현에 대해 살펴보겠습니다.
[MSA] API Gateway와 Circuit Breaker (0) | 2024.11.07 |
---|---|
[MSA] 헥사고날 아키텍처와 MSA 전환 (0) | 2024.11.03 |
[k8s] kubernetes 클러스터 (1) | 2024.04.06 |
[k8s] kubernetes란? (0) | 2024.02.29 |
[MSA] MSA (Microservices Architecture) 표준 아키텍처 (0) | 2024.02.15 |
CIDR (Classless Inter-Domain Routing) : ip주소를 할당하는 방법 (ex. 122.149.196.85/32, 0.0.0.0/0 등)
구성요소
Base IP
Subnet Mask
Private IP : IANA (The Internet Assigned Numbers Authority)에서 생성한 IP 주소
Subnets : VPC 내부에 있는 IP주소 범위의 일부
특징
Internet Gateway : Subnet에 인터넷을 연결하기 위한 EC2 또는 Lambda
특징
NAT Gateway : AWS 관리형 NAT Instance
특징
NACL : Subnet 보안 Level, Subnet을 오가는 트래픽을 제어하는 방화벽이라 보면될 듯
Incoming Request : 요청이 Subnet으로 들어가기 전에 NACL로 이동 (요청이 허용되지 않으면 Subnet으로 못들어감) -> NACL을 통과하면 Security Group 인바운드 규칙 검증
Outbound Request : Security Group 아웃바운드 규칙 검증 -> Security Group을 통과하면 NACL 아웃바운드 규칙 검증
VPC Peering : 다양한 region/계정에서 생성되는 VPC를 AWS 네트워크를 통해 연결하고 싶을 때 활용 -> 연결되는 VPC가 모두 같은 네트워크에 있을 수 있도록 함
특징
VPC Flow Logs : Interface로 들어오는 IP 트래픽에서 정보를 확인할 수 있음 (VPC/Subnet/ENI level)
특징
Transit Gateway : 여러 VPC를 연결하기 위한 Gateway -> VPC간 peering 때문에 야기되는 복잡한 AWS 네트워크 토폴로지를 보완 (mesh -> 중앙집중형?)
특징
[AWS] AWS 보안 및 암호화 (1) | 2024.06.30 |
---|---|
[AWS] IAM 고급 (0) | 2024.06.25 |
[AWS] CloudWatch and CloudTail (1) | 2024.06.11 |
[AWS] AWS Database (0) | 2024.06.08 |
[AWS] Serverless (Lambda/DynamoDB/API Gateway) (1) | 2024.06.08 |