Spring Cloudの概要
Spring Cloudは分散システム向けの包括的ソリューションです。設定管理、サービスディスカバリ、サーキットブレーカーなどの分散システム機能を迅速に構築するためのツールセットを提供します。
主要コンポーネント
- サービスディスカバリ:Netflix Eureka
- クライアント側負荷分散:Netflix Ribbon
- サーキットブレーカー:Netflix Hystrix
- APIゲートウェイ:Netflix Zuul
- 分散設定管理:Spring Cloud Config
Eurekaサーバーの構築
サービスレジストリとして機能するEurekaサーバーを設定します。
依存関係
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
設定ファイル
server:
port: 8761
eureka:
instance:
hostname: registry-host
client:
register-with-eureka: false
fetch-registry: false
service-url:
default-zone: http://localhost:8761/eureka/
メインクラス
@EnableEurekaServer
@SpringBootApplication
public class RegistryApplication {
public static void main(String[] args) {
SpringApplication.run(RegistryApplication.class, args);
}
}
サービスプロバイダーの実装
Eurekaに登録するサービスインスタンスを作成します。
設定例
server:
port: 8002
spring:
application:
name: product-service
eureka:
client:
service-url:
default-zone: http://localhost:8761/eureka/
コントローラー実装
@RestController
public class ProductController {
@Value("${server.port}")
private String portNumber;
@GetMapping("/product")
public String fetchProduct() {
return "Product from port: " + portNumber;
}
}
サービスコンシューマーの実装
サービスを検索し利用するコンシューマーアプリケーションです。
RestTemplate設定
@EnableDiscoveryClient
@SpringBootApplication
public class ClientApplication {
@Bean
@LoadBalanced
public RestTemplate serviceClient() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
サービス呼び出し例
@RestController
public class OrderController {
@Autowired
private RestTemplate serviceClient;
@GetMapping("/order")
public String createOrder(String user) {
String product = serviceClient.getForObject(
"http://PRODUCT-SERVICE/product",
String.class
);
return user + " ordered " + product;
}
}
負荷分散の動作
複数のサービスインスタンスを起動すると、Ribbonが自動的にリクエストを分散します。