[스프링으로하는 마이크로서비스 구축] 넷플릭스 유레카와 리본을 사용한 서비스 검색

뿌이·2022년 2월 23일
0

스프링 클라우드

목록 보기
20/32

스프링 이니셜라이저로 만든 스프링 부트 애플리케이션을 넷플릭스 유레카 서버로 전환하려면 어떻게 해야 하는가?

  • spring-cloud-starter-netflix-eureka-server에 대한 의존성을 추가
  • 애플리케이션 클래스에 @EnableEurekaServer 애노테이션 추가
  • 마이크로서비스에서 사용하는 Docker file을 조금 변경해서 추가,
    마이크로 서비스에서 사용하는 8080 기본 포트를 유레카 기본 포트인 8761로 변경
  • 도커 컴포즈 파일(docker-compose.yml, docker-compose-partitions.yml, docker-compose-kafka.yml)에 유레카 서버 추가
eureka:
	build: spring-cloud/eureka-server
    mem_limit: 350m
    ports:
    	- "8761 : 8761"

스프링 부트 기반 마이크로서비스가 시작하는 동안 자동으로 자신을 넷플릭스 유레카에 등록하게 하려면 어떻게 해야하는가?

유레카 서버에 마이크로서비스 인스턴스 등록

  • 빌드파일(build.gradle)에 spring-cloud-starter-netflix-eureka-client를 의존성으로 추가
implementation('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
  • 단일 마이크로 서비스를 테스트 할 때는 유레카 서버를 실행할 필요가 없기 때문에 @SpringBootTest 어노테이션을 붙인 모든 제이유닛 테스트를 실행할 때는 넷플릭스 유레카를 비활성화 해야한다.
@SpringBootTest(webEnvironment=RANDOM_PORT, properties = {"eureka.client.enabled=false"})

@SpringBootTest 애노테이션에 eureka.client.enabled 속성을 추가하고 false로 설정

스프링 부트 기반 마이크로서비스가 넷플릭스 유레카 서버에 등록된 다른 마이크로서비스를 호출할 수 있게 하려면 어떻게 해야 하는가?

  • 로드밸런서 클라이언트를 주입하는 WebClient 빌더를 애플리케이션 클래스인 se.magnus.microservices.composite.product.ProductCompositeServiceApplication에 추가
    (애플리케이션 클래스 이름은 책에서 만든 서비스의 애플리케이션 클래스 이름임)
@Bean
@LoadBalanced
public WebClient.Builder loadBalanceWebClientBuilder(){
	final WebClient.Builder builder = WebClient.builder();
    return builder;
    }
  • 통합 클래스인 se.magnus.microservices.composite.product.services.ProductCompositeIntegration 이 WebClient 객체를 생성하는 방식을 업데이트

@LoadBalanced 애노테이션은 스프링이 WebClient.Builder 빈에 로드밸런서 관련 필터를 주입하게 한다.
그러나 이 동작은 통합클래스에서 생성자가 실행될때까지는 수행되지 않음
-> 별도의 getter 메소드를 두고 늦은 초기화 방식으로 webClient를 생성해야함

private WebClient getWebClient(){
	if (webClient == null){
    	webClient = webClientBuilder.build();
    }
    return webClient;
}
  • webClient를 사용해 발신용 HTTP 요청을 만들 때 webClient 필드를 직접 사용하는 대신 getWebClient() getter 메소드를 사용해 접근한다
@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));
}
  • 이제 application.yml에 구성했던 사용가능한 마이크로서비스의 목록 제거 가능하다.
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 속성 값이다.

출처

책 - 스프링으로 하는 마이크로서비스 구축(매그너스라슨, 에이콘)

profile
기록이 쌓이면 지식이 된다.

0개의 댓글