#chiroito ’s blog

Java を中心とした趣味の技術について

Infinispan と Spring Session を使ったセッションレプリケーション

環境

  • SpringBoot 2.3.0
  • Infinispan 10.1.7

サンプルソースはこちら

GitHub - chiroito/spring-session-sample

手順

Java EE がインフラの設定だけで実現できることと比べ、SpringBoot はアプリ側を少し書き換えて設定しないと行けません。

手順は以下のとおりです。

  1. セッションを使ったアプリを書く
  2. プロジェクトに依存関係を追加
  3. アプリケーションにアノテーションを追加
  4. アプリに Infinispan へ接続する設定を追加

0. Infinispan を起動

今回は 2 ノードの Infinispan を起動します。 ダウンロードした Infinispan の zip を 2 回別の名前で解凍します。 普通に実行すると使用しているポートが被ってしまいます。それを回避するため引数に-Dinfinispan.socket.binding.port-offsetを付与します。それぞれのディレクトリで次の様に実行します。

1 つ目

bin\server.bat -Dinfinispan.node.name=nodeA

2 つ目

bin\server.bat -Dinfinispan.node.name=nodeB -Dinfinispan.socket.binding.port-offset=100

1. セッションを使ったアプリを書く

アプリはセッションを使ったものを普通に書くだけです。Infinispan にセッションをレプリケーションするかどうかで特に違いはありません。以下はセッション情報となるカウンターとそれを使ったエンドポイントのアプリです。

Counter.java

import org.springframework.stereotype.Component;
import org.springframework.web.context.annotation.SessionScope;

import java.io.Serializable;

@SessionScope
@Component
public class Counter implements Serializable {

    private static final long serialVersionUID = 1L;

    private int value;

    public int getValue() {
        return value;
    }

    public void countUp(){
        this.value++;
    }
}

CountEndpoint.java

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/session")
public class CountEndpoint {

    private final Counter counter;

    public CountEndpoint(Counter counter) {
        this.counter = counter;
    }

    @GetMapping("/count")
    public String count(){

        counter.countUp();
        return "counter=" + counter.getValue();
    }

    @GetMapping("/read")
    public String read(){

        return "counter=" + counter.getValue();
    }
}

2. プロジェクトに依存関係を追加

プロジェクトの依存関係に Spring Session の実装への依存関係を追加しないといけません。今回はセッションの格納先に Infinispan を使用するので Infinispan への依存関係を追加します。

<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-bom</artifactId>
    <version>10.1.7.Final</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-spring-boot-starter</artifactId>
    <version>2.2.4.Final</version>
</dependency>
<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-spring-boot-starter-remote</artifactId>
    <version>2.2.4.Final</version>
</dependency>

3. アプリケーションにアノテーションを追加

キャッシュを使えるようにするのと Infinispan のクラスタにセッションを入れられるようにするため、SpringBootのアプリケーションには 2 つのアノテーションを追加します。追加するアノテーションは@EnableCaching@EnableInfinispanRemoteHttpSessionです。

@EnableCaching
@EnableInfinispanRemoteHttpSession
@SpringBootApplication
public class InfinispanSessionApplication {

    public static void main(String[] args) {
        SpringApplication.run(InfinispanSessionApplication.class, args);
    }
}

実行

最後に実行しましょう。SpringBoot を通常どおり実行するだけです。