본문 바로가기

Backend/Spring Cloud

[Spring Cloud] Spring Cloud와 Eureka !!

안녕하세요. 이번 포스팅에서는 Spring Cloud와 Eureka server에 대해서 알아보고 간단하게 유레카 서버와 service 등록을 진행해보겠습니다.

 

Spring Cloud

이제는 monolithic한 서비스 개발 방식을 넘어 마이크로 서비스로 실제 대부분의 서비스들이 운용됩니다. Spring Cloud란 마이크로 서비스의개발, 배포, 운영에 필요한 아키텍처를 쉽게 구성할 수 있도록 지원하는 Spring Boot기반의 프레임워크입니다.

 

 

유레카에 대한 설명에 앞서, 

 

만약 하나의 서비스가 네 개의 인스턴스를 사용해서 운용되고 있다고 생각해보겠습니다.

 

 

실제 사용자는 이 서비스에 정의된 본인이 필요한 요청을 보낼 겁니다. 이렇게 여러 개로 분산되어 서비스가 운용되고 있다면, 각 요청에 맞게 HashMap과 같은 형태로 매핑해주는 역할을 하는 서비스가 필요합니다. 일종의 전화부 역할이라고 생각하시면 됩니다. 

 

이 Discovery Service를 Netflix Eureka를 활용하여 구현할 수 있습니다. 

 

Eureka

Eureka Service는 Netflix에서 Spring에 지원한 자사 기술입니다. 각각의 마이크로 서비스는 자신의 주소를 이 Eureka Service에 등록합니다. 

 

 

클라이언트가 요청을 http 요청을 보냅니다. 

이 요청은 Api Gateway로 전달이 되고, Api Gateway는 Discovery Service에 현재 요청에 필요한 서비스의 주소를 가져옵니다.

 

Api Gateway는 이렇게 받은 주소로 서비스에 요청을 보내고, 반환받은 값을 클라이언트에게 전달해줍니다. 

 

Eureka Server 생성

자 이제 실습을 진행해보겠습니다. 앞서 살펴본 예시처럼 전화부 역할을 하는 유레카 서버가 하나 필요합니다.

 

<?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.5.4</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>EurekaDiscoveryService</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>EurekaDiscoveryService</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>11</java.version>
		<spring-cloud.version>2020.0.3</spring-cloud.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</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>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

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

</project>

 

위와 같이 Eureka Servcer를 Dependency에 추가한 프로젝트를 하나 생성합니다.

 

package com.example.EurekaDiscoveryService;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaDiscoveryServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(EurekaDiscoveryServiceApplication.class, args);
	}

}

 

그다음 메인 Application class에 @EnableEurekaServer 어노테이션을 붙여줍니다.

이 어노테이션은 Eureka Server로 현재 서비스를 등록해줍니다.

 

그다음 application.properties를 수정해줍니다.

server.port=8761
spring.application.name=discoveryservice

eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

 

server.port -> 유레카 서버가 등록될 포트번호를 지정합니다.

 

register-with-eureka = false, fetch-registry = false -> 기본 설정은 true입니다. 

이를 false로 진행해주시면, 전화번호부 자체는 전화번호부에 등록하지 않겠다 라는 의미입니다.

 

 

위 설정을 모두 마친 뒤, 설정하신 port번호로 http://localhost:8761(server.port)로 접속하시면 위와 같은 창이 보이실 겁니다. 정상적으로 유레카 서버가 해당 포트에 등록이 되었다는 뜻입니다.

 

Eureka Client 생성

이번에는 Server에 등록될 Client를 생성해보겠습니다.

 

Client Project는 dependency에 

eureka-service가 아닌 eureka-client를 추가해주셔야 합니다. 

 

@SpringBootApplication
@EnableDiscoveryClient
public class EcommerceServiceApplication {
	public static void main(String[] args) {
		SpringApplication.run(EcommerceServiceApplication.class, args);
	}
}

 

이번에는 @EnableDiscoveryClient 어노테이션을 추가해줍니다. 

 

server:
  port: 0

spring:
  application:
    name: user-service

eureka:
  instance:
    instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
  client:
    register-with-eureka: true
    fetchRegistry: true
    service-url:
      defaultZone: http://localhost:8761/eureka

 

application.properties 파일입니다. .yml파일로 저는 만들었습니다.

 

인스턴스 id를 random.value를 통해 생성해주었습니다. 또한 이번에는 eureka server에 등록되어야 하기 때문에 설정값을 true로 주었습니다.

 

defaultZone은 eureka server의 주소를 적어주시면 됩니다.

 

정상적으로 설정이 끝난 뒤 실행하시면

 

아까 유레카 서버 새로운 instance가 등록된 것을 확인하실 수 있습니다.

 

*저의 글에 대한 피드백이나 지적은 언제나 환영합니다.