Openfeign 런타임(runtime) 시 URI 변경

1 분 소요


👉 아래 글은 해당 포스트를 읽는데 도움을 줍니다.

Eureka 서비스 구축 및 관련 API 요청 테스트에 대한 글을 작성하기 전에 간단한 기능을 먼저 소개하려고 합니다.

1. Dynamic URI FeignClient on Runtime

1.1. Spring Cloud Openfeign 포스트에서 사용한 SimpleClient 인터페이스

Spring Cloud Openfeign 포스트에서 사용한 FeignClient 코드를 보면 직관적으로 URL이 고정되어 있다고 느낄 수 있습니다.

@FeignClient(name = "simple-client", url = "http://localhost:8081")
interface SimpleClient {

    @GetMapping(path = "/api/cors/health")
    String health();
}

1.2. 런타임 시 URI 지정할 수 있는 FeignClient 생성하기

사실 FeignClient는 보다 더 유연한 프로그램 개발을 위해 런타임(runtime) 시 URL을 변경하는 기능을 제공하고 있습니다. 관련된 내용을 stack overflow 답변에서 확인할 수 있었습니다. 설명을 보면 애너테이션이 붙어있지 않은 URI 파라미터를 추가하면 해당 URI로 요청을 보낸다는 내용 같습니다.

stack overflow - How can I change the feign URL during the runtime?
You can add an unannotated URI parameter (that can potentially be determined at runtime) and that will be the base path that will be used for the request. E.g.:

@FeignClient(name = "dummy-name", url = "https://this-is-a-placeholder.com")
public interface MyClient {
    @PostMapping(path = "/create")
    UserDto createUser(URI baseUrl, @RequestBody UserDto userDto);
}

2. 테스트 코드

package blog.in.action.openfeign.dynamic;

import java.net.URI;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

import feign.Response;
import lombok.extern.log4j.Log4j2;

@FeignClient(name = "dynamic-url-client", url = "any-value")
interface DynamicUrlClient {

    @GetMapping(path = "/")
    Response getMethod(URI uri);
}

@Log4j2
@SpringBootTest
public class DynamicUrlTest {

    @Autowired
    private DynamicUrlClient dynamicUrlClient;

    @Test
    public void test() {
        try {
            Response response = dynamicUrlClient.getMethod(new URI("https://www.naver.com"));
            log.info("response from naver: " + response.body());
            response = dynamicUrlClient.getMethod(new URI("https://www.google.com"));
            log.info("response from google: " + response.body());
        } catch (Exception e) {
            log.error("error while using feignclient", e);
        }
    }
}
테스트 수행
  • https://www.naver.com 주소를 가진 URI 객체를 getMethod() 메소드의 매개변수로 전달합니다.
  • https://www.google.com 주소를 가진 URI 객체를 getMethod() 메소드의 매개변수로 전달합니다.
  • 각 결과를 확인합니다.
https://www.naver.com 요청 결과

https://www.google.com 요청 결과

CLOSING

Openfeign을 사용하는 프로젝트에서 유용한 정보일 것 같습니다. 간단한 테스트 코드와 기능 설명으로 짧은 글을 작성할 수 있을 것 같아서 해당 주제를 먼저 포스트하였습니다.

TEST CODE REPOSITORY

REFERENCE