Eureka란?

YoungHo-Cha·2021년 11월 15일
5

Cloud

목록 보기
2/4

오늘은 Eureka에 대해서 알아보자!

🚗목차

  • LB
  • Eureka란?
  • Eureka Client
  • Eureka Server

🧐LB

Eureka를 더 잘 이해하기 위해서는 LB가 무엇인지부터 알아야 한다.

많은 서비스들은 인터넷을 이용한다. 좋아요 클릭, 게시물 보기, 검색, 로그인, 유튜브 시청, 카카오톡 메세지 전송 등등 거의 모든 동작이 인터넷을 통하여 해당 회사 서버로부터 응답 값을 받게 된다.

이 때, 회사 서버가 1개 라면 1초에 수십억의 요청이 올 경우 버틸 수 있을까?

당연히 못 버틴다. 서버가 마비 될 것이다..

그래서!
회사에서는 서버를 엄청나게 많이 준비하고 있다. 그럼 여기서 많은 여러 대의 서버에 트래픽을 골고루 분산하기 위해 배분해주는 기술이 필요하다. 이 때 이용되는 것이 LB(Load Balancer)이다.

🔎LB는 어떻게?

LB는 어떻게 server에 트래픽을 특정 서버에 배정할 수 있을까?

LB는 MSA의 각 모듈에 대한 연결 정보(ip, port, hostname)를 알고 있다. 우리는 각 모듈의 연결 정보를 LB에 등록해야 한다.

🔎또 다른 문제

CI/CD를 수행하면서 각 모듈은 계속해서 업그레이드 된다. 그 과정을 통하면서 연결 정보가 바뀌게 된다. 그럼 그때마다 LB에 새롭게 등록해야 한다. 정말 번거롭다..

그래서 Eureka라는 기술이 등장했다!


🧐Eureka란?

Eureka는 Neflix에서 제공한 MSA를 위한 클라우드 오픈 소스이다.

Eureka는 LB와 Middle-tier server에 에러 대응을 위한 Rest 기반 서비스이다.

위에서 언급한 LB에 연결 정보 등록에 대한 문제점과 에러 처리를 유연하게 하기위한 기술이다.

Eureka는 등록과 해지를 곧바로 적용할 수 있게 도와준다.

🔎Discovery

Eureka에서 존재하는 Discovery라는 단어는 다음과 같다.

다른 서비스의 연결 정보를 찾는 것이다.

🔎Registry

Eureka에서 존재하는 Registry라는 단어는 다음과 같다.

서비스의 연결 정보를 등록하는 것이다.

🔎Eureka 구성

  • Eureka Server
  • Eureka Client

로 구성된다.

🔎실제 흐름 예시

실제 흐름 예시를 먼저 살펴보고 하자!

  1. Eureka Client 서비스가 시작 될 때 Eureka Server에 자신의 정보를 등록한다.

  2. Eureka Client는 Eureka Server로 부터 다른 Client의 연결정보가 등록되어 있는 Registry를 받고 자신의 Local에 저장하게 된다.

  3. 30초 마다 Eureka Server로 부터 변경 사항을 갱신받는다.

  4. 30초 마다 ping을 통하여 자신이 동작하고 있다는 신호를 보낸다. 신호를 보내지 못하면 Eureka Server가 보내지 못한 Client를 Registry에서 제외시킨다.

위의 흐름에서 살펴볼 수 있듯이, 모든 서비스 모듈이 스스로 유기적으로 상호작용하는 기술이 Eureka이다!
(Eureka가 없으면 전부 직접 설정해주어야 한다.. 연결 정보 수정하고.. 등록하고..)


🧐Eureka Client

Eureka Client는 각각의 서비스에 해당하는 모듈이라고 생각하면 된다.

  • Eureka Client는 자기 스스로 Eureka Server에 등록한다.

등록할 때, http를 살펴보자.

http://localhost:8761/eureka/apps/book-service

{
  "instance": {
    "instanceId": "123d1234-1e1e-4da0-1234-bfdcc87e7b30",
    "hostName": "-.-.-.-",
    "app": "book-service",
    "ipAddr": "-.-.-.-",
    "status": "UP",
    "overriddenStatus": "UNKNOWN",
    "port": {
      "$": 8081,
      "@enabled": "true"
    },
    "securePort": {
      "$": 443,
      "@enabled": "false"
    },
    "countryId": 1,
    "dataCenterInfo": {
      "@class": "com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo",
      "name": "MyOwn"
    },
    "leaseInfo": {
      "renewalIntervalInSecs": 30,
      "durationInSecs": 90,
      "registrationTimestamp": 0,
      "lastRenewalTimestamp": 0,
      "evictionTimestamp": 0,
      "serviceUpTimestamp": 0
    },
    "metadata": {
      "@class": "java.util.Collections$EmptyMap"
    },
    "homePageUrl": "http://192.168.-.--:8081/",
    "statusPageUrl": "http://192.168.-.--:8081/actuator/info",
    "healthCheckUrl": "http://192.168.-.--:8081/actuator/health",
    "vipAddress": "book-service",
    "secureVipAddress": "book-service",
    "isCoordinatingDiscoveryServer": "false",
    "lastUpdatedTimestamp": "2180878819825",
    "lastDirtyTimestamp": "2180878820311"
  }
}
  • Eureka Client는 연결 정보를 Eureka Server에 등록한다.

  • Eureka Client는 Eureka Server로 부터 저장된 Registry 정보를 수신한다. 그리고 자신의 Local에 저장한다.

이 때 요청 http를 살펴보자.

GET /eureka/apps HTTP/1.1
  • Eureka Client는 Eureka Server에게 받은 Registry를 통하여 다른 Clent의 정보를 알 수 있다.

  • Eureka Client는 처음 모든 정보를 Local에 저장하고 30초 마다 변경도니 정보를 Eureka Server로 요청한다.

이 때 요청과 응답 http를 살펴보자.

요청

GET /eureka/apps/delta HTTP/1.1

응답

{
  "applications": {
    "versions__delta": "21",
    "apps__hashcode": "UP_2_",
    "application": [
      {
        "name": "book-service",
        "instance": [
          {
            ...[중략]
            "status": "UP",
            ...[중략]
          },
          {
            ...[중략]
            "status": "DOWN",
            ...[중략]
          }
        ]
      }
    ]
  }
}

🧐Eureka Server

Eureka Server는 Eureka Client를 관리하는 서버이다.

  • Eureka Server는 Eureka Client의 정보를 Registry에 등록한다.

  • Eureka Server는 Eureka Client의 Heartbeat를 수신하여 해당 Client가 수행 중임을 안다.

Heartbeat가 어떻게 오는지 살펴보자.

PUT /eureka/apps/book-service/123d1234-1e1e-4da0-1234-bfdcc87e7b30?status=UP&lastDirtyTimestamp=2180878820351 HTTP/1.1
  • Heartbeat가 정상적으로 수신되지 않은 경우 Server는 Client가 수행 중이지 않다고 판단하여 해당 Client 정보를 Registry에서 삭제한다.

📋마치며

이렇게 Eureka를 이용하여 MSA의 각 모듈이 서로의 정보를 어떻게 주고받는지 살펴보았다.

다음 시간에는 LB에 해당하는 RIBBON에 대해서 알아보자!


🧷Reference

profile
관심많은 영호입니다. 궁금한 거 있으시면 다음 익명 카톡으로 말씀해주시면 가능한 도와드리겠습니다! https://open.kakao.com/o/sE6T84kf

1개의 댓글

comment-user-thumbnail
2021년 11월 22일

정보 감사합니다!

답글 달기