Eureka
마이크로서비스 = 유레카 클라이언트
마이크로서비스는 유레카 서버에 등록해야 한다.
- 이름
- IP주소
- PORT
유레카 서버
스프링 넷플릭스 유레카 서버 사용 시 리본 라이브러리가 포함 된다.
part1.
유레카 서버 설정
application.yml
eureka:
client:
registerWithEureka: false # 유레카 서비스에(자신을) 등록하지 않음.
fetchRegistry: false # 레지스트리정보를 로컬에 캐싱하지 않음.
server:
waitTimeInMsWhenSyncEmpty: # 서버가 요청을 받기 전 대기 시간 (분)
serviceUrl:
defaultZone: http://localhost:8761 # 유레카 서버 주소
유레카 클라이언트 설정
bootstrap.yml
spring:
application:
name: eurekaclient1
profiles:
active: default
cloud:
config:
enabled: ture
application.yml
eureka:
instance:
preferIpAddress: true # 서비스 이름 대신 서비스 IP 주소 등록
client:
registerWithEureka: true # 유레카에 서비스 등록
fetchRegistry: true # 레지스트리 사본을 로컬로 가져오기
serviceUrl:
defaultZone: http://localhost:8761/eureka/ # 유레카 서비스 위치
서비스 이름 대신 서비스 IP 주소를 등록하도록 설정하는 이유
도커 컨테이너는 DNS 엔트리가 없는 임의로 생성된 호스트 이름을 부여 받아 시작함.
그렇게 되면 애플리케이션은 호스트 이름 위치를 정상적으로 얻지 못함
-
eureka.client.fetchRegistry
: 이 프로퍼티를 true로 설정하면 검색할 때 마다 유레카 서비스를 호출하는 대신 레지스트리가 로컬로 캐시된다. 30초마다 클라이언트 소프트웨어는 유레카 서비스에 레지스트리 변경 사항 여부를 재확인 한다.
http://localhost:8761/eureka/apps/eurekaclient1
호출
예) http://[eureka service]:8761/eureka/apps/[application name]
part2.
유레카 클라이언트 설정
application.properties
spring.application.name=microserviceone
eureka.client.serviceUrl.defaultZone=http://eureka:8761/eureka/
eureka.instance.leaseRenewalIntervalInSeconds=5
eureka.instance.metadataMap.instanceId=${spring.application.name}:${random.value}
eureka.instance.preferIpAddress=true
-
spring.application.name
: 유레카 서버에 등록할 애플리케이션 이름 -
eureka.client.serviceUrl.defaultZone
: 유레카 서버 주소 -
eureka.instance.leaseRenewalIntervalInSeconds
: 해당 초마다 복제. 새로 올라온 마이크로 서비스를 빨리 사용가능. 운영 환경에서 너무 낮게 설정하면 네트워크 트래픽이 지나치게 많이 발생할 수 있음. -
eureka.instance.metadataMap.instanceId
: 로드밸런싱을 위해 두 인스턴스를 구별할 수 있도록 임의의 ID로 각 마이크로서비스 인스턴스 제공 -
eureka.instance.preferIpAddress
: ture로 설정하면 호스트 이름이 아닌 ip주소로 등록. 도커 환경에서는 호스트 이름을 확인할 수 없기 때문에 문제 없음.
part3.
유레카 서버의 등록과 갱신에는 30초 소요
Eureka 클라이언트는 서버에 연결해서 레지스트리 정보를 가져와서 로컬에 캐시한다.
이후 클라이언트는 언제나 로컬 캐시의 내용을 기반으로 동작한다.
Eureka 클라이언트는 주기적으로 서버의 정보를 체크해서 변경 사항을 로컬 캐시에 다시 반영 한다.
Eureka 서버가 장애로 인해 접근할 수 없는 상태가 되도 Eureka 클라이언트는 기존 로컬 캐시에 저장되어 있는 내용을 기반으로 오류 없이 동작한다.
하지만 이렇게 되면 클라이언트가 최신 정보를 반영하지 않으므로 일관성 문제가 생길 수 있다.이런 이슈를 해결하기 위해 Eureka 서버에 고가용성을 적용한다.
Eureka 서버 peer-to-peer 방식의 데이터 동기화 매커니즘을 바탕으로 만들어짐.
런타임의 상태정보는 데이터베이스에 저장되지 않고 인메모리 캐시에서 관리 됨.
Eureka 서버의 고가용성 구현에서는 CAP 이론에 따라 가용성과 분리내구성을 선택하고 일관성을 포기한다.
CAP: 분산 시스템에서는 Consistency(일관성), Availability(가용성), Partition Tolerance(분리 내구성)을 모두 갖는 것은 불가능하다.
eureka-server1.properties 파일
eureka.client.serviceUrl.defaultZone=http://localhost:8762/eureka/
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka-server2.properties 파일
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
bootstrap.properties (eureka server1, eureka server2 동일하게 작성)
spring.cloud.config.uri=http://localhost:8888
server1 프로파일로 지정한 Eureka 인스턴스는 8761 포트에서 실행
server2 프로파일로 지정한 Eureka 인스턴스는 8762 포트에서 실행
java -jar -Dserver.port=8761 -Dspring.profiles.active=server1 demo-0.0.1-SNAPSHOT.jar
java -jar -Dserver.port=8761 -Dspring.profiles.active=server1 demo-0.0.1-SNAPSHOT.jar
유레카 클라이언트 활성화
유레카 서버는 설정된 기간 동안 서비스의 각 인스턴스로부터 heartbeat 메시지를 받지 못하면 레지스트리에서 서비스가 삭제 된다.
서버로부터 데이터를 가져와서 캐싱하고 주기적으로 변경사항을 점검한다.
메인 클래스에 @EnableDiscoveryClient
를 추가해서 활성화 한다.
컨설, 유레카, 주키퍼 등 다수의 클라이언트 구현체가 클래스 경로상에 있는 경우 @EnableEurekaClient
를 추가 해서 활성화 할 수도 있다.
유레카만을 위해서 작동한다.