REST API 기반 Eureka client 서비스를 쉽게 호출하기 위해 구성
- 다른 Eureka Service 의 REST API 호출을 간단하게 진행
- 에러처리 간단
- Eureka에 등록된 Service를 바로 사용함
- Ribbon을 통한 LoadBalancing 가능
- API Unit TEST 구현 용이
형태
필요의존
- org.springframework.cloud:spring-cloud-starter-openfeign
- 리포지토리 url https://repo.spring.io/milestone
- springCloudVersion 에 변수 대입
- 의존 관리 : org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}
plugins {
id 'org.springframework.boot' version '2.4.0'
id 'io.spring.dependency-management' version '1.0.10.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
maven { url 'https://repo.spring.io/milestone' }
}
ext {
set('springCloudVersion', "2020.0.0-M6")
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
test {
useJUnitPlatform()
}
다른 Eureka Service URL 을 source, config 에 명시해서 사용가능.
- 인터페이스에 @FeignClient 를 명시, 호출할 서비스의 이름, 도메인 등을 기술
- 인터페이스 메서드에 @RequestMapping 을 기술하여 호출할 서비스의 api를 정의
- @Configuration 클래스에 @EnableFeignClients 선언
- Jpa 처럼 @FeignClient 선언 인터페이스의 구현체를 등록된 Eureka Registry 기반으로 만들어 내는 듯.
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
//
@FeignClient( name = "web", // feign 서비스 이름
url = "http://localhost:8070", // 서비스 url
decode404 = true // 404 에러 핸들링을 feign 에게 맡긴다.
)
// @FeignClient(name = "WEB") Eureka Service 이름으로 등록 가능
public interface WebClient {
// Jpa 처럼 구현체를 만들어서 제공하게 된다.
@GetMapping("/test/{id}")
public ResponseEntity<Object> WebClientApiTest(@PathVariable("id") Long id);
}
//사용
@RestController
public class FeignController {
private static final Logger LOGGER = LoggerFactory.getLogger(FeignController.class);
// 구현체를 자동 주입 받을 수 있게 됨.
@Autowired
private WebClient webClient;
@GetMapping("/feign")
public ResponseEntity<Object> testFeign(){
LOGGER.warn("========================================================");
LOGGER.warn("Call Feign");
LOGGER.warn("========================================================");
ResponseEntity<Object> responseEntity = webClient.WebClientApiTest(1L);
return responseEntity;
}
}
//로깅
2020-12-08 14:30:23.120 WARN 8444 --- [nio-8090-exec-1] c.e.e.controller.FeignController : ========================================================
2020-12-08 14:30:23.120 WARN 8444 --- [nio-8090-exec-1] c.e.e.controller.FeignController : Call Feign
2020-12-08 14:30:23.120 WARN 8444 --- [nio-8090-exec-1] c.e.e.controller.FeignController : ========================================================
//Eureka 에 등록된 WEB 서비스 로깅
Hibernate:
call next value for hibernate_sequence
Hibernate:
insert
into
account
(name, id)
values
(?, ?)
Hibernate:
select
account0_.id as id1_0_0_,
account0_.name as name2_0_0_
from
account account0_
where
account0_.id=?
application.yml 에서 설정가능한 사항
feign:
client:
config:
default: #or feign Service name
connect-timeout: 5000 # 요청 서버와 Connection 맺기까지의 대기시간
read-timeout: 5000 # Connection 후 Response 가 오기 까지 대기시간
호출한 Eureka Service 의 작동 중인 Instance 가 많을 경우 Ribbon 의 Load Balancing 사용
Hystrix 를 사용시 Error 가 발생한 경우 방법 정의 가능, FallBack 기능