Naming Server - Eureka (유레카)

shlee ⚡️·2023년 11월 16일
0

포트 구성

질의

우리가 도달하고 싶은 상태는 동적으로

Exchange Microservice 인스턴스를 실행하고 그 사이에 로드를 분배하는 거죠

Exchange Microservice 인스턴스 포트가 8000, 8001, 8002

인스턴스가 올라갔다가 내려가면

자동으로 그걸 발견하고 둘 사이의 부하 분산을 할 수 있어야 하죠

feign Framework가 다중 URL을 하드코드 할 수 있는 옵션을 제공한다고 하면

그것도 좋은 솔루션이 아닐 겁니다 8000이 다운되고 새 인스턴스가 8002에서 나타났다고 하면

이 응용 프로그램의 구성이나 코드를 항상 바꿔야 하니까요

그게 서비스 레지스트리나 명명 서버라고 부르는 이유죠

마이크로서비스 아키텍처에선 모든 마이크로서비스 사례가 서비스 레지스트리에 등록되죠

Exchange Microservice는 서비스 레지스트리에 등록하고

Conversion Microservice는 서비스 레지스트리에 등록하고

다른 마이크로비스도 서비스 레지스트리에 등록하죠

Conversion Microservice가 Exchange Microservice와 대화하고 싶다면

서비스 레지스트리에 이렇게 물을 겁니다 "Exchange Microservice의 주소가 뭐죠?"

서비스 레지스트리는 Conversion Microservice로 Exchange Microservice의 주소를 돌려줍니다

그럼 Conversion Microservice가 Exchange Microservice로 요청을 보내죠

모든 인스턴스는 네이밍 서버나 서비스 레지스트리에 등록되죠

또한 Conversion Microservice는 활성된 Exchange Microservice의 인스턴스가 무엇인지 알고 싶을 때마다

네이밍 서버에 요청하여 인스턴스를 얻고 이들 사이의 로드 밸런스를 조정합니다.

01. Naming Server 생성

의존성 목록

  • Dev tools
  • Actuator
  • Eureka Server

pom.xml

  • 설명 ) 네이밍 서버가 스스로 레지스트리 서비스에 등록하지 않게 추가
    eureka.client.register-with-eureka=false
    eureka.client.fetch-registry=false
spring.application.name=naming-server
server.port=8761

eureka.client.register-with-eureka=false 
eureka.client.fetch-registry=false

NamingServerApplication

  • @EnableEurekaServer 어노테이션 추가
@EnableEurekaServer
@SpringBootApplication
public class NamingServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(NamingServerApplication.class, args);
	}

}

접속 테스트

02. Exchange, Conversion에 eureka-client 추가

pom.xml - Exchange, Conversion

  • 의존성 추가
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>

유레카 네이밍 서버에 Currency Conversion, Currency Exchage 인스턴스가 등록되어 있다.

application.properties - Exchange, Conversion

  • 하지만 좀더 구체적으로 명시하거나 혹은 이 후 다른 네이밍 서버를 사용할 수도 있으니까
  • eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
  • 디폴트 네이밍서버 url을 명시적으로 적어줌
spring.application.name=currency-exchange
spring.config.import=optional:configserver:http://localhost:8888
server.port=8000
spring.jpa.show-sql=true
spring.datasource.url=jdbc:h2:mem:testdb
spring.h2.console.enabled=true
spring.jpa.defer-datasource-initialization=true

// 추가
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka
  • 네이밍 서버 로그에도 Currency Conversion, Currency Exchage가 실행 종료되거나 실행중일 때 등록되는 것을 볼 수있다.

03. 로드 밸런싱 CurrencyExchangeProxy interface - url제거

  • 위 내용 토대로 정리하면

  • 네이밍 서버에는 spring-cloud-starter-netflix-eureka-server 의존성

  • Currency Conversion과 Currency Exchange에 spring-cloud-starter-netflix-eureka-client 의존성이 설치되어 자동으로 인식됨 (우린 명시적으로도 적어줬지만)

  • 그래서 이 이미지대로 네이밍 서버에 알아서 등록된 거임

  • 무튼 spring.application.name이 currency-conversion이랑 currency-exchange가 네이밍 서버에 등록이 되었으니 이제 프록시에서 url은 필요없고 currency-exchange이름으로 찾기만 하면 됨

  • 그래서 url 제거

// 사용하(찾)고 싶은 spring.application.name=currency-exchange
// @FeignClient(name = "currency-exchange", url = "localhost:8000") 삭제
@FeignClient(name = "currency-exchange")
public interface CurrencyExchangeProxy {
	
	@GetMapping("/currency-exchange/from/{from}/to/{to}")
	public CurrencyConversion retrieveExchangeValue(@PathVariable String from, @PathVariable String to);
}
  • 이렇게 작성하면 Eureka네이밍 서버에서 알아서 로드밸런싱 해줌

로드밸런싱 테스트

  • Exchange 서비스 8000, 8001 두개를 실행하면 인스턴스가 2개 잡힌 것이보임
  • 또한 요청을 날리면 부하가 분산되게끔 8000, 8001을 번갈아 가면서 호출한다

그리고 이것을 클라이언트 측 로드 밸런싱이라고 함

Feign을 통해서 동작하고...

Feign은 로드 밸런싱을 어떻게 하는가?

spring-cloud-starter-loadbalancer가 있다

spring-cloud-starter-netflix-eureka-client를 통해 클래스 경로로 갖고 옴

이건 로드밸런서 프레임워크로 Feign이 실제로 다중 인스턴스에 부하를 분산하는 데 사용함

Eureka에 의해 반환됨


스프링 클라우드의 초기

버전에서 부하 분산 장치는 Ribbon(리본)이었는데

최근 버전에서 스프링 클라우드는

spring-cloud-starter-loadbalancer로 바뀜

유레카 모드로 사용하면 부하 로드밸런싱이 무료

클라이언트 사이드 부하 분산이고 무료이다

profile
흔들리지 말고.. 묵묵히

0개의 댓글