eureka:
build: spring-cloud/eureka-server
mem_limit: 350m
ports:
- "8761 : 8761"
유레카 서버에 마이크로서비스 인스턴스 등록
implementation('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
@SpringBootTest(webEnvironment=RANDOM_PORT, properties = {"eureka.client.enabled=false"})
@SpringBootTest 애노테이션에 eureka.client.enabled 속성을 추가하고 false로 설정
@Bean
@LoadBalanced
public WebClient.Builder loadBalanceWebClientBuilder(){
final WebClient.Builder builder = WebClient.builder();
return builder;
}
@LoadBalanced
애노테이션은 스프링이 WebClient.Builder 빈에 로드밸런서 관련 필터를 주입하게 한다.
그러나 이 동작은 통합클래스에서 생성자가 실행될때까지는 수행되지 않음
-> 별도의 getter 메소드를 두고 늦은 초기화 방식으로 webClient를 생성해야함
private WebClient getWebClient(){
if (webClient == null){
webClient = webClientBuilder.build();
}
return webClient;
}
@Override
public Mono<Product> getProduct(int productId){
String url = productServiceUrl + "/product/"+productId;
return getWebClient().get().uri(url).retrieve()
.bodyToMono(Product.class).log()
.onErrorMap(WebClientResponseException.class, ex -> handleException(ex));
}
app:
product-service:
host: localhost
port: 7001
recommendation-service:
host: localhost
port: 7002
review-service:
host: localhost
port: 7003
위와 같은 코드 제거 가능
하드코딩된 구성을 사용하고 있는 통합 클래스의 코드는 핵심 마이크로서비스의 API를 가리키는 기본 URL 선언으로 대체
private final String productServiceUrl = "http://product";
private final String recommendationServiceUrl = "http://recommendation";
private final String reviewServiceUrl = "http://review";
URL에 포함된 호스트 이름은 실제 DNS 이름이 아닌, 마이크로 서비스가 유레카 서버에 등록할 때 사용한 가상 호스트 이름
즉 spring.application.name
속성 값이다.
책 - 스프링으로 하는 마이크로서비스 구축(매그너스라슨, 에이콘)