サービスレジストリ(Eureka)の構築
マイクロサービス群の状態を一元管理するレジストリノードを作成します。Maven プロジェクトを起点に、依存関係、ブートストラップクラス、設定ファイルを順に定義します。
1.1 依存関係の定義
pom.xml にレジストリ機能を提供するスターターを追加します。Spring Cloud Greenwich 系と Spring Boot 2.1.x をベースに構成しています。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example.registry</groupId>
<artifactId>discovery-center-node</artifactId>
<version>1.0.0</version>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<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>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2 ブートストラップクラスの作成
レジストリ機能を有効化する起動クラスを実装します。
package com.example.registry;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class RegistryInitializer {
public static void main(String[] args) {
SpringApplication.run(RegistryInitializer.class, args);
}
}
1.3 サーバー設定
application.properties にノードの挙動を定義します。自己登録を無効化し、保護モードをオフにすることで、開発時のサービス検出を安定させます。
spring.application.name=discovery-center
server.port=8765
# 自分自身をレジストリに登録しない
eureka.client.register-with-eureka=false
# レジストリ情報のフェッチを無効化
eureka.client.fetch-registry=false
# 自己保存モードの無効化(テスト環境推奨)
eureka.server.enable-self-preservation=false
# クラスタ参照用アドレス
eureka.client.service-url.defaultZone=http://192.168.1.100:8765/eureka/
1.4 クライアントの準備と検証
レジストリへの接続を確認するため、別の Maven プロジェクトを作成します。pom.xml に Web スタートと Eureka クライアントを追加します。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
クライアント側の application.properties は以下の通り設定します。
spring.application.name=backend-worker-service
server.port=8081
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://192.168.1.100:8765/eureka/
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=worker-node-01
両サービス起動後、Eureka ダッシュボードに `backend-worker-service` が表示されれば、レジストリ側の構築は完了です。
API ゲートウェイ(Spring Cloud Gateway)の構築
登録されたサービスへのリクエストを一元管理するゲートウェイプロキシを構築します。
2.1 依存関係の追加
新規 Maven プロジェクトを作成し、ゲートウェイコアと Eureka クライアントを結合します。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.2.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
2.2 ルーティングとゲートウェイ設定
application.properties にゲートウェイの基盤設定と自動ルーティング機能を記述します。
spring.application.name=api-routing-gateway
server.port=8082
server.tomcat.uri-encoding=UTF-8
# Eureka 登録情報に基づく自動ルーティングの有効化
spring.cloud.gateway.discovery.locator.enabled=true
# サービス ID を小文字で正規化
spring.cloud.gateway.discovery.locator.lower-case-service-id=true
2.3 動作検証
ゲートウェイを起動し、HTTP クライアントから `http://localhost:8082/backend-worker-service/` へアクセスします。Eureka 上のクライアントサービスにリクエストが正しくプロキシされ、レスポンスが返却されれば構成は正常に動作しています。ゲートウェイはパスのプレフィックス変換や認証フィルターなどを追加することで、本番環境向けのルーティングルールに拡張可能です。