SpringCloud

[Spring Cloud 를 활용한 MSA 기초] 2. 마이크로서비스 아키텍처(MSA) 이해

nineDeveloper 2021. 2. 7.
728x90

2. 마이크로서비스 아키텍처(MSA) 이해


youtu.be/mJMzV6GCmPw

MSA란, 시스템을 여러개의 독립된 서비스로 나눠서,
서비스를 조합함으로서 기능을 제공하는 아키텍쳐 디자인 패턴

  • 조대협

출처: https://www.slideshare.net/Byungwook/micro-service-architecture-52233912


아마존의 선택(2002년경 제프 베조스 메일)

  1. 모든 팀들은 데이터와 기능들을 서비스 인터페이스로 연결시켜라
  2. 팀들은 이 인터페이스를 통해서만 연락해야 한다
  3. 다른 어떤 커뮤니케이션 방법도 허용되지 않는다
    직접 링크를 보내거나 다른 팀의 스토리지에 직접 억세 스 해서도 안 되며, 공유 메모리나 백도어 같은 것도 안 된다
    모든 커뮤니케이션은 네트워크를 통한 서비스 인터페이스로 이루어져야 한다
  4. 어떤 기술을 쓰든 상관없다
    HTTP, Cobra, Pubsub, 독자 프로토콜...그건 상관없다
    베조스는 그런데 관심 없다
  5. 모든 서비스 인터페이스는 예외 없이 외부에서 이용 가능하게 만들어져야 한다
    그 말은 팀들은 외부 개발 자들이 인터페이스를 이용할 수 있게 해야한다는 것이다
    예외는 없다
  6. 이를 실천하지 않는 사람은 누구든 해고될 것이다

MSA 의 가장 본질적인 부분(해고 빼고;;)

출처: http://eggry.egloos.com/3763434

  • 2006년 아마존 웹 서비스(AWS) 릴리즈
    • 내부적으로 사용한 것과 똑같은 플랫폼

넷플릭스의 선택

  • 2008년 데이터베이스에 심각한 문제가 발생해 고객에게 DVD 를 보낼 수 없는 사태 발생(Single points of failure)
    • Scale-up 확장만 가능한 인프라 스트럭처와 단일 장애 지점(SPOF)이라는 한계에서 벗어나길 선언
    • 그 시작은 아파치 카산드라
  • 2009년 아마존 웹 서비스(AWS)로 이관 시작
    • 세 가지 목표에 집중. 확장성(Scalability), 성능(Performance), 가용성(Availability)
  • “자체 보유 인프라와 솔루션으로는 이렇게 급증한 트래픽을 감당할 수 있는 확장성을 확보할 수 없었을 것”
    • 유리 이즈라일레프스키(Yuri Izrailevsky), Netflix 클라우드 및 플랫폼 엔지니어링 부문 부사장


MSA 란

  • 공식적인 정의는 없다. 단지, 다음 공감대가 있을 뿐(Microservices in 위키피디아)

    • 각 서비스 간 Network 를 통해, 보통 HTTP 를 통해
    • 독립된 배포 단위
    • 각 서비스는 쉽게 교체 가능
    • 각 서비스는 기능 중심으로 구성됨. e.g. 프론트 엔드, 추천, 정산, 상품, 등
    • 각 서비스에 적합한 프로그래밍 언어, 데이터베이스, 환경으로 만들어진다
    • 서비스는 크기가 작고, 상황에 따라 경계를 정하고, 자율적으로 개발되고, 독립적으로 배포되고, 분산되고, 자동화 된 프로세스로 구축되고 배포된다
  • 마이크로서비스는 한 팀에 의해 개발할 수 있는 크기가 상한선이다
    절대로 3~9명의 사람들이 스스로 더 많은 개발을 할 수 없을 정도로 커지면 안된다

  • '마이크로서비스는 아직까지 아이디어 수준에서 크게 벗어나 있지 않다
    다양한 산업 분야에서 폭넓게 적 용되고 있지만 그것이 좋은지 나쁜지는 시간이 더 지나봐야 알 수 있다'

    • 조쉬 롱, 케니 바스타니, 피보탈

Monolithic VS Microservices

각 Microservice 별로 DB 를 가짐(공유되는 상태가 없음)
REST API 인터페이스 외엔 호출할 방법이 없음


[실습] 프로젝트 import

https://github.com/freespringlecture/spring-cloud-workshop.git

Tag : step-0

  1. 아직 Clone 안했다면 Clone!
  2. clone 한 directory 로 이동
    • cd spring-cloud-workshop
  3. 실습 시작 시점으로 git 이동
    • git checkout tags/step-0
  4. IntelliJ에서 build.gradle import
    • File > Open - root 폴더 build.gradle 선택 - Open as Project

  1. Import Project from Gradle


[실습] 소스 살펴 보기


[실습] Rest API로 Display -> Product 연동

1. Display -> Product 호출

@RestController
@RequestMapping(path = "/displays")
public class DisplayController {

    private final ProductRemoteService productRemoteService;

    public DisplayController(ProductRemoteService productRemoteService) {
        this.productRemoteService = productRemoteService;
    }

    @GetMapping(path = "/{displayId}")
    public String getDisplayDetail(@PathVariable String displayId) {
        String productInfo = getProductInfo();
        return String.format("[display id = %s at %s %s ]", displayId, System.currentTimeMillis(), productInfo);
    }

    private String getProductInfo() {
        return productRemoteService.getProductInfo("12345");
    }
}

2. Display / Product 실행

-   Product 동작 확인 : [http://localhost:8082/products/22222](http://localhost:8082/products/22222)
-   Display 동작 확인 :[http://localhost:8081/displays/11111](http://localhost:8081/displays/11111)
728x90

댓글

💲 추천 글