반응형
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 |