Spring Cloud EurekaとGatewayによるサービスディスカバリとAPIゲートウェイ構築

Eurekaサーバの構築

EurekaはNetflix OSSベースのサービスディスカバリコンポーネントです。まず、サーバ側の設定から進めます。

プロジェクト作成と依存関係

Mavenプロジェクトを新規作成し、pom.xmlに以下を記述します。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
    <relativePath/>
</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-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>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

起動クラスの実装

@EnableEurekaServer
@SpringBootApplication
public class RegistryBootstrap {
    public static void main(String[] cmdArgs) {
        SpringApplication.run(RegistryBootstrap.class, cmdArgs);
    }
}

プロパティ設定

application.propertiesにEurekaサーバの動作を制御する設定を記述します。

spring.application.name=registry-center
server.port=8761

# 自己登録を無効化(単一ノード構成の場合)
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

# 開発時の保護モードを無効化
eureka.server.enable-self-preservation=false

# クラスタリングしない場合は自身を指定
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

クライアントサービスの登録

登録確認用のマイクロサービスを作成します。クライアント側のpom.xmlは以下の通りです。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
    <relativePath/>
</parent>

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version>
</properties>

<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>

<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>

クライアント側のapplication.properties

spring.application.name=demo-service
server.port=8080

eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

# IPアドレス優先表示、インスタンス識別子のカスタマイズ
eureka.instance.prefer-ip-address=true
eureka.instance.instance-id=${spring.application.name}:${server.port}

両方のサービスを起動後、http://localhost:8761にアクセスすると、クライアントがEurekaダッシュボードに表示されます。

Spring Cloud Gatewayの構築

GatewayはSpring Cloudの公式推奨ルーターで、Eurekaと連携して動的ルーティングを実現します。

プロジェクト設定

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
    <relativePath/>
</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>

ゲートウェイ設定

spring.application.name=api-gateway
server.port=9000

# Eureka連携による自動ルート検出
spring.cloud.gateway.discovery.locator.enabled=true
spring.cloud.gateway.discovery.locator.lower-case-service-id=true

# 明示的なルート定義(オプション)
spring.cloud.gateway.routes[0].id=demo-route
spring.cloud.gateway.routes[0].uri=lb://demo-service
spring.cloud.gateway.routes[0].predicates[0]=Path=/api/**

動作確認

Gateway起動後、以下のエンドポイントで確認できます。

  • Eurekaダッシュボード: http://localhost:8761
  • 直接アクセス: http://localhost:8080/api/hello
  • Gateway経由アクセス: http://localhost:9000/api/hello

自動検出を有効にしている場合、サービス名を小文字で指定したパスでもアクセス可能です:http://localhost:9000/demo-service/api/hello

タグ: Spring Cloud Eureka Spring Cloud Gateway サービスディスカバリ APIゲートウェイ マイクロサービス

9月10日 10:36 投稿