
MSA에서는 여러 서비스 간의 호출로 구성이 된다. (서비스가 다른 서비스를 찾아서(즉, 디스커버리) 통신할 수 있도록 구성된다.)
각 서비스가 다른 서비스를 찾아서 통신하기 위해선 동적인 방법이 필요하다. 이를 위해 사용되는 것이 바로 서비스 디스커버리이다.
MSA를 채택해, 서비스간 통신을 통해 구현되는 프로젝트를 예시로 들어 알아보겠다.
이전 게시글에서 Store서버를 만들어보았다.
Store Entity가 Image를 갖도록하고, Image는 다른 서버에 구현되어있다고 가정한 후 해당 서버와 통신하는 방법에 대해서 알아보겠다.
Eureka의 클라이언트(인스턴스) 입장에서 어떻게 Eureka에 등록하고 서버간 통신을 하는지 알아보자.
Eureka 서버는 이미 만들어져 있다고 가정을 한 후 진행했다.
springCloudVersion으로 인한 오류가 발생할 수 있으니, 환경에 맞게 잘 설정하도록
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
ext {
set('springCloudVersion', "2021.0.8")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
server.port=20000
#사용하고자 하는 포트번호
spring.application.name=Store-Service
#Eureka에 나타낼 서비스 이름
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${spring.application.instance_id:${random.value}}
eureka.instance.prefer-ip-address=true
eureka.instance.ip-address=localhost
#instance의 주소(배포하였다면, 배포한 주소)
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone= http://54.180.3.47:8761/eureka/
#Eureka서버의 주소
Eureka서버에 등록하고, Eureka서버에 등록된 인스턴스(서버)와 RestTemplate로 Http요청을 보낼 때 필요한 정보들을 받을 수 있다.
이전 게시글에서 만든 간단한 Store서버에서 Entity에 String storeImage를 추가해주고, 필요한 메소드들을 작성한다.
Eureka에 등록된 서버와 통신하기 위해 Service계층에 파일을 추가해주고 필요한 코드를 작성한다.
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
위의 코드를 통해 Eureka에 등록된 서버(인스턴스)를 활용할 수 있다.
public Boolean imageDelete(String imageKey) throws URISyntaxException{
try {
ServiceInstance imageService = discoveryClient.getInstances("IMAGE-SERVICE").get(0);
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
HttpEntity<?> http = new HttpEntity<>(headers);
ResponseEntity response;
if (imageKey != null) {
URI uri = new URI(imageService.getUri() + "/api/image/" + imageKey);
response = restTemplate.exchange(uri, HttpMethod.DELETE, http, Boolean.class);
logger.info("ImageServer DELETE Method");
return (Boolean) response.getBody();
} else {
return true;
}
} catch (HttpClientErrorException e) {
return false;
}
}
이런식으로 통신을 한다,,,
만들어진 Eureka 서버가 있다고 가정하고,
Eureka의 클라이언트(인스턴스) 입장에서 어떻게 Eureka에 등록하고 서버간 통신을 하는지 알아보았다.
API 게이트웨이에 대한 이해가 필요하다.
- Eureka는 서비스 디스커버리를 위해 사용되고,
- API 게이트웨이는 클라이언트와 서비스 간의 통신을 관리하고 보안 및 라우팅을 제공하기 위해 사용된다.
따라서 이 두 가지는 서로 다른 기능을 가지고 있으며, 보통 함께 사용되어 마이크로서비스 아키텍처의 효율성을 높이는 데 기여한다.
아래 이미지처럼 Eureka 서버와 API 게이트웨이 서버를 따로 두어 프로젝트를 구성한다.

게이트웨이 서버를 만드는 방법에 대한 추가적인 학습을 진행해보도록 하자.