Cloud

DiscoveryClient 를 이용한 API 콜

Jungsoomin :) 2020. 12. 7. 13:27

Url 을 하드코딩하지 않고 DiscoveryClient 를 이용한 API 콜을 설명하고 있다.

 


Employee-Consumer 에 의존추가

 

Index of milestone/

 

repo.spring.io

  • 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> 타입.
  • ServiceInstancegetUri(), 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