戦闘のRedisのコア原理および(6)スプリングセッションとセッションのRedisを使用してクロスドメイン分散共有の問題を解決する説明
序文
使用nginxの+ Tomcatの分散負荷分散のために、バランシングアルゴリズムは、ランダムに、体重に応じて、回転中、最も一般的に使用さIP_Hashあります。実行時に1のTomcat、Tomcatに異なる要求nginxのの分布にロードバランシングアルゴリズムの種類に関係なく、異なるコンテナであるので、質問のセッションは、同期または損失が発生していません。
セッション共有プログラムは、実際にTomcatの一般的な用途で多くのことを達成、桟橋や他のサーバは、セッション中に(例えばRedisのよう)(MySQLなど)、データベースまたはキャッシュに保存されている統一されたコンテンツのセッションを共有しています。
この記事では、使用する方法について学習されたのtomcat-Redisのセッション・マネージャのクロスドメイン分散セッションの問題を解決するためのオープンソースプロジェクトを、彼の主なアイデアは、サーブレットコンテナを使用することでのHttpSessionのプラグインは、カスタムの作成と管理を提供します戦略、および設定の仕方によって、デフォルトポリシーを交換してください。Tomcatの-RedisのセッションマネージャのRedisの位置にTomcatの特定の書き込み動作、Tomcatのセッション記憶ポイント内側org.apache.catalina.session.ManagerBase書き換えます:
RedisSessionManagerは継承しorg.apache.catalina.session.ManagerBaseは、追加findSession、createEmptySession、などを除去し、データストレージRedisの上のポインティング操作のセッションを変更して再検索操作の欠失上書きされます。
しかし、使用を通して***のTomcat-Redisのセッションマネージャは、***知っている必要があり、対向配置された又は少し面倒、人工のTomcatの構成を変更するために必要な、コードは次のようにTomcatサーブレットコンテナを連結する必要がある、との分布のためにRedisのクラスタ管理フレームワークは、春のセッションは、ユーザーに本当に透明でセッションを分散管理することができることを良いとは対照的に、個々の良いタイプではありません。
春のセッションは、サーブレットコンテナに依存しませんが、Webアプリケーションレベルを実装するコードは、ユニファイド・ストレージでのRedisでセッションを達成するために、既存のプロジェクトに基づいて直接春のセッションフレームを追加します。Webアプリケーションは、春のフレームワークで開発されている場合は、分散アプリケーションに基づいて変更スタンドアロンのWebアプリケーションをすることができ、既存のプロジェクトの構成のわずかな量を必要と、原因基づいていないサーブレットコンテナは、プロジェクトを移行して自由にすることができ他のコンテナへ。
春のセッションの使用
公式住所:http://projects.spring.io/spring-session/
公式文書住所:http://docs.spring.io/spring-session/docs/1.3.0.RELEASE/reference/html5/
春のセッションは、プログラムのサーブレットのHttpSessionの作成と管理を提供します。スプリングセッション共有問題セッションを解決するために、セッションデータを保存するために、外部のRedisにクラスタ・セッション(セッションクラスタ化)機能のデフォルト値を提供します。
まず、特性
春のセッションは、次の機能を提供します:
- 実装し、ユーザーセッションを管理するためのAPI。
- HttpSessionの - アプリケーションコンテナ(すなわちTomcatの)HttpSessionの中性代替実施形態を可能にします。
- クラスタ化されたセッション - 春のセッションは、クラスタ・セッションはあまり負担になってきていることができ、およびアプリケーションコンテナと金の習慣に結合しません。
- 複数のブラウザセッション - 春のセッション管理ブラウザセッションの単一のインスタンスで複数のユーザーをサポート。
- RESTfulなAPIを - 春のセッションのセッションIDは、ヘッダはRESTfulなAPIを使用できるようにするために提供します。
達成するために2つ、春のセッションケースXMLベースの構成
小さなケースSSMフレームワークに基づきます。
プロジェクト:
(1)基本的な環境のニーズ
春のセッションを使用して行う、そして、すべての最初は、すでに持っているRedisのサーバーをインストールすることです!
(2)プロジェクトの依存関係(依存関係の基本的な使用)を追加
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.3.0.RELEASE</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>biz.paluch.redis</groupId>
<artifactId>lettuce</artifactId>
<version>3.5.0.Final</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
(3)Spring構成ファイルを追加
あなたが必要な依存関係を追加した後、我々は、対応するSpring構成を作成する必要があります。Spring構成は、コンテナ自体のHttpSession実装を置き換えるために春のセッションのサポートHttpSessionの実装を使用してサーブレットフィルタを作成することです。このステップはまた、コアの春のセッションです。
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
- 1
- 2
- 3
- 4
- 5
コード注:
RedisのLettuceConnectionFactoryの例としては、ConnectionFactoryに構成されています。
注意:
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
- 1
ソースコードを見ることができる見るに構成されたデフォルトのRedisのリンク:
だから、あなたは、次の構成として、独自のRedisの設定、変更がある場合:
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory">
<property name="hostName" value="192.168.1.149"/>
<property name="port" value="6379"/>
<property name="password" value="123456"/>
</bean>
- 1
- 2
- 3
- 4
- 5
名「enableRedisKeyspaceNotificationsInitializer」を持つBeanを作成中にエラーが発生しまし上の(5)エラー処理:
春のセッションは、もはやconfigコマンドを実行するために、以下の設定を追加しません
<util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
- 1
あなたが追加しない場合、それは次のエラーを報告します。
Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]:
Invocation of init method failed; nested exception is java.lang.IllegalStateException: Unable to configure Redis to keyspace notifications.
See http://docs.spring.io/spring-session/docs/current/reference/html5/#api-redisoperationssessionrepository-sessiondestroyedevent
Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR unknown command config
- 1
- 2
- 3
- 4
(5)web.xmlで加えDelegatingFilterProxy
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
DelegatingFilterProxyは、名前springSessionRepositoryFilterで豆を見て、フィルタに変換します。各要求はDelegatingFilterProxyを呼び出すために、またspringSessionRepositoryFilterを呼び出します。
(6)スプリングMVCコントローラコードは、テストのために使用されます。
@Controller
@RequestMapping(value = "/spring/session", produces = {ConstString.APP_JSON_UTF_8})
public class SpringSessionDemoController {
@RequestMapping(value = "/setSession.do", method = RequestMethod.GET)
public void setSession(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
String value = request.getParameter("value");
request.getSession().setAttribute(name, value);
}
@RequestMapping(value = "/getSession.do", method = RequestMethod.GET)
public void getInterestPro(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
System.out.println("------" + request.getSession().getAttribute(name));
}
@RequestMapping(value = "/removeSession.do", method = RequestMethod.GET)
public void removeSession(HttpServletRequest request, HttpServletResponse response) {
String name = request.getParameter("name");
request.getSession().removeAttribute(name);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
(7)試験
Redisの内容を表示するツールを使用します。
それだけの価値がされている見つけることができます!そして、そこに有効期限は、ポインティング矢印の位置を確認することができ、故障までの時間は、値を記録しています!
(8)この、使用の春セッションが完了しました!
概要
クロスドメイン分散環境のセッション共有を使用するかどうかの問題、あるいは自分自身のフレームワークを開発するためのオープンソースのフレームワークを使用するために、我々は問題を理解する必要があります。セッションは非常にメモリ集約型のものTomcatコンテナで作成します。我々は同様のフレームワークを書いたときしたがって、我々はそれに注意を払う必要があり、セッションTomcatが私たちのために作成されていない後、私たちは、最初のセッションを取得し、その後、Redisのと、他のストアにアップロードされますが、直接私たち自身の創造のセッションを持っていますそれが不可欠です!