2024. 12. 10. 22:47ㆍ카테고리 없음
각 서비스들은 유레카 서버에서 주기적으로 다른 서비스들의 정보를 가져오고 이를 로컬에 캐싱합니다.
그리고 이 정보를 이용하여 서비스 고유명만으로 통신이 가능합니다.
HTTP 통신 3가지를 진행해보겠습니다.
1. 일반 RestTemplate를 이용한 통신
2. Ribbon을 탑재한 RestTemplate을 이용한 통신
3. Feign을 이용한 통신
일반 RestTemplate를 이용한 통신
RestTemplate 객체를 생성하여 IP와 PORT로 직접적으로 호출하는 구조입니다.
IP와 PORT를 모른다고 가정하여, DiscoveryClient를 이용하여 서비스2의 IP와 PORT를 얻어온 뒤 서비스2의 /name/{id} api를 호출합니다.
다음으로 controller와 service를 구현하여 RestTemplateClientCommunicator을 호출하여 api를 작성해줍니다.
RestTemplate의 문제점
1. 호출하는 서비스에서 IP와 PORT를 관리해주어야합니다. ( 아니면 위처럼 DiscoveryClient를 통해 항상 정보를 가져온 뒤 호출해야함. )
2. 클라이언트 측 부하 분산을 할 수 없습니다. (Ribbon의 다양한 로드벨런싱 설정 사용 불가)
Ribbon을 탑재한 RestTemplate을 이용한 통신
Ribbon은 spring-cloud-starter-netflix-client에 포함되어있으므로 추가적인 라이브러리는 필요가 없습니다.
RestTemplate를 Bean으로 등록 한 뒤 LoadBalanced 어노테이션을 달아주어서 RestTemplate에 Ribbon을 탑재시켜줍니다.
Autowired 어노테이션으로 방금 Bean으로 등록한 RestTemplate를 주입받습니다.
이번엔 IP:PORT대신 서비스2의 고유명(service2)로 호출하면 Ribbon이 내부적으로 IP와 PORT를 찾아서 처리해줍니다.
만약 서비스2가 여러개의 인스턴스로 이중화 구성되어있다면 소프트웨어적 로드밸런싱 처리도 해줍니다.
( 추가 설정을 하지 않았기에 기본 설정인 Round Ribbon 알고리즘으로 순차 로드밸런싱을 해줍니다. )
서비스와 컨트롤러에도 각각 RibbonClientCommunicator을 호출하여서 api를 작성해줍니다.
Feign을 이용한 통신
feign을 이용한 통신은 자바코드를 최대한 줄일수 있고, interface에 어노테이션 형식으로 간결하고 쉽게 구현할 수 있습니다.
feign을 사용하기 위해 라이브러리를 추가해줍니다.
service1Application에 EnableFeignClients 어노테이션을 통해 Feign Client임을 설정해줍니다.
다음으로 FeignClient("service2")로 하여금 서비스 2로 api를 호출한다고 명시해줍니다.
서비스와 컨트롤러에서도 FeignClientCommunicator을 호출하여 api를 구성해줍니다.
마지막으로 서비스1와 서비스2를 모두 기동시킨 후 postman을 사용하여 테스트를 진행해줍니다.
( 유레카 서버는 준비하는 시간과 클라이언트가 가져오는 약 30초의 대기가 필요하기 때문에 모두 기동하고 즉시 실행했을 경우 404오류가 발생할 수 있습니다. )