マイクロサービスアーキテクチャにおけるHystrixおよびTurbineの活用方法について解説します。この記事では、Hystrixの基本設定やサービスのデグレード処理、そしてTurbineを使った複数サービスの集約監視に焦点を当てます。
Hystrixによる回路遮断の概念
Hystrixは、システム全体の安定性を保つために特定の部分で問題が発生した場合にその影響を最小限に抑えるためのライブラリです。これにより、1つのサービスの障害が他のサービスにも波及する「雪崩効果」を防ぐことができます。Hystrixの基本設定
まず、プロジェクトにHystrixを導入するためにpom.xmlファイルに以下の依存関係を追加します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
次に、サービスクラス内でHystrixを使用してエラーハンドリングを行います。
@RestController
public class ServiceController {
@GetMapping("/service/{id}")
@CircuitBreaker(name = "default", fallbackMethod = "fallback")
public ResponseEntity<ServiceDTO> getService(@PathVariable Long id) {
// サービス呼び出しロジック
}
public ResponseEntity<ServiceDTO> fallback(Long id, Throwable t) {
ServiceDTO dto = new ServiceDTO();
dto.setId(9999L);
dto.setName("Error: Service Unavailable");
return ResponseEntity.ok(dto);
}
}
サービスデグレード(Fallback)
サービスデグレードは、提供側のサービスが利用不能な場合に代替処理を提供する機能です。以下はFeignClientを使ってサービスデグレードを行う例です。
@FeignClient(name = "service-provider", fallbackFactory = ServiceProviderFallback.class)
public interface ServiceProvider {
@GetMapping("/service/{id}")
ServiceDTO getService(@PathVariable Long id);
}
@Component
class ServiceProviderFallback implements FallbackFactory<ServiceProvider> {
@Override
public ServiceProvider create(Throwable cause) {
return id -> {
ServiceDTO dto = new ServiceDTO();
dto.setId(-1L);
dto.setName("Fallback Service");
return dto;
};
}
}
HystrixDashboardによるサービスモニタリング
HystrixDashboardは、Hystrixを使用する各サービスの状態をリアルタイムで可視化するためのダッシュボードです。 1. プロジェクトのpom.xmlに以下の依存関係を追加します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
2. アプリケーションクラスに@EnableHystrixDashboardアノテーションを追加します。
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboardApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboardApplication.class, args);
}
}
Turbineによる複数サービスの集約監視
Turbineは、複数のHystrixストリームを集約して一元的に監視できるようにするツールです。 1. Turbineモジュールを作成し、必要な依存関係を追加します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-turbine</artifactId>
</dependency>
2. application.ymlにTurbineの設定を追加します。
turbine: appConfig: service-provider,another-service clusterNameExpression: "'default'"3. Turbineアプリケーションクラスを作成します。
@SpringBootApplication
@EnableTurbine
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
これにより、複数のサービスのHystrixデータを集約して監視することが可能になります。