Spring Cloud 環境における Eureka サーバーとゲートウェイの実装ガイド

サービスレジストリ(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 上のクライアントサービスにリクエストが正しくプロキシされ、レスポンスが返却されれば構成は正常に動作しています。ゲートウェイはパスのプレフィックス変換や認証フィルターなどを追加することで、本番環境向けのルーティングルールに拡張可能です。

タグ: Spring-Cloud Eureka spring-cloud-gateway Microservices service-discovery

10月11日 16:08 投稿