간단한 토이 프로젝트를 만들다가 여러번 동일한 서비스의 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 |
'Spring' 카테고리의 다른 글
Circular Dependency (0) | 2021.09.17 |
---|---|
Spring Boot 2.5 이후 버전과 Hibernate 와 data.sql (0) | 2021.09.15 |
Spring Boot 와 JWT 로 로그인하기 (0) | 2021.07.06 |
Spring Boot 로 이메일 회원가입 하기 (1) | 2021.07.06 |
Spring Cloud Netflix Eureka (0) | 2021.07.05 |