카테고리 없음

삽질의 기록 :: FeignClient

dev_ajrqkq 2024. 9. 23. 14:44

MSA 프로젝트 중 gateway를 통해 다른 서비스를 호출 하는 과정에서 FeignClient를 사용했다.

 

company 서비스에서 hub 서비스로 호출 중 401 에러가 났다.

{
  "resultCode": "ERROR",
  "result": "[401] during [GET] to [http://hub-service/api/hubs/3fa85f64-5717-4562-b3fc-2c963f66afa6] [HubClient#findHub(UUID)]: []"
}

 

권한이... 왜 없지?

생각하다가

 

hub 서비스를 호출 할 때 토큰이 없어서 접근을 못한다고 생각했다.

 

- id: hub
  uri: lb://hub-service
  predicates:
    - Path=/api/hubs/**, /api/hub-paths/**
  filters:
    - SetRequestHeader=Authorization, request.headers.Authorization

 

gateway routes 쪽에 filter를 넣어봤다.

 

{
  "resultCode": "ERROR",
  "result": "java.lang.IllegalArgumentException: CharSequence cannot be null or empty."
}

그랬더니 요런 에러가..

보통 토큰을 안 넣고 돌렸는데 나는 에런데... 토큰이 잘 안 넘어가나보다..!

 

gateway routes 쪽에 filter를 지우고

 

@FeignClient(name = "hub-service", url = "${gateway.url}", configuration = FeignConfig.class)
public interface HubClient extends HubService {

configuration을 추가한다.

@Bean
public RequestInterceptor requestInterceptor() {
    return requestTemplate -> {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            String accessToken = request.getHeader("Authorization");
            if (accessToken != null && accessToken.startsWith("Bearer ")) {
                requestTemplate.header("Authorization", accessToken);
            }
        }
    };
}

헤더에 토큰을 넣는 인터셉터인 FeignConfig를 생성하였더니 호출에 성공하였다!