Cloud

Feign

Jungsoomin :) 2020. 12. 8. 14:45

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 기능

'Cloud' 카테고리의 다른 글

Sleuth & ZipKin  (0) 2020.12.14
Hystrix  (0) 2020.12.08
Ribbon  (0) 2020.12.08
Zuul  (0) 2020.12.07
Eureka  (0) 2020.12.07