FrameWork/Spring Cloud
마이크로서비스간 통신 - Feign Web Service Client
태윤2
2021. 9. 7. 01:13
- FeignClient -> HTTP Client
- REST Call을 추상화 한 Spring Cloud Netflix 라이브러리
- 사용방법
- 호출하려는 HTTP Endpoint에 대한 Interface를 생성
- @FeignClient 선언
- Load balanced 지원
Feign Web Service Client
- openfeign 라이브러리 추가
- @FeignClient Interface 생성
package com.example.userservice.client;
import com.example.userservice.vo.ResponseOrder;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
@FeignClient(name = "order-service")
public interface OrderServiceClient {
// interface method 는 전부 public 이다
@GetMapping("/order-service/{userId}/orders")
List<ResponseOrder> getOrders(@PathVariable String userId);
}
- @EnableFeignClients 메인 클래스에 추가
- UserServiceImpl에서 Feign Client 사용
- 작동 확인
Fegin Client 로그 사용
- FeignClient 사용 시 발생한 로그 추적
- application.yml에 로깅 설정
- Logger Bean을 메인클래스에 등록
Fegin Client 예외 처리
- try~catch 구문추가
- 예외 에러 표시
- Order 정보를 제외한 User 정보만 반환
FeignErrorDecoder
에러 상태 코드에 따라 분기 되어 있는 적절한 코드를 실행 시킬 수 있음
- ErrorDecoder 구현
package com.example.userservice.error;
import feign.Response;
import feign.codec.ErrorDecoder;
import org.springframework.http.HttpStatus;
import org.springframework.web.server.ResponseStatusException;
public class FeignErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
switch (response.status()) {
case 400:
break;
case 404:
if (methodKey.contains("getOrders")) {
return new ResponseStatusException(HttpStatus.valueOf(response.status()),
"User's orders is empty");
}
break;
default:
return new Exception(response.reason());
}
return null;
}
}
- 메인 클래스에 Bean 생성
- Service에서 호출
- case 404 호출 확인
- 설정파일에서 Exception 메세지 설정
- 결과