"하나의 큰 어플리케이션을 여러개의 작은 어플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍쳐"
이것은 마치 레고놀이와 같다.
작은 레고블록(Microservice) 하나하나를 붙여
어떠한 큰 결과물을 만드는 형태를 MSA 라고한다.
small services, each running in its own process(스스로 돌아 갈 수 있는 작은 서비스) 와, independently deployable(독립적 배포 가능) 이 MicroService를 설명해 줄 수 있는 가장 핵심적인 문구라고 생각합니다.
microService의 정의
이 MicroService를 설명해 줄 수 있는 가장 핵심적인 문구
small services, each running in its own process(스스로 돌아 갈 수 있는 작은 서비스) 와, independently deployable(독립적 배포 가능)
- 각각의 서비스는 그 크기가 작을 뿐, 서비스 자체는 하나의 모놀리틱 아키텍쳐와 유사한 구조를 가짐
- 각각의 서비스는 독립적으로 배포가 가능해야함.
- 각각의 서비스는 다른 서비스에 대한 의존성이 최소화 되어야함
- 각 서비스는 개별 프로세스로 구동 되며, REST와 같은 가벼운 방식으로 통신되어야 함.
MSA의 장점
우선 MSA의 장점에 대해 알아보도록 하겠습니다. MSA는 서비스가 커지면서 생겼던 Monolithic Architecture의 문제점들을 어느정도 보완해 줄 수 있습니다.
- 배포(deployment) 관점서비스 별 개별 배포 가능 ( 배포 시 전체 서비스의 중단이 없음)
- 요구사항을 신속하게 반영하여 빠르게 배포할 수 있음.
- 확장(scaling) 관점특정 서비스에 대한 확장성이 용이함.
- 클라우드 사용에 적합한 아키텍쳐.
- 장애(failure) 관점장애가 전체 서비스로 확장될 가능성이 적음
- 부분적 장애에 대한 격리가 수월함
신기술의 적용이 유연하고, 서비스를 polyglot하게 개발/운영 할 수 있다
스프링 부트 마이크로서비스 구축?
스프링 부트의 가벼운 장점을 통해 클라우드 환경에 적용하기 용이하다.
실제 마이크로서비스가 담당하는 일과 사용자가 요청을 할 경우 어떠한 흐름으로 처리되는걸까?
- HTTP GET 요청 : 클라이언트가 hello마이크로서비스에 HTTP GET요청을 전송한다. (GET http://localhost:8080/hello/sophie/kim)
- 스프링 부트 마이크로서비스 흐름
- 경로 매핑 : 스프링 부트는 HTTP요청을 파싱하고 HTTP 동사와 URL, URL에 정의된 매개변수를 기반으로 경로를 매핑한다. 경로는 스프링 RestController 클래스의 매서드에 매핑된다.
- 매개변수 분해 : 스프링 부트가 경로를 인식하면 경로 내부에 정의된 매개변수 작업을 수행한 자바 메서드에 매핑한다.
- JSON ->자바 객체 매핑 : HTTP PUT이나 POST는 HTTP본문(body)에서 전달된 JSON을 자바 클래스에 매핑한다.
- 비즈니스 로직 실행 : 모든 데이터가 매핑되면 스프링 부트는 비즈니스 로직을 전달한다.
- 자바->JSON 객체 매핑 : 비즈니스 로직이 실행되면 스프링 부트는 자바 객체를 JSON으로 변환한다.
- HTTP GET 응답 : 클라이언트가 서비스에서 JSON으로 응답을 받는다. 호출 성공과 실패는 HTTP상태 코드로 반환된다. (HTTP STATUS:200 {"message":"Hello /sophie/kim"})
Application.java
@SpringBootApplication
@RestController
@RequestMapping(value="hello")
public class Application{
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
@RequestMapping(value="/{firstName}/{lastName}", method = RequestMethod.GET)
public String hello(@PathVariable("fristName")String firstName,
@PathVariable("lastName")String lastName){
return String.format("{\\"message\\" : \\"Hello %s %s\\"}", firstName, lastName);
}
}
위의 코드를 실행 후 호출하면 {"message" : "Hello sophie kim"}이 브라우저에 출력
'DesignPattern' 카테고리의 다른 글
Architecture EDA(Event Driven Architecture) 마틴 파울러의 4가지 구현 패턴에 대해 (0) | 2023.05.08 |
---|---|
AOP 입문자를 위한 기초 개념 : Spring을 사용하지 않는 AOP 구현 방법 (0) | 2022.12.29 |
디자인 패턴 SOLID : Open- closed principle 개방 폐쇄 원칙 (1) | 2022.10.05 |
SOLID 디자인 패턴 : 단일 책임 원칙 (Single Responsibility) (0) | 2022.10.03 |