본문 바로가기

Web/웹 상식

[Spring Cloud] Feign에서 Hystrix 편하게 사용해보기

Hystrix는?

Spring Cloud Hystrix는 일종의 누전차단기(Circuit Breaker) 역할을 하는 오픈소스입니다. 일정 기준 이상의 비정상적인 응답에 대해 미리 구성해둔 Fallback 로직을 수행하는 등의 작업을 해주며 치명적인 오류를 방지하는 역할입니다.

 

Feign이란?

기존의 글로 대체하겠습니다. ㅎㅎ

https://marrrang.tistory.com/81

 

[Spring Cloud] Feign에 대해서

Feign이란 MSA환경에서는 각 서비스 간의 호출이 기존의 단일 시스템일 때보다 증가하게 됩니다. 이러한 상환에서 Feign은 API 간의 호출을 편하게 해 주기 위해서 만들어졌습니다. 기존에는 HttpClient

marrrang.tistory.com

 

Feign에서 Hystrix 사용하기

실제 마이크로서비스 환경에서 종종 발생할 수 있는 오류중에 하나는 다른 서비스의 비정상적인 응답입니다. 요청을 보낼 서비스가 다운 상태이거나 아니면 응답에 지연이 발생할 경우가 종종 발생하곤 합니다.

 

그래서 Feign과 Hystrix는 굉장히 좋은 조합이라고 생각합니다. 그래서 Spring 환경에서 아주 간단하게 사용할 수 있게 이미 만들어져 있습니다.

 

Feign에 대한 설정은 위의 게시글을 통해서 보시면 될 것 같습니다. 그리고 아래부터는 Spring Boot를 기준으로 설명드리겠습니다.

 

Spring Boot에서 Feign과 Hystrix 사용 방법

1) application.yml 에서 Feign 설정 추가

<!-- Feign의 hystrix 설정 on -->
feign:
  hystrix:
    enabled: true
        
<!-- Hystrix default에 대한 설정 -->
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000

2) Fallback 처리 부분 구성

@Component
public class MarrrangClientFallback implements MarrrangClient {
    @Override
    public String testMethod(String key) {
        // Hystrix 작동하면 이 부분이 fallback으로 동작함
        ...
    }
}

 

3)  Feign Client에 fallback 설정

@FeignClient(
    name = "exampleClient",
    url = "https://marrrang.tistory.com",
    fallback = MarrrangClientFallback.class
)
public interface MarrrangClient {
    @GetMapping(value = "/test", produces = "application/json", consumes = "application/json")
    String testMethod(@RequestParam("key") String key);
    
    @PostMapping(value = "/user", produces = "application/json", consumes = "application/json")
    String registUser(@RequestHeader("auth-key") String authKey, @RequestBody User user);
}

 

간단하게는 위와 같이 사용할 수 있습니다. 단순히 fallback 말고도 에러에 대한 정보가 필요할 경우 fallbackFactory를 사용할 수 있습니다.

 

FallbackFactory 사용 시

1) FallbackFactory 클래스 작성

@Component
public class MarrrangClientFallbackFactory implements FallbackFactory<MarrrangClient> {
    private final MarrrangClientFallback fallback;
    
    public MarrrangClientFallbackFactory(MarrrangClientFallback fallback) {
        this.fallback = fallback;
    }

    @Override
    public MarrrangClientFallback create(Throwable cause) {
        // cause를 이용해 에러에 대한 작업을 한 후 fallback 클래스를 리턴한다.
        return fallback;
    }
    
    
    public class MarrrangClientFallback implements MarrrangClient {
        @Override
        public String testMethod(String key) {
            // Hystrix 작동하면 이 부분이 fallback으로 동작함
            ...
        }
    }
}

 

2) Feign Client에 fallbackFactory 설정

@FeignClient(
    name = "exampleClient",
    url = "https://marrrang.tistory.com",
    fallbackFactory = MarrrangClientFallbackFactory.class
)
public interface MarrrangClient {
    @GetMapping(value = "/test", produces = "application/json", consumes = "application/json")
    String testMethod(@RequestParam("key") String key);
    
    @PostMapping(value = "/user", produces = "application/json", consumes = "application/json")
    String registUser(@RequestHeader("auth-key") String authKey, @RequestBody User user);
}

 

 

야매로 Hystrix 설정 개별화 하기

제가 업무중에 필요했던 부분은 Hystrix의 기준이 각각의 Feign Client마다 다르게 적용되면 좋겠다 싶었습니다. 하지만 귀찮게 Java Configuration 방식 말고 application.yml에서 간단히 설정하고 싶었습니다.

 

조금 지저분하긴 하지만 방법이 있긴 했습니다. Feign은 각 메서드에 대한 Hystrix의 Key값을 찾아서 적용합니다. 그래서 그 Key값에 대한 설정을 yml에 미리 해두면 적용이 되었습니다.

 

Key값 생성 방식 : {feignClient 클래스명}#{파라미터의 클래스를 포함한 메서드}

예시 : MarrrangClient#testMethod(String)

 

<!-- application.yml -->
hystrix:
    command:
        MarrrangClient#testMethod(String):
            execution:
                isolation:
                    thread:
                        timeoutInMilliseconds: 5000

 

위와 같이 설정시 해당 메서드 별로 hystrix 설정을 야매로 간단하게 설정이 가능합니다. Configuration을 활용하는 방식은 추후에 추가로 정리하겠습니다.

반응형