Hello, Freakin world!

[Eureka] 서비스 검색하기 - RestTemplate 본문

Spring Cloud/Service discovery

[Eureka] 서비스 검색하기 - RestTemplate

johnna_endure 2021. 3. 7. 02:32

 

 

[Eureka] 서비스 검색하기 - DiscoveryClient

[Eureka] 서비스 디스커버리에 서비스 등록하기 시나리오 간단하게 유레카 서버와 유레카에 등록되는 서비스 서버를 띄운다. 그리고 유레카 서버의 대시보드를 활용해 서비스 서버가 등록되는지

javachoi.tistory.com

이전 글에서는 인위적으로 서비스 간 통신에 DiscoveryClient 객체만 사용하도록 했다.

 

그로 인한 단점은 두 가지였다.

 

1. 로드 밸런싱 방식을 직접 구현해야 됐다.

2. 서비스 url을 직접 조립해서 약간 번거로웠다.

 

스프링에서 제공하는 간편한 방식으로 개선해보자.


멤버 서비스 수정

먼저 시동 클래스에 @EnableDiscoveryClient를 없앤다.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class MemberserviceApplication {

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

}

EurekaClientConfig 클래스를 하나 만든다.

 

RestTemplate 빈을 생성하고 리본 인터셉터가 이 빈에 동작할 수 있도록 @LoadBalanced를 추가해준다.

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class EurekaClientConfig {

    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

}

이제 다음과 같이 RestTemplate를 바로 주입받아서 사용해도 내부에서 클라이언트측 로드밸런싱이 수행된다.

(url의 호스트네임은 서비스 이름이다.)

import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import springboot.cloud.memberservice.client.dto.TeamDto;

@Component
public class TeamDiscoveryClient {

    private final RestTemplate restTemplate;

    public TeamDiscoveryClient(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    public TeamDto getTeam(Long teamId) {
        ResponseEntity<TeamDto> exchange = restTemplate.exchange(
                "http://team-service/teams/" + teamId,
                HttpMethod.GET,
                null,
                TeamDto.class);
        return exchange.getBody();
    }

}

수정이 끝났다.

 

도커 컴포즈를 이용해 동작하는지 확인해보자.

 

team-servce-1_1, team-service-2_1 이 번갈아 실행되는 걸 볼 수 있다.

 

 

 

Comments