Url 을 하드코딩하지 않고 DiscoveryClient 를 이용한 API 콜을 설명하고 있다.
Employee-Consumer 에 의존추가
- maven url https://repo.spring.io/milestone
- org.springframework.cloud:spring-cloud-starter-netflix-eureka-client
- 버전관리 org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}
plugins {
id 'org.springframework.boot' version '2.4.0'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
maven { url "https://repo.spring.io/milestone" }
}
ext{
set("springCloudVersion","2020.0.0-M6")
}
dependencies {
compileOnly 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
test {
useJUnitPlatform()
}
참고 및 주의사항
- org.springframework.cloud.client.discovery.DiscoveryClient 는 스프링부트의 자동설정 기능으로 인하여 바로 주입받을 수 있게 되는 듯함
- ApplicationContext 에서 Bean을 가져오듯 서비스 이름으로 Eureka에 등록된 서비스를 찾아올 수 있다.
- 같은 종류의 여러가지 서비스가 있을 수 있어 getInstances() 는 List<ServiceInstance> 타입.
- ServiceInstance 는 getUri(), getServiceId(), getPort() 등의 발견한 서비스 정보를 리턴하는 메서드를 제공
- RestTemplate로 동일하게 호출하게 됨.
@Controller
public class EmployeeConsumedController {
@Autowired
//org.springframework.cloud.client.discovery.DiscoveryClient
private DiscoveryClient discoveryClient;
public void connectService(){
//List<ServiceInstance> getInstances( Service Id ) 같은 종류의 여러 서비스가 있을 수 있으니 List
List<ServiceInstance> instances = discoveryClient.getInstances("EMPLOYEE-PRODUCER");
// 첫번째 서비스.
ServiceInstance serviceInstance = instances.get(0);
// 서비스에서 포트, URI , Id , Host 등을 가져오는 메서드를 가지고 있음
String baseUrl = serviceInstance.getUri().toString();
baseUrl += "/employee";
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.exchange(baseUrl, HttpMethod.GET,getHeader(),String.class);
System.out.println(responseEntity.getBody());
}
private HttpEntity<?> getHeader() {
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
return new HttpEntity<>(headers);
}
}
유레카 서버 구동후 Employee-Producer 실행 후 Employee-Consumer 기동 시 노출되어 있던 API를 무사히 소비하게 됨.
'Cloud' 카테고리의 다른 글
Eureka (0) | 2020.12.07 |
---|---|
Netflix Component 설명 (0) | 2020.12.07 |
Netflix Components (0) | 2020.12.07 |
유레카서버, 등록방법 (0) | 2020.12.05 |
하나의 모듈과 의존하는 모듈관계에서 변경 전파를 적게 소비해보기 (0) | 2020.12.05 |