SpringBootアプリケーションの分散セッション
3785 ワード
SpringBootアプリケーションシリーズの記事 SpringBootアプリケーションの構成センター SpringBootアプリケーションの分散セッション SpringBootアプリケーションの分散インデックス SpringBootアプリケーションの分散キャッシュ SpringBootアプリケーションのメッセージキュー SpringBootアプリケーションのELK シーケンス
本文は主にspring bootアプリケーションで分散セッションを構築する方法について述べる.分散アプリケーションの場合、ユーザのセッション管理には、通常、Session Stick、Sessionレプリケーション、Session集中管理、Cookieベース管理の4つの方法がある.それぞれコメント: Session Stick
あるユーザーのセッションとあるサーバーをバインドしたい、少し結合する必要があります. Sessionレプリケーション 各サーバにはすべてのセッション情報があり、セッションの同期に時間がかかります.また、各サーバにフルデータがあるのも問題ですセッション集中管理 個別のセッション・サービスでは、同期は必要ありませんが、ネットワーク・オーバーヘッドが発生し、単一の問題を処理する必要があります. Cookie管理 に基づく
セッションデータをクッキーに配置し,ネットワーク負荷を増大させ,またセキュリティの問題もある.本文は主に集中式Sessionの方面に注目して、その実現は主に2つの方案があって、1つは容器関連で、例えばTomcatに基づくtomcat-redis-session-managerとJettyに基づくjetty-session-redisなど;もう1つは容器のデカップリングであり,今日集積されるSpring−Sessionである.
redisクラスタの構成
私が前に書いた文章「dockerはredisクラスタを構築する」を参考にしてください.
新規プロジェクト
アプリケーションを構成します.properties
Controllerのテスト
開始
アクセスhttp://localhost:8080/session/uid
redisの表示
に相当
expirations:14533639380000は、セッションが1453639380000の時点で削除されることを示します.1800は1800秒、すなわち30分を表し、デフォルトでは30分が期限切れになります.
セッションオブジェクトを見て
30分後に期限が切れました
Webページを再リフレッシュして新しいセッションを取得
に質問
設定したtimeoutは有効ではなく、1800秒を基準にしています.経験書は、このように設定しなければなりません.
本文は主にspring bootアプリケーションで分散セッションを構築する方法について述べる.分散アプリケーションの場合、ユーザのセッション管理には、通常、Session Stick、Sessionレプリケーション、Session集中管理、Cookieベース管理の4つの方法がある.それぞれコメント:
あるユーザーのセッションとあるサーバーをバインドしたい、少し結合する必要があります.
セッションデータをクッキーに配置し,ネットワーク負荷を増大させ,またセキュリティの問題もある.本文は主に集中式Sessionの方面に注目して、その実現は主に2つの方案があって、1つは容器関連で、例えばTomcatに基づくtomcat-redis-session-managerとJettyに基づくjetty-session-redisなど;もう1つは容器のデカップリングであり,今日集積されるSpring−Sessionである.
redisクラスタの構成
私が前に書いた文章「dockerはredisクラスタを構築する」を参考にしてください.
新規プロジェクト
アプリケーションを構成します.properties
#1.3.0.RELEASE
server.session.timeout=10
#server.session-timeout=10 #1.2.7.RELEASE
spring.redis.host=192.168.99.100 # docker machine default ip
#spring.redis.password=secret
spring.redis.port=6379
Controllerのテスト
@RestController
@RequestMapping("/session")
public class HelloController {
@RequestMapping("/uid")
String uid(HttpSession session) {
UUID uid = (UUID) session.getAttribute("uid");
if (uid == null) {
uid = UUID.randomUUID();
}
session.setAttribute("uid", uid);
return session.getId();
}
}
開始
アクセスhttp://localhost:8080/session/uid
d1b1cc0c-519e-431a-973c-6c742a014660
redisの表示
docker@default:~$ docker exec -it redis-master /bin/bash
root@86784a615b3d:/data# redis-cli keys '*'
1) "spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660"
2) "spring:session:expirations:1453639380000"
に相当
SADD spring:session:expirations:
EXPIRE spring:session:expirations: 1800
expirations:14533639380000は、セッションが1453639380000の時点で削除されることを示します.1800は1800秒、すなわち30分を表し、デフォルトでは30分が期限切れになります.
セッションオブジェクトを見て
127.0.0.1:6379> hkeys spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660
1) "sessionAttr:uid"
2) "lastAccessedTime"
3) "maxInactiveInterval"
4) "creationTime"
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 sessionAttr:uid
"\xac\xed\x00\x05sr\x00\x0ejava.util.UUID\xbc\x99\x03\xf7\x98m\x85/\x02\x00\x02J\x00\x0cleastSigBitsJ\x00\x0bmostSigBitsxp\xa0E\xe3\x1d\xf9K\xecW6\xcf\xbc\xfbU\x13M\x88"
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 lastAccessedTime
"\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f#\xdf\x02\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x01Rs\x8d\x12b"
30分後に期限が切れました
127.0.0.1:6379> hget spring:session:sessions:d1b1cc0c-519e-431a-973c-6c742a014660 creationTime --raw
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> keys *
(empty list or set)
Webページを再リフレッシュして新しいセッションを取得
3ed21473-c5ee-41e1-b64e-35b0737c0365
に質問
設定したtimeoutは有効ではなく、1800秒を基準にしています.経験書は、このように設定しなければなりません.
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60) //1