서비스 디스커버리란❓
1. 서비스 등록 (Service Registration)
- 서비스 인스턴스가 시작될 때, 해당 서비스는 서비스 레지스트리에 자신의 위치(예: IP 주소와 포트) 및 메타데이터를 등록합니다.
- 이를 통해 서비스 레지스트리는 모든 활성 서비스 인스턴스의 목록을 유지하게 됩니다.
2. 서비스 조회 (Service Discovery)
- 클라이언트나 다른 서비스가 특정 서비스를 호출하기 위해, 서비스 레지스트리에 요청을 보내어 서비스 인스턴스의 위치를 조회합니다.
- 서비스 레지스트리는 등록된 서비스 인스턴스 목록을 반환하여 클라이언트가 적절한 서비스에 접근할 수 있도록 합니다.
3. 상태 모니터링 (Health Monitoring)
- 서비스 레지스트리는 서비스 인스턴스의 상태를 모니터링하여, 비정상적인 인스턴스나 장애가 발생한 인스턴스를 자동으로 감지하고 목록에서 제외합니다.
- 이를 통해 클라이언트는 정상적인 서비스 인스턴스만을 대상으로 요청을 보낼 수 있습니다.
4. 서비스 해제 (Service Deregistration)
- 서비스 인스턴스가 종료되거나 중지되면, 서비스 레지스트리는 해당 인스턴스의 정보를 제거하여
더 이상 사용되지 않도록 합니다.
Eureka란❓
- Eureka
- Netflix에서 개발한 서비스 디스커버리 서버로, 클라이언트가 서비스 인스턴스를 동적으로 찾을 수 있도록 지원합니다.
- Eureka는 서비스의 등록과 검색을 자동화하여, 애플리케이션의 복잡성을 줄여줍니다.
- 주요 특징
- 서비스 레지스트리 (Service Registry)
- Eureka는 서비스 레지스트리로 작동하여, 모든 서비스 인스턴스의 위치를 중앙 저장소에 저장합니다.
- 각 서비스는 Eureka 서버에 자신의 위치(호스트 및 포트 정보)를 등록하고, 다른 서비스는 Eureka를 통해 이러한 정보를 조회하여 통신할 수 있습니다.
- 헬스 체크(Health Check)
- Eureka는 서비스 인스턴스의 상태를 주기적으로 확인하는 헬스 체크 기능을 제공합니다.
- 서비스 인스턴스는 주기적으로 자신을 등록한 Eureka 서버에 헬스 체크 정보를 보내며, Eureka는 이를 기반으로 서비스의 가용성을 판단합니다.
- 서비스 레지스트리 (Service Registry)
Eureka 서버 설정
1. 의존성 추가
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
}
build.gradle 파일에 다음 의존성을 추가합니다.
2. application 파일 설정
application.properties
spring.application.name=eureka-server
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.server.enable-self-preservation=false
application.yml
server:
port: 8761
eureka:
client:
register-with-eureka: false # 다른 Eureka 서버에 이 서버를 등록하지 않음
fetch-registry: false # 다른 Eureka 서버의 레지스트리를 가져오지 않음
server:
enable-self-preservation: false # 자기 보호 모드 비활성화
Eureka 서버는 다른 서비스들이 등록할 수 있는 중앙 서버 역할을 하며, 자신을 클라이언트로 등록할 필요가 없습니다.
따라서, Eureka 서버는 클라이언트로서의 역할을 하지 않도록 false로 설정합니다. 이렇게 하면 Eureka 서버는 오직 다른 서비스들의 등록을 관리하는 역할만을 수행합니다.
위와 같은 파일 설정을 통해 Eureka 서버를 구성하고, 클라이언트가 등록할 수 있도록 준비합니다.
3. Eureka 서버 애플리케이션 클래스 설정
package com.example.eurekaserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
@SpringBootApplication 어노테이션이 있는 메인 애플리케이션 클래스에 @EnableEurekaServer 어노테이션을 추가하여 Eureka 서버로 설정합니다.
4. 애플리케이션 실행
이제 애플리케이션을 실행하면 Eureka 서버가 시작됩니다.
서비스 등록
클라이언트 애플리케이션은 애플리케이션 시작 시 Eureka 서버에 자신의 정보를 등록합니다. 이 과정은 보통 Spring Boot 애플리케이션에서 "spring-cloud-starter-netflix-eureka-client"를 사용하여 자동으로 처리됩니다.
서비스 디스커버리
서비스 디스커버리는 클라이언트 애플리케이션이 Eureka 서버와 같은 서비스 디스커버리 서버에서 필요한 서비스의 위치를 동적으로 조회하는 과정을 의미합니다.
이를 통해 서비스 인스턴스의 위치가 변경되거나 추가될 때도 클라이언트 애플리케이션이 자동으로 이를 반영할 수 있습니다.
RestTemplate을 사용하는 경우
RestTemplate은 Spring Framework에서 제공하는 RESTful 웹 서비스 클라이언트입니다. Spring Cloud에서는 @LoadBalanced 어노테이션을 사용하여 RestTemplate에 로드 밸런싱 기능을 추가할 수 있습니다.
1. RestTemplate 빈정의
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2. 서비스 호출
@RestController
public class MyRestTemplateController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/get-data-rest")
public String getDataWithRestTemplate() {
String serviceUrl = "http://my-service/api/data";
return restTemplate.getForObject(serviceUrl, String.class);
}
}
RestTemplate을 주입(DI) 받아 서비스 호출을 수행합니다.
서비스 URL에 http://<service-name>/api/data 형식을 사용하여 Eureka에서 등록된 서비스 인스턴스 중 하나를 자동으로 선택하여 요청을 보냅니다.
FeignClient을 사용하는 경우
FeignClient는 Spring Cloud에서 제공하는 선언적 웹 서비스 클라이언트입니다. FeignClient를 사용하면 인터페이스 기반의 간단한 서비스 호출이 가능하며, 내부적으로 로드 밸런싱을 지원합니다.
1. FeignClient 인터페이스 정의
@FeignClient(name = "my-service")
public interface MyServiceClient {
@GetMapping("/api/data")
String getData();
}
@FeignClient 어노테이션을 사용하여 호출할 서비스의 인터페이스를 정의합니다.
위 코드에서는
- @FeignClient(name = "my-service")는 my-service라는 이름의 서비스 인스턴스를 호출할 것임을 명시합니다.
- @GetMapping("/api/data")는 해당 서비스의 /api/data 엔드포인트에 GET 요청을 보냅니다.
2. FeignClient 활성화
@SpringBootApplication
@EnableFeignClients
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
애플리케이션에 @EnableFeignClients 어노테이션을 추가하여 FeignClient를 활성화합니다.
@EnableFeignClients 어노테이션은 FeignClient 인터페이스를 스캔하여 Bean으로 등록합니다.
3. 서비스 호출
@RestController
public class MyFeignClientController {
@Autowired
private MyServiceClient myServiceClient;
@GetMapping("/get-data-feign")
public String getDataWithFeignClient() {
return myServiceClient.getData();
}
}
- MyServiceClient 인터페이스를 주입(DI) 받아 getDataWithFeignClient 메서드에서 myServiceClient.getData()를 호출합니다.
- FeignClient는 서비스 이름(my-service)을 사용하여 Eureka 서버에서 서비스 인스턴스를 조회하고, 로드 밸런싱을 통해 적절한 인스턴스에 요청을 전송합니다.
동작과정을 정리하자면 다음과 같습니다.
동작 과정
- 서비스 인스턴스 등록
- my-service라는 이름을 가진 서비스 인스턴스가 Eureka 서버에 등록되어 있어야 합니다.
- 서비스 조회
- FeignClient가 호출될 때, my-service라는 이름을 기반으로 Eureka 서버에서 서비스 인스턴스를 조회합니다.
- 로드 밸런싱
- FeignClient는 Ribbon과 통합되어 있어, 여러 인스턴스가 있을 경우 로드 밸런싱을 통해 적절한 인스턴스에 요청을 분산합니다.
- HTTP 요청 전송
- 실제 HTTP 요청은 http://my-service/api/data URL로 전송됩니다.
- 이 URL은 FeignClient가 내부적으로 Eureka 서버에서 서비스 인스턴스를 찾은 후 생성합니다.
FeginCilent란❓
FeignClient는 Spring Cloud에서 제공하는 선언적 웹 서비스 클라이언트입니다.
FeignClient를 사용하면 마이크로서비스 아키텍처(MSA)에서 서비스 간의 통신을 더 간편하고 직관적으로 처리할 수 있습니다.
FeignClient는 HTTP 요청을 인터페이스 기반으로 정의하고, Spring Cloud와 통합되어 자동으로 로드 밸런싱과 서비스 디스커버리 기능을 제공합니다.
FeginCilent의 주요 특징
- 선언적 인터페이스
- FeignClient를 사용하면 HTTP 요청을 Java 인터페이스의 메서드로 선언할 수 있습니다.
- 예를 들어, REST API 호출을 위해 별도의 HTTP 클라이언트 코드를 작성할 필요 없이 인터페이스에 메서드와 URL을 정의합니다.
- 자동 서비스 디스커버리
- FeignClient는 서비스 이름을 기반으로 Eureka와 같은 서비스 디스커버리 서버에서 해당 서비스의 위치를 조회합니다.
- 서비스의 위치(IP와 포트)는 동적으로 변할 수 있기 때문에, FeignClient는 이를 자동으로 처리합니다.
- 내장 로드 밸런싱
- FeignClient는 Ribbon과 통합되어 있어, 여러 인스턴스가 존재하는 경우 로드 밸런싱을 통해 적절한 인스턴스에 요청을 분산합니다.
- 이는 클라이언트 측에서 로드 밸런싱을 자동으로 처리함으로써, 서비스의 가용성과 성능을 높입니다.
- 간단한 사용법
- FeignClient를 정의하고 @FeignClient 어노테이션을 사용하여 인터페이스를 등록합니다.
- @GetMapping, @PostMapping 등과 같은 Spring MVC 어노테이션을 사용하여 HTTP 요청을 매핑합니다.
서비스 디스커버리 동작 확인
서버 application.properites 설정
위와 같이 PORT 번호를 설정하고, 서버가 자신을 등록하지 않도록 false로 설정하며, 테스트를 위해 hostname을 localhost로 지정했습니다. 또한, Eureka 서버가 애플리케이션과 통신할 수 있도록 통신 URL을 지정해 주었습니다.
Eureka 서버 애플리케이션 클래스 설정
@SpringBootApplication 어노테이션이 있는 메인 애플리케이션 클래스에 @EnableEurekaServer 어노테이션을 추가하여 Eureka 서버로 설정합니다.
2개의 클라이언트 application.properties 설정
server에 접속해 보면 Eureka 서버에 접속한 것을 확인할 수 있습니다.
근데 아직까지 Client를 실행하지 않았기 때문에 "No instances avaliable"라고 나와있습니다.
Eureka Client 2개를 모두 실행하겠습니다.
Eureka 서버를 실행하고 Eureka서버의 관리 페이지에 들어오면 위와 같이 애플리케이션이 2개가 확인되고 있습니다.
'Framework > Spring\Spring boot' 카테고리의 다른 글
[Spring Cloud] Resilience4j를 활용한 서킷 브레이커의 상태 변화와 Fallback 메커니즘 (0) | 2024.08.03 |
---|---|
[Spring Cloud] FeignClient와 Ribbon을 통한 클라이언트 사이드 로드 밸런싱 알아보기❗️ (0) | 2024.08.01 |
[Spring MVC] Filter: 웹 애플리케이션 보안을 위한 필터의 역할과 활용법 (0) | 2024.08.01 |
[Spring Cloud] Spring Cloud란 무엇일까 ❓ (마이크로서비스 아키텍처(MSA)를 위한 프레임워크 ) (0) | 2024.07.31 |
[Spring Boot] Spring Boot에서 JWT 다루기 (JWT, @Value, @PostConstruct) (0) | 2024.07.29 |