전투의 레디 스의 핵심 원칙 (6) 봄 세션 및 세션 레디 스 해결할 도메인 간 분산 된 주식 발행을 사용하여 설명
머리말
사용의 Nginx + 톰캣 분산로드 밸런싱 밸런싱 알고리즘은 무작위로 중량에있어서, 회전에 가장 일반적으로 사용 IP_Hash이다. 부하로 인해 런타임에 하나의 톰캣 톰캣에 다른 요청 Nginx에의 분포에, 알고리즘의 균형을 아무리 유형은 다른 용기, 그래서 질문 세션 동기화 또는 손실이 발생하지 않습니다.
세션 공유 프로그램은 실제로 톰캣, 부두 및 기타 서버가 세션에서 통합 (MySQL과 같은) 데이터베이스에 저장된 콘텐츠 나 (예 레디 스 등) 캐시의 세션을 공유 제공하는 일반적인 사용하는 것입니다 많이 달성.
이 문서는 사용하는 방법에 대해 알게 된 바람둥이 - 레디 스 세션 매니저 도메인 간 분산 세션의 문제를 해결하기 위해 오픈 소스 프로젝트를 자신의 주요 아이디어는 서블릿 컨테이너는 플러그인, 사용자 정의 생성과의 HttpSession의 관리 기능을 제공합니다 사용하는 것입니다 전략 및 구성의 방법으로 기본 정책을 대체합니다. 바람둥이 - 레디 스 세션 매니저는 톰캣 특히 쓰기 작업의 내부 org.apache.catalina.session.ManagerBase 다시, 레디 스의 위치에 바람둥이 세션 저장 포인트 :
RedisSessionManager 상속과 org.apache.catalina.session.ManagerBase 추가, findSession, createEmptySession, 등을 제거를 무시하고, 데이터 저장 레디 스의 포인팅 작업의 세션 변경 검색 작업의 삭제.
그러나, 사용을 통해 *** 바람둥이 - 레디 스 세션 매니저는 *** 알아야한다, 반대 배열 또는 조금 성가신, 인위적으로 톰캣의 구성을 수정하는 데 필요한 코드는 같은 톰캣 서블릿 컨테이너를 결합 할 필요가, 그리고 유통에 대한 레디 스 클러스터 관리 프레임 워크 봄 세션은 사용자가 진정으로 투명이 세션을 분산 관리 할 수있는 좋은 반대로 개인의 좋은 타입이다.
봄 세션은 서블릿 컨테이너에 의존하지 않고, 웹 응용 프로그램 수준을 구현하는 코드는 통합 스토리지에 레디 스에서 세션을 달성하기 위해 기존 프로젝트를 기준으로 직접 봄 세션 프레임을 추가합니다. 웹 애플리케이션은 스프링 프레임 워크에서 개발하는 경우, 분산 응용 프로그램에 따라 변경된 독립형 웹 응용 프로그램을 할 수 있습니다 기존 프로젝트의 구성의 소량을 필요로 인해 기반으로하지 서블릿 컨테이너는,이 프로젝트를 마이그레이션 자유롭게 할 수있다 다른 용기에 관한 것이다.
봄 세션 사용
공식 주소 : http://projects.spring.io/spring-session/
공식 문서 주소 : http://docs.spring.io/spring-session/docs/1.3.0.RELEASE/reference/html5/
봄 세션은 프로그램의 서블릿의 HttpSession 생성 및 관리 기능을 제공합니다. 봄 세션 공유 문제 세션을 해결하기 위해, 세션 데이터를 저장하는 외부 레디 스에 클러스터 세션 (세션 클러스터) 함수의 기본값을 제공합니다.
첫째, 특성
봄 세션은 다음과 같은 기능을 제공합니다 :
- 구현 및 사용자 세션 관리를위한 API;
- 의 HttpSession은 - 애플리케이션 컨테이너 (즉 톰캣)의 HttpSession 중성 다른 실시 예를 허용;
- 클러스터 세션 - 봄 세션은 클러스터 세션이 덜 부담이되었다 허용하고, 응용 프로그램 컨테이너와 골드 습관에 결합하지 않는다.
- 여러 개의 브라우저 세션 - 브라우저 세션의 단일 인스턴스에서 봄 세션 관리 지원 다수의 사용자.
- 편안하고 API를 - 봄 세션 세션 ID는 헤더의 RESTful API를 사용할 수 있도록 제공했다.
두, 봄 세션 케이스 XML 기반 구성을 달성하기 위해
작은 경우 SSM 프레임 워크를 기반으로.
프로젝트 :
(1) 기본적인 환경 요구
봄 세션을 사용하여 수행 한 후, 우선 이미 가지고 레디 스 서버를 설치하는 것입니다!
(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
- 이
- 삼
- 4
- 5
- 6
- (7)
- 8
- 9
- (10)
- (11)
(3) 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
- 이
- 삼
- 4
- 5
코드 참고 :
레디 스 LettuceConnectionFactory로서는 ConnectionFactory를 구성한다.
참고 :
<bean class="org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory"/>
- 1
볼 수있는 소스 코드를보기, 기본 레디 스 링크하는 구성 :
그래서, 당신은 다음과 같은 구성으로 자신의 레디 스 구성, 변경이있는 경우 :
<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
- 이
- 삼
- 4
- 5
이름이 'enableRedisKeyspaceNotificationsInitializer'와 콩을 만드는 오류에 (5) 오류 처리 :
더 이상 봄 세션에 대한 다음과 같은 구성을 추가하지 설정 명령을 실행
<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
- 이
- 삼
- 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
- 이
- 삼
- 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
- 이
- 삼
- 4
- 5
- 6
- (7)
- 8
- 9
- (10)
- (11)
- (12)
- (13)
- (14)
- (15)
- (16)
- (17)
- (18)
- (19)
- (20)
- (21)
- (22)
- (23)
(7) 시험
레디 스의 내용을 볼 도구를 사용하여
찾을 수 있습니다 가치가있다! 그리고이 만료가 포인팅 화살표의 위치를 볼 수 있습니다, 실패 시간 값을 기록!
(8)이, 사용의 봄 세션이 완료되었습니다!
개요
크로스 도메인 분산 환경 세션 공유 문제를 들어, 사용 또는 오픈 소스 프레임 워크의 사용은 자신의 프레임 워크를 개발할지 여부를, 우리는 문제를 이해해야합니다 세션은 매우 메모리 집약적 인 일 Tomcat 컨테이너입니다 만듭니다. 우리는 비슷한 프레임 워크를 쓸 때 따라서, 우리가주의를 지불해야합니다, 세션 Tomcat이 우리를 위해 만들어지지 후, 우리는 먼저 세션을 얻을 후 레디 스 및 기타 저장소에 업로드했지만 바로 우리 자신의 창조 세션이 그것은 필수입니다!