MSA 기술
| Circuit Breaker 기술
서킷브레이커 - 서비스가 유연하게 동작할 수 있다.
- 서비스가 지연되는 문제
- 서비스 장애 전파 문제
등은 서킷브레이커로 해결가능하다. 다른건 몰라도 이건 해야한다! 모놀릭 시스템이랑은 아키텍처가 다르기 때문에 톨로렌스(내성)를 길러야한다.
| Hystrix 라이브러리의 역할
1. 장애 및 지연 내성 (Latency and Fault Tolerance)
- 카탈로그 입장에서 커스토머를 호출하고 싶다.
- 따라서 위에를 보면 getCustomerDetailFallback 를 폴백함수로 지정해놨다.
- 이게 바로 Fallback용 메서드로 매핑하여 실패가 전파되는 것을 미연에 방지하는 작업이다.
- 실패된 경우를 그대로 전파하는게 아니라 그 즉시 폴백을 활용하여 폴백용 메서드를 실행시키는 것
- 이 역할을 hystrix 라이브러리가 하는 것이다.
2. 실시간 구동 모니터링 (Realtime Opertions)
3. 병행성 (Concurrency)
회로 차단: 실패가 됐는데 계속 요청 들어옴 -> 또 실패할 가능성이 높다면, 그 즉시 회로가 차단되어(다음 스텝으로 가지 않고 막겠다) 래핑을하여 차단하겠다. ->
조건1: 호출건수 조건2: 에러 발생확률로 선택하여 폴백함수 호출할수도있다
주의할건 restTemplate.getForObject을 실행을 하긴한다.
| Client Load Balancer
여러 사용자가 똑같은 요청을 한다고 했을 때 몇사람은 기다려야하는데, 새로고침을 하게되면 새로운 요청이 또 발생되는 게 된다. 하나의 서비스를 다수의 사용자가 서비스하려고하면 병목현상이 일어난다.
예) 학교 지원할 때, 주택 청양할 때
그래서 A라는 서비스를 A-1, A-2, A-3 처럼 똑같은 서비스를 만들어놓고 클라이언트의 요청을 분산시키려고한다. 그래서 Ribbon 소프트웨어 제품을 이용하여 분산 처리를 한다.
로드밸런싱을 하고 싶은 쪽에 @LoadBalanced 어노테이션을 추가해서 사용한다.
카탈로그3 리본, 커스토머3 리본,리본2가 있는데 커스토머 똑같은 서비스를 두개를 만들어 놨다고 보면된다
- 각 각 customer ribbon 1, customer ribbon2 의 application.xml 파일이다
- Catalog Ribbon 쪽 application.xml을 보면 아래처럼 되어있다.
- 첫번째 클라이언트 요청은 8082, 두번째 클라이언트 요청은 8083.. 세번쨰는 다시 8082 네번째는 8083... 이렇게 요청이된다.
- Customer는 똑같은 서비스이지만 포트번호는 달라야 한다.
구동 순서
- Customer3Ribbon1,2 > Catalog3Ribbon
- @Value
- application.yml나, application.properties에 있는 키 값에 대한 변수를 넣어줄 수 있다.
- 문법은
"${}"
구동후 실행해보자
- 원래 이렇게 나와야 한다. 원인은 위에 @Hystrix 어노테이션 commandProperties 아래거 주석이 풀려있었다.
- 새로 크롬창 열어서 요청을 보내보면
| Service Registry
유레카를 사용하면 유레카 서버가 제공하는 대쉬보드를 볼 수 있는데, 이걸 통해 어떤 서비스가 등록되어있고 어떤 형태로 사용중인지 알 수 있다.
유레카 서버에 해당 서비스를 등록해놓으면 그 서비스들은 자동 관리가 된다.
실습
- 유레카 서버 시동
- localhost:8761로 접속해보면 현재 구동되는 서비스를 볼 수 있다
- 커스토머4유레카 시동
- 다시 localhost:8761가서 새로고침 해보면 현재 Customer 서비스가 추가된 것을 볼 수 있다.
- Customer4Eureka의 application.xml을 보면 디폴트 존이 유레카 서버인 것을 볼 수 있다.
- 커스토머 서비스가 등록이 되었다가 갑자기 문제가 생겨 커스토머서버가 죽어버리면 유레카서버가 감지해낼 수 있다
- 그 감지 내용을 반영을 해서 로그로 남길수 있다.
설정 부분
Eureka Server application.xml
- 서비스가 죽음 = 하트비트 0
- 커스토머4유레카 구동을 끄면
- enable-self-preservation은 반드시 true여야 한다.
| API Gateway
모든 클라이언트의 엔드포인트를 통합하는 서비스다.MSA는 도메인 별 하나이상의 서비스(서버)가 존재하고, 한 서비스가 한개 이상의 서버에 존재할 수 있기 때문에 사용자, 즉 클라이언트 입장에서는 다수의 엔드포인트를 알아야한다.
엔드포인트가 변경될 경우
실습
유레카 서버 구동되어있는 상태여야한다
- 커스토머4유레카1,2 + 카탈로그4유레카 구동
- 쥴 구동
쥴의 포트번호 8765가 모든 요청을 받는 api 포트니까 하나로 합쳐 gateway로 관리해보자
- 원래 커스토머를 요청하려면
http://localhost:8082customers/1
였는데,
- 리본으로 묶어서
http://customer/customers/1
이런식으로도 가능했었다
- 이 8082 포트번호를 8765로 관리를 하되, 그 때 사용되는 path인 customers를 customer로 바꾸자 라는 것!
http://localhost:8765/customer/customers/1
즉, localhost:8082을 localhost:8765/customer로 대체하겠다.
- 원래 카탈로그를 요청하려면
http://localhost:8081/catalogs/customerinfo/1
로 요청했었다
- 쥴 서버로 게이트웨이로 묶으면,
http://localhost:8765/catalog/catalogs/customerinfo/1
즉, localhost:8081을 localhost:8765/catalog로 대체하겠다.
- 크롬에서
http://localhost:8765/customer/customers/1
로 접속해보기
- stripPrefix: false 로하면 라우팅 서비스명을 생략할 수 있다.
참고
만약 serviceId가 a라면, localhost:8765/a/customers/1로 요청
하지만, 만약 customer가 ribbon에서 customer로 묶여있다면 customer로 써야된다.
| Config Server
원래 서비스 마다 설정파일이 따로 있었는데 이걸 하나로 관리하고싶을 때 쓴다.
두개다 설정파일이라 application.xml에 두개다 때려넣어도 된다. 우리는 그냥 쪼개놓은거!
- @RefreshScope를 사용하려면 customer.xml에서 수정된 내용이 refresh값으로 들어간다
구동
컨피그들만 구동
컨피그 하고 > 커스토머 컨피그
| RabbitMQ
비동기 요청을 할 수 있는 방법. 메시지 브로커를 통해 비동기를 통해 받아올 수 있다.
| 사이드카
다른언어로 작성된 것도 가능