Architecture/MSA

Hystrix, Feign을 이용한 개발

체리필터 2020. 12. 18. 08:58
728x90
반응형

아직 프로토타입까지만 작성하였지만 기본적인 내용이 돌아가기에 현재의 상태를 기록한다.

 

application.yml 파일

feign:
  hystrix:
      enabled: true
  client:
      config:
          feignName:
              connectTimeout: 5000
              readTimeout: 5000
              loggerLevel: full
hystrix:
  command:
      default: # 5초 타임아웃. 1분동안 최소 5회 호출 이상, 50% 이상 실패면 circuit open
          execution:
              isolation:
                  thread:
                      timeoutInMilliseconds: 5000
          metrics:
              rollingStats:
                  timeInMilliseconds: 60000
          circuitBreaker:
              requestVolumeThreshold: 5
              errorThresholdPercentage: 50

hystrix 자체 만으로 circuit breaker를 구현할 수 있지만 어짜피 네트워크를 통한 api 호출 실패를 대비한 것이기에 feign과 같이 연동하는 것으로 최종 목표를 잡음.

또한 fallback method에서 관련된 내용을 debug 하고 원인 분석을 해야 하기에 fallbackFactory 방식으로 구성

 

아래는 Client 소스

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

@FeignClient(name = "coocon",
        url = "${chauffeur.coocon.acctNmUrl}",
        fallbackFactory = CooconBankAccountClientFallbackFactory.class)
public interface CooconBankAccountClient {
    @RequestMapping(method = RequestMethod.POST,
            value = "url 이하 주소",
            produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    String getCooconAcctnRcms(@RequestParam Map<String, String> requestMap);
}

 

실제 class는 안 만들고 JPA 처럼 interface만 만들어주고 선언만 해 주면 되는 형식으로 보임.

yml 파일에서 설정한 내용에 맞게 실패가 떨어지는 경우 CooconBankAccountClientFallbackFactory 에서 처리

 

import feign.hystrix.FallbackFactory;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class CooconBankAccountClientFallbackFactory implements FallbackFactory<CooconBankAccountClient> {
    private final CooconBankAccountClientFallback cooconBankAccountClientFallback;

    public CooconBankAccountClientFallbackFactory() {
        this.cooconBankAccountClientFallback = new CooconBankAccountClientFallback();
    }

    @Override
    public CooconBankAccountClient create(Throwable cause) {
        log.error(cause.getMessage(), cause);
        return cooconBankAccountClientFallback;
    }

    public class CooconBankAccountClientFallback implements CooconBankAccountClient {
        @Override
        public String getCooconAcctnRcms(Map<String, String> requestMap) {
            return "";
        }
    }
}

 

getCooconAcctnRcms 메소드를 구현 하면서 실패 시 대체 해야 할 내용을 작성 하면 됨.

728x90
반응형