[MSA] MSA 기술 - 라이브러리

sung eon·2023년 2월 21일
0

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

비동기 요청을 할 수 있는 방법. 메시지 브로커를 통해 비동기를 통해 받아올 수 있다.

| 사이드카

다른언어로 작성된 것도 가능

profile
코베베

0개의 댓글