우리가 도달하고 싶은 상태는 동적으로
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의 인스턴스가 무엇인지 알고 싶을 때마다
네이밍 서버에 요청하여 인스턴스를 얻고 이들 사이의 로드 밸런스를 조정합니다.
의존성 목록
- Dev tools
- Actuator
- Eureka Server
spring.application.name=naming-server
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
@EnableEurekaServer
@SpringBootApplication
public class NamingServerApplication {
public static void main(String[] args) {
SpringApplication.run(NamingServerApplication.class, args);
}
}
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
유레카 네이밍 서버에 Currency Conversion, Currency Exchage 인스턴스가 등록되어 있다.
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
위 내용 토대로 정리하면
네이밍 서버에는 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);
}
그리고 이것을 클라이언트 측 로드 밸런싱이라고 함
Feign을 통해서 동작하고...
Feign은 로드 밸런싱을 어떻게 하는가?
spring-cloud-starter-loadbalancer가 있다
spring-cloud-starter-netflix-eureka-client를 통해 클래스 경로로 갖고 옴
이건 로드밸런서 프레임워크로 Feign이 실제로 다중 인스턴스에 부하를 분산하는 데 사용함
Eureka에 의해 반환됨
스프링 클라우드의 초기
버전에서 부하 분산 장치는 Ribbon(리본)이었는데
최근 버전에서 스프링 클라우드는
spring-cloud-starter-loadbalancer로 바뀜
유레카 모드로 사용하면 부하 로드밸런싱이 무료
클라이언트 사이드 부하 분산이고 무료이다