반응형

Spring Cloud Eureka

Spring Cloud Eureka?

  • 마이크로 서비스들의 정보를 레지스트리에 등록하고, 마이크로 서비스의 동적인 탐색(Discovery)과 로드 밸런싱 기능을 제공한다.
  • 마이크로 서비스들 간의 통신을 위해 직접 주소를 지정할 필요 없이 서비스명으로 접근이 가능하도록 해준다.
  • Eureka는 Eureka Server와 Eureka Client로 구성된다
  • Eureka Server는 Eureka Client에 해당하는 마이크로 서비스들의 상태 정보가 등록되어있는 레지스트리를 갖는다
  • Eureka Client는 서비스가 시작될 때 Eureka Server에 자신의 정보를 등록한다
  • 등록 후 30초마다 레지스트리에 ping을 전송하여 자신이 가용 상태임을 알린다
  • 일정 횟수 이상 ping이 확인되지 않으면 Eureka Server에서 해당 서비스를 레지스트리에서 제외시킨다
  • 가용 상태의 서비스 목록을 확인할 경우에는 서비스의 이름을 기준으로 탐색하여 로드 밸런싱을 위해 내부적으로 Ribbon(클라이언트 측의 로드 밸런서)을 사용한다.

Eureka Server 구성하기

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-msa-eureka-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-msa-eureka-server</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

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

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
application.yml 설정
server:
  port: 8787

eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    register-with-eureka: false
    fetch-registry: false
@EnableEurekaServer 어노테이션 추가
@EnableEurekaServer
@SpringBootApplication
public class SpringMsaEurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringMsaEurekaServerApplication.class, args);
    }
}
페이지 접속

Eureka Client 구성하기

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>spring-msa-eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-msa-eureka-client</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>
application.yml 설정
server:
  port: 8080

spring:
  application:
    name: spring-msa-eureka-client

eureka:
  client:
    serviceUrl:
      defaultZone: ${EUREKA_URL:http://localhost:8787/eureka/}
@EnableDiscoveryClient 어노테이션 추가
@EnableDiscoveryClient
@SpringBootApplication
public class SpringMsaEurekaClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringMsaEurekaClientApplication.class, args);
    }
}
RestTemplate Bean 등록
  • @LoadBalanced 어노테이션을 추가하면 Ribbon을 사용한 로드밸런싱 기능이 추가됨
  • Eureka에서 서비스의 이름으로 적절한 경로를 찾아 로드밸런싱 처리
@Configuration
public class WebMvcConfig {
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
테스트 컨트롤러 작성
@RequiredArgsConstructor
@RestController
public class TimeController {
    private final RestTemplate restTemplate;

    @GetMapping("/api/time")
    public LocalDateTime time() {
        return LocalDateTime.now();
    }

    @GetMapping("/api/test")
    public String test() {
        // service name(spring-msa-eureka-client)로 통신
        return restTemplate.getForObject("http://spring-msa-eureka-client/api/time", String.class);
    }
}

테스트

Eureka Server와 Eureka Client 모두 띄운 후 Eureka Server 페이지에서 Eureka Client 인스턴스가 있는지 확인

테스트 주소로 요청하여 정상 동작하는지 확인
### 테스트
GET http://localhost:8080/api/test
"2020-12-15T19:02:51.146593"

참고

반응형

'Development > Spring' 카테고리의 다른 글

[Spring] Spring Cloud Gateway  (0) 2020.12.27
[Spring] Spring Cloud Hystrix  (0) 2020.12.27
[Spring] Spring Cloud Config  (0) 2020.12.27
[Spring] SQL Mapper (with MyBatis)  (0) 2020.12.27
[Spring] ORM (with JPA, Hibernate)  (0) 2020.12.27

+ Recent posts