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 사용

주입
feign 사용

  • 작동 확인

 

 

Fegin Client 로그 사용

  • FeignClient 사용 시 발생한 로그 추적
  • application.yml에 로깅 설정

  • Logger Bean을 메인클래스에 등록

feign가 지원해주는 로그 기능

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 메세지 설정

  • 결과