Spring BootとSpring Cloudの統合:基本実践入門

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が自動的にリクエストを分散します。

タグ: SpringBoot SpringCloud Eureka Ribbon マイクロサービス

7月29日 01:55 投稿