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