Search
Duplicate
📒

[Spring MSA] 04-1. MSA통신방법(OpenFeign)

상태
수정중
수업
Spring MSA
주제
4 more properties
참고

OpenFeign

NOTE
OpenFeign은 Declarative(선언적인) HTTP Client 도구로써, 외부 API 호출을 HTTP 요청 코드를 직접 작성하지 않고도 REST API를 호출할 수 있습니다.
OpenFeign은 Spring Cloud 기반의 기술이므로 Spring Cloud에 대한 의존성이 필요합니다.
dependencies { implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' } dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:2022.0.3" } }
Groovy
복사
build.gradle
@SpringBootApplication @EnableFeignClients // 추가! public class FeignClientApplication { public static void main(String[] args) { SpringApplication.run(FeignClientApplication.class, args); } }
Java
복사
// 선언적 방식(어노테이션 추가로 쉽게 사용) @FeignClient(name = "github-client", url = "https://api.github.com") public interface GitHubClient { @GetMapping("/users/{username}") GitHubUser getUser(@PathVariable("username") String username); } @Getter class GitHubUser { private String login; private String name; private String blog; }
Java
복사
사용예제
OpenFeign은 다음과 같은 특징이 있습니다.
1.
선언적 접근: 인터페이스를 통해 Rest API를 정의합니다.
2.
로드 밸런싱: Spring Cloud LoadBalancer와 통합하여 클라이언트측 로드밸런싱 지원
3.
Fallback: Resilience4j와 같은 라이브러리를 통해 장애 복구(fallback) 기능을 제공합니다.
4.
일관된 설정: Spring의 다른 구성 요소와 통합하여 일관된 설정 관리가 가능합니다.

OpenFeign 설정(타임아웃, 재시도, 로깅)

NOTE
OpenFeign의 설정은 yamlJava config로 할 수 있습니다.
spring: cloud: openfeign: enabled: true # OpenFeign 기능 활성화 feign: client: config: default: connectTimeout: 1000 # 기본 클라이언트의 연결 타임아웃 (밀리초 단위) readTimeout: 3000 # 기본 클라이언트의 읽기 타임아웃 (밀리초 단위) loggerLevel: FULL # 기본 클라이언트의 로깅 레벨 설정 # 클라이언트별 설정도 가능 githubClient: connectTimeout: 1000 # GitHub 클라이언트의 연결 타임아웃 (밀리초 단위) readTimeout: 3000 # GitHub 클라이언트의 읽기 타임아웃 (밀리초 단위) loggerLevel: FULL # GitHub 클라이언트의 로깅 레벨 설정 logging: level: com.example: DEBUG # 예시 패키지의 로그 레벨 feign: Logger: FULL # Feign 로거의 전역 로깅 레벨 설정
YAML
복사
전체코드 예제 - yaml
@Configuration // 생략가능 public class FeignConfig { @Bean public Request.Options requestOptions() { // Connection timeout: 1000ms, Read timeout: 3000ms return new Request.Options(1000, 3000); } @Bean public Retryer retryer() { // Period: 1000ms, Max period: 1000ms, Max attempts: 3 return new Retryer.Default(1000, 1000, 1); } @Bean Logger.Level feignLoggerLevel() { // Set the log level to FULL for detailed logging return Logger.Level.FULL; } }
Java
복사
전체코드 예제 - java

타임아웃

feign: client: config: default: connectTimeout: 5000 # 기본 클라이언트의 연결 타임아웃 (밀리초 단위) readTimeout: 10000 # 기본 클라이언트의 읽기 타임아웃 (밀리초 단위) githubClient: connectTimeout: 3000 # GitHub 클라이언트의 연결 타임아웃 (밀리초 단위) readTimeout: 6000 # GitHub 클라이언트의 읽기 타임아웃 (밀리초 단위)
YAML
복사
yaml 방식
@Configuration public class FeignConfig { @Bean public Request.Options requestOptions() { // Connection timeout: 5000ms, Read timeout: 10000ms return new Request.Options(5000, 10000); } }
Java
복사
Java Config 방식

재시도 설정

@Configuration public class FeignConfig { @Bean public Retryer retryer() { return new Retryer.Default(1000, 2000, 3); // Period: 1000ms, Max period: 2000ms, Max attempts: 3 } }
Java
복사
Java Config 방식

로그 설정

logging: level: com.example: DEBUG # 예시 패키지의 로그 레벨 feign: Logger: FULL # Feign 로거의 로그 레벨을 FULL로 설정
YAML
복사
yaml 방식
@Configuration public class FeignConfig { @Bean Logger.Level feignLoggerLevel() { // Set the log level to FULL for detailed logging return Logger.Level.FULL; } }
Java
복사
Java Config 방식
Logger의 이름은 전체 인터페이스 이름이며, 4가지 로그 레벨수준을 제공한다.
NONE: 로깅하지 않음
BASIC: 요청 메소드와 URI와 응답 상태와 실행시간만 로깅한다.
HEADERS: 요청과 응답 헤더와 함께 기본 정보들을 남긴다.
FULL: 요청과 응답에 대한 헤더와 바디, 메타데이터를 남긴다.