ホームページ  >  記事  >  Java  >  SpringBoot が Spring Session を統合して分散セッションを実装する方法

SpringBoot が Spring Session を統合して分散セッションを実装する方法

WBOY
WBOY転載
2023-05-13 13:52:06933ブラウズ

Spring は、分散セッションを処理するためのソリューションである Spring-Session を提供します。 Spring-Session は、Redis、MongoDB、MySQL などの共通ストレージのサポートを提供します。Spring-Session は、HttpSession との透過的な統合を提供します。つまり、開発者は Spring-Session でサポートされる実装を使用して、HttpSession を Spring-Session に切り替えることができます。

1. 構成と開発

ステップ 1. 依存関係の追加

Redis と Spring-Session の依存関係を pom.xml ファイルに追加します。プロジェクトバッグ。

        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

ステップ 2. Redis と Spring-Session の永続化メソッドを構成する

作者は、SpringBoot 構成ファイルとして application.properties を使用することに慣れています。または、application.properties を使用することもできます。 .yml を設定に追加します。 application.properties 構成ファイルに次の構成を追加します。

# 配置 Redis 服务器地址(此处是一个虚假地址)
spring.redis.host=10.211.12.6
# 配置 Redis 端口
spring.redis.port=6379
# 配置 Redis 密码
spring.redis.password=123456
# 其他 Redis 的配置还有很多,例如 Redis 连接池的配置,此处暂时只配置上述几项关键点
# spring session 配置
spring.session.store-type=redis

ステップ 3. JSON シリアル化メカニズムを使用する

Spring-Session はデフォルトで JDK シリアル化メカニズムを使用します。これには、クラスが Serializable インターフェイスとシリアル化を実装する必要があります。はバイナリバイトです 配列は理解するのが難しいです。 JSON シリアル化メカニズムを使用すると、シリアル化された文字列が理解しやすくなります。

package com.test.conf;

import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.RedisSerializer;

// spring session 使用 json 序列化机制
@Configuration
public class SessionConfig {
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        return new GenericFastJsonRedisSerializer();
    }
}

#ステップ 4. @EnableRedisHttpSession アノテーションを SpringBoot スタートアップ クラスに追加して Spring-Session を開きます

package com.test;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@SpringBootApplication
// 开启 Spring-Session
@EnableRedisHttpSession
// @EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800, redisNamespace = "test:session")
public class TestSessionAppApplication {

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

@EnableRedisHttpSession アノテーションを追加して Spring-Session を開きます。アノテーションには個別に設定できるいくつかのパラメータがあり、その中で、maxInactiveIntervalInSeconds はセッションの有効期限を表し、デフォルト値は 30 分です。redisNamespace は、セッションが Redis に保存されるときの名前空間、つまり、保存されたセッションのキー名のプレフィックスを表します。 Redis では、デフォルト値は "spring :session" ですが、実際のプロジェクトでは、リソースを節約するために異なるシステムが同じ Redis を使用する場合があります。異なるシステムのセッションを区別するために、システムごとに個別の名前空間を設定できます。

2. テスト

2.1 コントローラー層の書き込みテストデモ

    @RequestMapping(value = "testSession")
    public String testSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        log.info("sessionId:[{}]", session.getId());
        session.setAttribute("name", "Lucy");
        session.setAttribute("age", "20");
        return session.getAttribute("name").toString();
    }

2.2 テストプロセス

同時に、別のポート 9001 で SpringBoot プロジェクトを開始します。 /9002. ローカル コンピューター上の分散クラスター内のさまざまなノードをシミュレートします。 Google Chrome を使用してリンク http://localhost:9001/testSession を開くと、サーバーは次のようなログを出力します。

sessionId:[5c417104-4f6d-430d-b569-cbc1e19cdf02]

クライアントは Redis サーバーにログインし、Redis のセッション コンテンツを表示します。

[testuser@vm ~]$ redis-cli -h 10.211.12.6 -p 6379
10.211.12.6:6379> auth 123456
OK
10.211.12.6:6379> keys *
1) "spring:session:expirations:1658127780000"
2) "spring:session:sessions:5c417104-4f6d-430d-b569-cbc1e19cdf02"
3) "spring:session:sessions:expires:5c417104-4f6d-430d-b569-cbc1e19cdf02"

Redis は、RedisSession ごとに 3 つのキーと値のペア (以下、キーと値と呼びます) を保存します。

  • 最初のキーと値には、この RedisSession の ID が保存されます。 Session. は、Set タイプの Redis データ構造です。このキーの最後の値 1658127780000 は、次の分にロールアウトされたセッション有効期限の瞬間に基づいて計算されたタイムスタンプです。

  • 2 番目の Key-Value はセッションの詳細情報を格納するために使用され、セッションの最新アクセス時刻 (lastAccessedTime) とセッションの最新アクセス時刻 (lastAccessedTime) を含むハッシュ型 Redis データ構造です。有効期限間隔 (maxInactiveInterval)、デフォルトは 30 分、ここに保存される秒の値)、作成時間 (creationTime)、sessionAttr など。

  • 3 番目のキーと値は、Redis でのセッションの有効期限を表すために使用され、文字列型の Redis データ構造です。この Key-Value には有用なデータは格納されず、セッションの有効期限を示すためにのみ設定されます。 Redis でのこのキーの有効期限は、セッションの有効期限間隔です。ttl コマンドを使用すると、キーの有効期限、つまりセッションの有効期限を表示できます。

このテスト中の、Redis 内のデータの詳細は次のとおりです。

10.211.12.6:6379> type spring:session:expirations:1658127780000
set
10.211.12.6:6379> smembers spring:session:expirations:1658127780000
1) "\"expires:5c417104-4f6d-430d-b569-cbc1e19cdf02\""
10.211.12.6:6379>
10.211.12.6:6379> type spring:session:sessions:5c417104-4f6d-430d-b569-cbc1e19cdf02
hash
10.211.12.6:6379> hgetall spring:session:sessions:5c417104-4f6d-430d-b569-cbc1e19cdf02
 1) "lastAccessedTime"
 2) "1658125969794"
 3) "maxInactiveInterval"
 4) "1800"
 5) "creationTime"
 6) "1658125925139"
 7) "sessionAttr:age"
 8) "\"20\""
 9) "sessionAttr:name"
10) "\"Lucy\""
10.211.12.6:6379>
10.211.12.6:6379> type spring:session:sessions:expires:5c417104-4f6d-430d-b569-cbc1e19cdf02
string
10.211.12.6:6379> get spring:session:sessions:expires:5c417104-4f6d-430d-b569-cbc1e19cdf02
""
10.201.42.26:6379>

ブラウザの Cookie を確認する この時点では、次の図に示すように、ブラウザにはすでに Cookie が使用されています。

SpringBoot怎么整合Spring Session实现分布式会话

ブラウザを更新すると、バックエンドによって出力される SessionId は変更されず、Redis のセッション コンテンツは追加されず、ブラウザは通常どおりコンテンツを返します。これは、このノードのセッション動作が正常であることを意味します。

同じブラウザで、別のテスト ポート リンク http://localhost:9002/testSession を開きます。ブラウザは自動的に Cookie を運びます。バックエンドの印刷コンテンツと Redis コンテンツは同じです (有効期限はが更新されました)。これは、クラスター セッションがノード間で共有されていることを示します。

3. Spring-Session の欠点

Spring-Session は、クラスター セッションのサポートを簡単にする、使いやすく、ほぼ透過的な統合方法を提供しますが、実際、Spring-Session にはいくつかの欠陥があります。 。

  • セッションの有効期限切れイベントと破棄イベントをリアルタイムで公開することは不可能です。

  • シリアル化メソッドは、一部の特定のタイプではサポートされていない可能性があります。セッション。あまり良くありません;

  • Redis はセッションを保存するために 3 つのキー値を必要とするため、若干多くのスペースを必要とします;

  • In高い同時実行性のシナリオ。セッションは CAS (比較および設定) 操作ではないため、いくつかの同時実行性の問題 (軽微な問題) が発生する可能性があります。

Spring-Session にはいくつかの欠点がありますが、全体的にはまだ非常に使いやすいです。さらに、一連のフィルターを自分で作成して Spring-Session の欠点を最適化し、分散セッションを実装することもできます。

以上がSpringBoot が Spring Session を統合して分散セッションを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。