分散セッションスキーム
セッションとは
セッションとは何ですか?ブラウザにはCookieがあります。このCookieは一定期間存在します。その後、リクエストが送信されるたびに、特別なjsessionid Cookieが送信されます。これに基づいて、対応するセッションドメインをサーバー側で維持できます。その中に配置することができます。儿数ダウンロード。子データ。
通常、ブラウザを閉じずにCookieが存在する限り、対応するセッションは存在しますが、Cookieがなくなると、セッションは失われます。ショッピングカートなどによく見られ、ログイン状態の保存などにも見られます。
ただし、このようなセッションをモノリシックシステムで再生することは問題ありませんが、分散システムの場合、非常に多くのサービスのセッション状態はどこで維持されますか?
実際、多くの方法がありますが、2つの一般的で一般的に使用される方法があります
tomcat + redis
これは実際には非常に便利です。つまり、セッションを使用するためのコードは以前と同じであるか、tomcatのネイティブセッションサポートに基づいており、Tomcat RedisSessionManagerと呼ばれるものが使用されるため、デプロイするすべてのtomcatが格納されます。 redis。canのセッションデータ。
Tomcat構成ファイルで構成します
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="{redis.host}"
port="{redis.port}"
database="{redis.dbnum}"
maxInactiveInterval="60"/>
上記のような構成を行うだけで、RedisSessionManagerを使用しているかどうかを確認してから、redisのホストとポートを指定できます。
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
sentinelMaster="mymaster"
sentinels="<sentinel1-ip>:26379,<sentinel2-ip>:26379,<sentinel3-ip>:26379"
maxInactiveInterval="60"/>
上記の方法を使用して、redisセンチネルでサポートされているredis高可用性クラスターに基づいてセッションデータを保存することもできます。これらはすべて問題ありません。
ただし、セッションからデータを取得します。実際、tomcatはredisからセッションを取得します。
しかし問題は、それがWebコンテナに大きく依存していることです。
春のセッション+ redis
分散セッションはTomcatで再結合されます。Webコンテナを桟橋に移行したい場合、すべての桟橋を再度設定しますか?
上記のtomcat + redisメソッドは使いやすいのですが、Webコンテナーに大きく依存し、特にテクノロジースタックを変更した場合、コードを他のWebコンテナーに移植するのは簡単ではありませんか?たとえば、SpringCloudまたはSpringBootに置き換えられます。それについて考えなければなりません。
したがって、より優れたワンストップソリューションは、Java、Springに基づいています。People Springは基本的に、使用する必要のあるフレームワークのほとんどをパックし、spirngクラウドはマイクロサービスとして使用され、Spring Bootはスキャフォールディングとして使用されるため、spingセッションを使用することをお勧めします。
pom.xml
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
春の構成ファイル
<bean id="redisHttpSessionConfiguration"
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<property name="maxInactiveIntervalInSeconds" value="600"/>
</bean>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100" />
<property name="maxIdle" value="10" />
</bean>
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
<property name="hostName" value="${redis_hostname}"/>
<property name="port" value="${redis_port}"/>
<property name="password" value="${redis_pwd}" />
<property name="timeout" value="3000"/>
<property name="usePool" value="true"/>
<property name="poolConfig" ref="jedisPoolConfig"/>
</bean>
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>
サンプルコード
@Controller
@RequestMapping("/test")
public class TestController {
@RequestMapping("/putIntoSession")
@ResponseBody
public String putIntoSession(HttpServletRequest request, String username){
request.getSession().setAttribute("name", “leo”);
return "ok";
}
@RequestMapping("/getFromSession")
@ResponseBody
public String getFromSession(HttpServletRequest request, Model model){
String name = request.getSession().getAttribute("name");
return name;
}
}
上記のコードは問題ありません。redisに基づいてセッションデータを保存するようにspingセッションを構成してから、Springセッションフィルターを構成します。この場合、セッション関連の操作はSpringセッションによって処理されます。次に、コードでネイティブセッション操作を使用します。これは、スプリングセッションに基づいてredisから直接データを取得することです。
分散セッションを実装する方法はたくさんあります。2つの一般的な方法について説明しました。Tomcat+ redisは、初期にはより一般的に使用されていました。近年、tomcatへの再結合は春のセッションを通じて実装されています。