DesignPattern

MSA 아키텍쳐

Sophie소피 2022. 10. 5. 16:13

"하나의 큰 어플리케이션을 여러개의 작은 어플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍쳐"

이것은 마치 레고놀이와 같다.

작은 레고블록(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하게 개발/운영 할 수 있다

스프링 부트 마이크로서비스 구축?

스프링 부트의 가벼운 장점을 통해 클라우드 환경에 적용하기 용이하다.

실제 마이크로서비스가 담당하는 일과 사용자가 요청을 할 경우 어떠한 흐름으로 처리되는걸까?

  1. HTTP GET 요청 : 클라이언트가 hello마이크로서비스에 HTTP GET요청을 전송한다. (GET http://localhost:8080/hello/sophie/kim)
  2. 스프링 부트 마이크로서비스 흐름
    1. 경로 매핑 : 스프링 부트는 HTTP요청을 파싱하고 HTTP 동사와 URL, URL에 정의된 매개변수를 기반으로 경로를 매핑한다. 경로는 스프링 RestController 클래스의 매서드에 매핑된다.
    2. 매개변수 분해 : 스프링 부트가 경로를 인식하면 경로 내부에 정의된 매개변수 작업을 수행한 자바 메서드에 매핑한다.
    3. JSON ->자바 객체 매핑 : HTTP PUT이나 POST는 HTTP본문(body)에서 전달된 JSON을 자바 클래스에 매핑한다.
    4. 비즈니스 로직 실행 : 모든 데이터가 매핑되면 스프링 부트는 비즈니스 로직을 전달한다.
    5. 자바->JSON 객체 매핑 : 비즈니스 로직이 실행되면 스프링 부트는 자바 객체를 JSON으로 변환한다.
  3. 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"}이 브라우저에 출력