RATSENO

[Spring]Spring Cloud Netflix - Eureka[3] 본문

DEV/SPRING

[Spring]Spring Cloud Netflix - Eureka[3]

RATSENO 2020. 1. 29. 13:11

이전 포스팅 : https://ratseno.tistory.com/59

 

[Spring]Spring Cloud Netflix - Eureka[1]

Spring Cloud Netfilx 프로젝트는 Spring Boot를 통하여 Neflix OSS를 사용할 수 있는 프로젝트입니다. 이 프로젝트를 통하여 MSA 환경에 적합한 환경을 구축할 수 있습니다. https://cloud.spring.io/spring-clou..

ratseno.tistory.com

이전 포스팅 : https://ratseno.tistory.com/60

 

[Spring]Spring Cloud Netflix - Eureka[2]

이전 포스팅 : https://ratseno.tistory.com/59 [Spring]Spring Cloud Netflix - Eureka[1] Spring Cloud Netfilx 프로젝트는 Spring Boot를 통하여 Neflix OSS를 사용할 수 있는 프로젝트입니다. 이 프로젝트를..

ratseno.tistory.com

이전 포스팅에서 말씀드린대로

eureka-server등록된(Service Registration) employee-producer를 eureka-server를 통한  탐색(Service Discovery)을 통해

employee-consumer가 사용하도록 수정해보겠습니다.

employee-consumer 모듈의 pom.xml을 수정하도록 하겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>employee-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.SR6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

기존에 작성한 Controller인 ConsumerControllerClient에 DiscoveryClient@Autowired 어노테이션을 이용하여 주입해줍니다.

package com.example.controller;

import java.io.IOException;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
@Controller
public class ConsumerControllerClient {

    @Autowired
    private DiscoveryClient discoveryClient;

    public void getEmployee() throws RestClientException, IOException {

	//String baseUrl = "http://localhost:8080/employee";
        //기존의 employee-producer의 서비스 호출 url
        
        List<ServiceInstance> instances=discoveryClient.getInstances("employee-producer");
        ServiceInstance serviceInstance=instances.get(0);

        String baseUrl=serviceInstance.getUri().toString();

        baseUrl=baseUrl+"/employee";

        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<String> response=null;
        try{
            response=restTemplate.exchange(baseUrl,
                    HttpMethod.GET, getHeaders(),String.class);
        }catch (Exception ex)
        {
            System.out.println(ex);
        }
        System.out.println(response.getBody());
    }

    private static HttpEntity<?> getHeaders() throws IOException {
        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
        return new HttpEntity<>(headers);
    }
}

또한 기존에 employee-producer에서 노출한 서비스를 호출하는 부분(하드 코딩된)을 수정합니다.

수정된 내용은 주입한 DiscoveryClient를 이용하여 eureka에 등록된 서비스 인스턴스를 탐색하여 해당 인스턴스의 호출 url을 사용하는 것입니다.

 

employee-consumer의 application.properties 파일의 내용도 수정해줍니다.

수정 내용은 eureka-server url을 지정하는 것입니다.

server.port=8091
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

또한 employee-consumer 어플리케이션의 이름을 지정하도록 하겠습니다.

resources폴더 아래 bootstrap.properties 파일에 아래 내용을 작성합니다.

spring.application.name=employee-consumer

 

이제 employee-producer, employee-consumer, eureka-server 모듈들을 Run 하여 확인해 보겠습니다.

먼저 eureka-server에 모듈들이 등록이 되었는지 확인하기위해 http://localhost:8761/ 로 접속해 보겠습니다.

위와 같이 employee-consumer, employee-producer 인스턴스가 정상적으로 등록된것을 확인할 수 있습니다.

이어서 employee-consumer가 eureka-server를 통해 employe-producer 인스턴스를 사용하였는지 확인하기 위해

employee-consumer의 로그 정보를 확인해 보면

아래와 같이 정상적으로 결과값이 내려오는것을 확인할 수 있습니다.

지금까지 eureka에 대해서 아주 간단한 예제를 통해 알아보았습니다.

저 또한 spring cloud 생태계에 대해 공부하는 과정이므로 부족한 것들이 많았을것으로 예상됩니다.

잘못된 부분 지적은 언제 환영이며!! 추가적으로 조사하여 보강하도록 하겠습니다.

감사합니다.!

 

Github : https://github.com/RATSENO/spring-cloud-example/blob/master/README.md

Comments