Spring

Spring Cloud Eureka 와 기본 REST API

728x90

간단한 토이 프로젝트를 만들다가 여러번 동일한 서비스의 eureka client instance 를 만든적이 있는데,

아무리 시간이 지나도 service discovery 에서 제거되지 않고 남아있어서

언제 지워지는지 그리고 어떻게 수동으로 지우는지를 알아보고자 찾아본 내용을 기록했다.

 

 

- Eureka

: eureka 는 MSA 에서 service 의 로드 밸런싱이나 실패 처리 등을 유연하게 처리하기 위해서 ip, port, instance id 등을 가지고 있는 미들웨어 서버를 의미한다

MSA 에서는 ip 나 port 가 항상 가변적이기 때문에 이들에 대한 주기적인 관리가 필요한데, 이를 관리하는 것이 MSA 에서 Service Discovery 이며 spring 에선 이를 spring cloud netflix eureka 를 이용해서 처리한다

 

Eureka 는 Client-Server 방식을 사용하고 Eureka Server 가 다른 모든 Eureka Client 들을 관리하는 역할을 담당한다

기본적으로 Eureka Client 와 Eureka Server 간의 통신은 REST API 를 통해서 이뤄지고 기본적인 API 들은 다음과 같다

 

 

* appID 는 등록하려는 MSA 서비스 이름, instanceID 는 해당 서비스중 특정 instance 의 ID 값을 의미한다

 

 

- Register

POST /eureka/apps/{appID}

 

Eureka Client 를 Eureka Server 에 등록할때 사용된다

(예시)

http://localhost:8761/eureka/apps/test-service
 
{
  "instance": {
    "instanceId": "392d9569-3a3a-4da0-9447-bfdcc14d8b30",
    "hostName": "x.x.x.x",
    "app": "test-service",
    "ipAddr": "x.x.x.x",
    "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.4.91:8081/",
    "statusPageUrl": "http://192.168.4.91:8081/actuator/info",
    "healthCheckUrl": "http://192.168.4.91:8081/actuator/health",
    "vipAddress": "test-service",
    "secureVipAddress": "test-service",
    "isCoordinatingDiscoveryServer": "false",
    "lastUpdatedTimestamp": "1580878819825",
    "lastDirtyTimestamp": "1580878820311"
  }
}
cs

 

 

- Renew 

: Eureka Client 는 기본적으로 30초를 주기로 Eureka Server 에게 HeartBeat 를 보낸다

서버가 만약 90초 동안 HeartBeat 를 받지 못하면 Server 정보 저장소에서 해당 Client 의 인스턴스가 제거된다

(클라이언트 인스턴스 정보를 보면 leaseInfo 라는 부분에서 그 시간을 알 수 있다)

 

Renew 는 Client 가 Server에게 HeartBeat 를 보내는 REST API 를 말한다

 

PUT /eureka/apps/appID/instanceID

(예시)

PUT /eureka/apps/test-service/392d9569-3a3a-4da0-9447-bfdcc14d8b30?status=UP&lastDirtyTimestamp=1580878820311
cs

 

 

- Fetch Registry

: Eureka Client 는 Server 가 가동될때 Eureka Server 에 있는 모든 정보를 가져와서 local cache 에 저장한다

그리고 이 정보를 이용해서 http 통신에 사용한다

이 정보는 30초 마다 변경점에 대해서 부분 업데이트를 진행한다

 

처음에 모든 정보를 다 요청할때는

GET /eureka/apps

GET /eureka/apps
cs

 

 

30 초에 한번씩 변경된 정보를 가져올때는

GET /eureka/apps/delta

GET /eureka/apps/delta
cs

 

이에 대한 응답은 다음과 같다

(예시)

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

UP 은 실행되고 있는 인스턴스, DOWN 은 사용되지 않는 죽은 서버를 의미한다

delta 요청을 통해서 죽은 서버를 가져오게 되면 client 는 자신이 가진 local cache 에서 해당 인스턴스의 정보를 지운다

 

 

- DELETE

Eureka Server 에서 특정 client 의 instance 를 제거할때 사용한다

heartbeat 보내는데 문제가 생겼거나 다수의 인스턴스를 실행하다 service discovery 가 이를 제거하지 못하는 경우 사용 될 수 있다

 

DELETE /eureka/apps/appID/instanceID

DELETE /eureka/apps/test-service/5a7af17d-8800-4408-9855-ac55246d070d 
cs

 

 

 

 

 

728x90