1. 소개

이전에 우리는 Ratpack을 사용하여 고성능 및 반응 형 애플리케이션을 구축하는 방법을 보여 주었습니다.

이 기사에서는 Netflix Hystrix를 Ratpack 애플리케이션과 통합하는 방법을 살펴 보겠습니다.

Netflix Hystrix는 액세스 지점을 격리하여 계단식 장애를 중지하고 내결함성을위한 폴백 옵션을 제공함으로써 분산 서비스 간의 상호 작용을 제어하는 ​​데 도움을줍니다. 보다 탄력적 인 애플리케이션을 구축하는 데 도움이 될 수 있습니다. 빠른 검토 를 위해 Hystrix 소개를 참조하십시오 .

이것이 우리가 사용하는 방법입니다. Hystrix가 제공하는 이러한 유용한 기능으로 Ratpack 애플리케이션을 향상시킬 것입니다.

2. Maven 의존성

Ratpack과 함께 Hystrix를 사용하려면 pom.xml 프로젝트에 ratpack-hystrix 의존성이 필요합니다 .

<dependency>
    <groupId>io.ratpack</groupId>
    <artifactId>ratpack-hystrix</artifactId>
    <version>1.4.6</version>
</dependency>

최신 버전의 ratpack-hystrix는 여기 에서 찾을 수 있습니다 . ratpack-hystrix에는 ratpack-corehystrix-core가 포함 됩니다.

Ratpack의 반응 적 기능을 사용하려면 ratpack-rx도 필요합니다.

<dependency>
    <groupId>io.ratpack</groupId>
    <artifactId>ratpack-rx</artifactId>
    <version>1.4.6</version>
</dependency>

최신 버전의 ratpack-rx는 여기 에서 찾을 수 있습니다 .

3. Hystrix 명령으로 서비스

Hystrix를 사용할 때 기본 서비스는 일반적으로 HystrixCommand 또는 HystrixObservableCommand로 래핑됩니다 . Hystrix는 동기, 비동기 및 반응 방식으로 이러한 명령 실행을 지원합니다. 이 중 리 액티브 만 논 블로킹이며 공식적으로 권장됩니다.

다음 예제에서는 Github REST API 에서 프로필을 가져 오는 일부 엔드 포인트를 빌드 합니다 .

3.1. 사후 명령 실행

먼저 Hystrix로 반응 형 백엔드 서비스를 구축해 보겠습니다.

public class HystrixReactiveHttpCommand extends HystrixObservableCommand<String> {

    //...

    @Override
    protected Observable<String> construct() {
        return RxRatpack.observe(httpClient
          .get(uri, r -> r.headers(h -> h.add("User-Agent", "Baeldung HttpClient")))
          .map(res -> res.getBody().getText()));
    }

    @Override
    protected Observable<String> resumeWithFallback() {
        return Observable.just("eugenp's reactive fallback profile");
    }
}

여기서 Ratpack 반응 HttpClient 는 GET 요청을 만드는 데 사용됩니다. HystrixReactiveHttpCommand는 반응 핸들러로 수행 할 수 있습니다 :

chain.get("rx", ctx -> 
  new HystrixReactiveHttpCommand(
    ctx.get(HttpClient.class), eugenGithubProfileUri, timeout)
    .toObservable()
    .subscribe(ctx::render));

끝점은 다음 테스트로 확인할 수 있습니다.

@Test
public void whenFetchReactive_thenGotEugenProfile() {
    assertThat(appUnderTest.getHttpClient().getText("rx"), 
      containsString("www.baeldung.com"));
}

3.2. 비동기 명령 실행

HystrixCommand 의 비동기 실행은 스레드 풀의 명령을 대기열에 추가하고 Future를 반환합니다 .

chain.get("async", ctx -> ctx.render(
  new HystrixAsyncHttpCommand(eugenGithubProfileUri, timeout)
    .queue()
    .get()));

HystrixAsyncHttpCommand의 외모와 같은 :

public class HystrixAsyncHttpCommand extends HystrixCommand<String> {

    //...

    @Override
    protected String run() throws Exception {
        return EntityUtils.toString(HttpClientBuilder.create()
          .setDefaultRequestConfig(requestConfig)
          .setDefaultHeaders(Collections.singleton(
            new BasicHeader("User-Agent", "Baeldung Blocking HttpClient")))
          .build().execute(new HttpGet(uri)).getEntity());
    }

    @Override
    protected String getFallback() {
        return "eugenp's async fallback profile";
    }

}

여기서는 Hystrix가 실제 명령의 실행 시간 제한을 제어하도록하여 Future 에서 응답을받을 때 자체적으로 처리 할 필요가 없기 때문에 비 차단 대신 차단 HttpClient사용합니다 . 또한 Hystrix가 요청을 대체하거나 캐시 할 수 있습니다.

비동기 실행은 또한 예상되는 결과를 생성합니다.

@Test
public void whenFetchAsync_thenGotEugenProfile() {
    assertThat(appUnderTest.getHttpClient().getText("async"),
      containsString("www.baeldung.com"));
}

3.3. 동기 명령 실행

동기 실행은 현재 스레드에서 직접 명령을 실행합니다.

chain.get("sync", ctx -> ctx.render(
  new HystrixSyncHttpCommand(eugenGithubProfileUri, timeout).execute()));

의 구현 HystrixSyncHttpCommand은 거의 동일 HystrixAsyncHttpCommand 우리는 그것을 다른 가을 다시 결과를 제공한다는 점을 제외하고. 폴백하지 않을 때는 반응 및 비동기 실행과 동일하게 작동합니다.

@Test
public void whenFetchSync_thenGotEugenProfile() {
    assertThat(appUnderTest.getHttpClient().getText("sync"),
      containsString("www.baeldung.com"));
}

4. 메트릭

등록함으로써 Guice 모듈 - HystrixModule Ratpack 레지스트리에를, 우리는 요청이 메트릭을 범위 스트리밍 이벤트가 통해 스트림에 노출 될 수 있습니다 GET의 엔드 포인트 :

serverSpec.registry(
  Guice.registry(spec -> spec.module(new HystrixModule().sse())))
  .handlers(c -> c.get("hystrix", new HystrixMetricsEventStreamHandler()));

HystrixMetricsEventStreamHandler는 스트림에서 Hystrix 측정을하는 데 도움이 텍스트 / 이벤트 스트림 우리가 메트릭 모니터링 할 수 있도록, 형식 Hystrix 대시 보드 .

독립형 Hystrix 대시 보드를 설정 하고 Hystrix 이벤트 스트림을 모니터 List에 추가하여 Ratpack 애플리케이션의 성능을 확인할 수 있습니다.

Ratpack 애플리케이션에 여러 번 요청한 후 대시 보드에서 Hystrix 관련 명령을 볼 수 있습니다.

4.1. 후드

에서 HystrixModule 하는 Hystrix 동시성 전략을 통해 Hystrix에 등록되어 HystrixPlugin Ratpack 레지스트리 요청 문맥을 관리 할 수 있습니다. 이렇게하면 각 요청이 시작되기 전에 Hystrix 요청 컨텍스트를 초기화 할 필요가 없습니다.

public class HystrixModule extends ConfigurableModule<HystrixModule.Config> {

    //...
  
    @Override
    protected void configure() {
      try {
        HystrixPlugins.getInstance().registerConcurrencyStrategy(
          new HystrixRegistryBackedConcurrencyStrategy());
      } catch (IllegalStateException e) {
        //...
      }
    }

    //...

}

5. 결론

이 빠른 기사에서는 Hystrix를 Ratpack에 통합하는 방법과 애플리케이션 성능을 더 잘 볼 수 있도록 Ratpack 애플리케이션의 메트릭을 Hystrix Dashboard에 푸시하는 방법을 보여주었습니다.

항상 그렇듯이 전체 구현은 Github 프로젝트 에서 찾을 수 있습니다 .