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-core 및 hystrix-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 프로젝트 에서 찾을 수 있습니다 .