Spring Session
2016年07月24日 00時24分23秒
ELB、EC2、WildFly8とSpringフレームワークを使っているWebアプリケーションでセッションレプリケーション機能を実装しなければいけなくなった。
そもそもセッションレプリケーションを実現する為にはどうすればいいのか調べてみたところ、
何個か方法はあるようだが、
一番簡単に実現できそうだったのが、比較的新しい技術のSpring Session。
WildFlyやインフラ周りには一切手を加えず、JAVAソース、設定ファイルの修正だけで実現できる模様。
※セッション情報の保存先であるRedisサーバーの容易は必要(今回は保存先にRedisを採用)
※Spring Sessionを検索すると実装方法を紹介してくれるサイトは存在するが、
「Spring Session」のことしか書いてない。
当然といえば当然だが、Redisに接続できる状態でなければ話にならない。
Redisの使用方法についてはここら辺を参考に
http://tm8r.hateblo.jp/entry/20120329/1333033094
とりあえずセッション情報の保存先であるRedisについては、AWSのElastiCacheを使用。
で、ソースの修正については下記サイトを参考+試行錯誤。
参考サイト:http://qiita.com/uich/items/cd5d63c12f1d342fc65c
※Spring Sessionの実装方法を検索すると、Spring Bootでの例が多い
今回はSpring Boot使っていないので、設定ファイル系は試行錯誤が必要だった
参考サイトと今回の修正での差分は下記の通り
【pom.xml】
gradleを使っていたので、build.gradleにspring-session-data-redisの依存関係を記載
【web.xml】
参考サイトの記述だけだとエラーになったので下記を記載
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ここから独自に追加 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
※ContextLoaderListenerを追加すると、WEB-INFの下にapplicationContext.xmlがないとエラーになる。
なので、classpath:applicationContext.xmlを指定してあげる。
【RedisHttpSessionConfig】
基本的には参考サイトと同様だが、一部問題が発生した為、下記の通り修正
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class RedisHttpSessionConfig {
@Resource
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisConnectionFactory connectionFactory() {
return redisConnectionFactory;
}
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
}
※ElastiCacheではconfigureRedisAction()が必要らしいので追加
※参考サイトには記載されているhttpSessionStrategy()を実装すると、リクエストの度にセッションIDが変わってしまい、レプリケーションどころではなくなってしまった。原因はよく分からないがhttpSessionStrategy()自体を削除して問題解決。
以上でRedisにセッション情報が保存され、ELBに紐付いているEC2(WildFly)間でセッションが共有されるようになった。
※仕事場の情報は持ち出せないので記憶を頼りに自宅で記載してます。
記載ミスがあったらゴメンナサイ。
そもそもセッションレプリケーションを実現する為にはどうすればいいのか調べてみたところ、
何個か方法はあるようだが、
一番簡単に実現できそうだったのが、比較的新しい技術のSpring Session。
WildFlyやインフラ周りには一切手を加えず、JAVAソース、設定ファイルの修正だけで実現できる模様。
※セッション情報の保存先であるRedisサーバーの容易は必要(今回は保存先にRedisを採用)
※Spring Sessionを検索すると実装方法を紹介してくれるサイトは存在するが、
「Spring Session」のことしか書いてない。
当然といえば当然だが、Redisに接続できる状態でなければ話にならない。
Redisの使用方法についてはここら辺を参考に
http://tm8r.hateblo.jp/entry/20120329/1333033094
とりあえずセッション情報の保存先であるRedisについては、AWSのElastiCacheを使用。
で、ソースの修正については下記サイトを参考+試行錯誤。
参考サイト:http://qiita.com/uich/items/cd5d63c12f1d342fc65c
※Spring Sessionの実装方法を検索すると、Spring Bootでの例が多い
今回はSpring Boot使っていないので、設定ファイル系は試行錯誤が必要だった
参考サイトと今回の修正での差分は下記の通り
【pom.xml】
gradleを使っていたので、build.gradleにspring-session-data-redisの依存関係を記載
【web.xml】
参考サイトの記述だけだとエラーになったので下記を記載
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ここから独自に追加 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
※ContextLoaderListenerを追加すると、WEB-INFの下にapplicationContext.xmlがないとエラーになる。
なので、classpath:applicationContext.xmlを指定してあげる。
【RedisHttpSessionConfig】
基本的には参考サイトと同様だが、一部問題が発生した為、下記の通り修正
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class RedisHttpSessionConfig {
@Resource
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisConnectionFactory connectionFactory() {
return redisConnectionFactory;
}
@Bean
public static ConfigureRedisAction configureRedisAction() {
return ConfigureRedisAction.NO_OP;
}
}
※ElastiCacheではconfigureRedisAction()が必要らしいので追加
※参考サイトには記載されているhttpSessionStrategy()を実装すると、リクエストの度にセッションIDが変わってしまい、レプリケーションどころではなくなってしまった。原因はよく分からないがhttpSessionStrategy()自体を削除して問題解決。
以上でRedisにセッション情報が保存され、ELBに紐付いているEC2(WildFly)間でセッションが共有されるようになった。
※仕事場の情報は持ち出せないので記憶を頼りに自宅で記載してます。
記載ミスがあったらゴメンナサイ。
PR
Comment