728x90
2. 마이크로서비스 아키텍처(MSA) 이해
MSA란, 시스템을 여러개의 독립된 서비스로 나눠서,
이 서비스를 조합함으로서 기능을 제공하는 아키텍쳐 디자인 패턴
- 조대협
출처: https://www.slideshare.net/Byungwook/micro-service-architecture-52233912
아마존의 선택(2002년경 제프 베조스 메일)
- 모든 팀들은 데이터와 기능들을 서비스 인터페이스로 연결시켜라
- 팀들은 이 인터페이스를 통해서만 연락해야 한다
- 다른 어떤 커뮤니케이션 방법도 허용되지 않는다
직접 링크를 보내거나 다른 팀의 스토리지에 직접 억세 스 해서도 안 되며, 공유 메모리나 백도어 같은 것도 안 된다
모든 커뮤니케이션은 네트워크를 통한 서비스 인터페이스로 이루어져야 한다 - 어떤 기술을 쓰든 상관없다
HTTP, Cobra, Pubsub, 독자 프로토콜...그건 상관없다
베조스는 그런데 관심 없다 - 모든 서비스 인터페이스는 예외 없이 외부에서 이용 가능하게 만들어져야 한다
그 말은 팀들은 외부 개발 자들이 인터페이스를 이용할 수 있게 해야한다는 것이다
예외는 없다 - 이를 실천하지 않는 사람은 누구든 해고될 것이다
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
- 아직 Clone 안했다면 Clone!
- clone 한 directory 로 이동
- cd spring-cloud-workshop
- 실습 시작 시점으로 git 이동
- git checkout tags/step-0
- IntelliJ에서 build.gradle import
- File > Open - root 폴더 build.gradle 선택 - Open as Project
- 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
'SpringCloud' 카테고리의 다른 글
[Spring Cloud 를 활용한 MSA 기초] 6. Service Registry - Eureka (0) | 2021.02.07 |
---|---|
[Spring Cloud 를 활용한 MSA 기초] 5. Client LoadBalancer - Ribbon (0) | 2021.02.07 |
[Spring Cloud 를 활용한 MSA 기초] 4. Circuit Breaker - Hystrix (0) | 2021.02.07 |
[Spring Cloud 를 활용한 MSA 기초] 3. Cloud Native 이해 (0) | 2021.02.07 |
[Spring Cloud 를 활용한 MSA 기초] 1. 모놀리틱 아키텍처 이해 (0) | 2021.02.07 |
댓글