SpringSession+Redis 클 러 스 터 세 션 공유 방법

11204 단어 springsessionredis
WEB 애플 리 케 이 션 개발 이 완료 되면 Tomcat 또는 다른 용기 에 배치 되 어 사용자 가 방문 할 수 있 습 니 다.소형 애플 리 케 이 션 은 한 서버 에 Tomcat 을 설치 하고 WEB 애플 리 케 이 션 을 배치 합 니 다.방 문 량 이 증가 함 에 따라 Tomcat 의 압력 은 점점 커지 고 붕 괴 될 때 까지 해 결 됩 니 다.WEB 애플 리 케 이 션 의 적재 능력 을 확보 하기 위해 서 는 WEB 애플 리 케 이 션 을 클 러 스 터 처리 해 야 합 니 다.
기술 이 지금까지 발전 하면 서 군집/부하 균형 이 상대 적 으로 간단 해 졌 다.다음은 통속 적 인 언어 로 갓 입문 한 학생 들 에 게 이 두 가지 개념 을 소개 한다.
한 KFC 가 문 을 열 었 을 때 주문 창구(Tocmat 서버 한 대,비용 절감 가능)만 대외 적 으로 주문 서 비 스 를 제공 했다.일상적인 주문 에 문제 가 없 었 다.식사 입 이나 주말 에 한 창 이 길 게 줄 을 섰 다.고객 들 의 불평(요청 시간 이 길 고 사용자 체험 이 좋 지 않다)뿐만 아니 라 종업원 들 도 힘 들 었 다.결국 어느 날 그 는 지 쳐 쓰 러 졌 다(Tomcat 이 끊 었 다).
이때 측면 에 창(Tomcat 서버 한 대 추가)을 추가 하여 주문 서 비 스 를 제공 하지만 많은 고객 들 이 새 창 을 모 르 고 기 존 창 에 길 게 줄 을 서 있 습 니 다(사용 자 는 여전히 원래 의 Tomcat 에 방문 합 니 다).이 럴 때 는 한 사람 이 문 앞 에 서서 창문 마다 줄 을 서 있 는 상황 에 따라 고객 에 게 어느 창구 로 가서 주문 하 는 지 안내 해 야 한다.이 사람 은 각 창구 의 주문 인원 이 대체적으로 같 고 바 쁘 거나 한가 하지 않도록 하 는 역할 을 한다.고객 이 늘 어 나 면서 주문 창구 도 그 만큼 증가한다(Tomcat 이 점점 많아 진다).
  • 클 러 스 터:한 무리의 서버 가 모여 서 서 서 비 스 를 제공 합 니 다.전례 에서 여러 개의 주문 창(여러 대의 Tomcat)이 공동으로 주문 서 비 스 를 제공 하 는 것 이 바로 클 러 스 터 입 니 다.
  • 부하 균형:클 러 스 터 의 모든 주문 창(모든 Tomcat)의 부하 상황 을 균형 있 게 유지 하고 한 개 또는 몇 개의 여유 가 없 도록 합 니 다.
  • 두 가지 개념 은 동시에 나타 난 것 이다.클 러 스 터 가 없 는 서비스(단일 Tomcat)도 부하 균형 설 이 존재 하지 않 고 클 러 스 터 의 서 비 스 는 부하 균형 이 없 으 면 자원 을 낭비 할 수 있다.
    WEB 부하 균형 방안 이 매우 많 습 니 다.Nginx + Tomcat 자주 사용 하 는 방안 중 하나 입 니 다.Nginx 는 부하 이퀄 라이저 로 서 모든 Tomcat 의 부하 상황 에 따라 분류 합 니 다.
  • 모든 Tomcat 은 주문 창구 에 해당 하 며 주문 서 비 스 를 제공 할 수 있 습 니 다
  • 주문 할 때마다 Nginx
  • Nginx 는 각 창의 여가 상황 에 따라 사용자 가 어느 창 에 가서 주문 할 지 배정 합 니 다
  • 1 번 창구 에서 처음 시 켜 서 주문 하고 바로 다시 시 켜 서 2 번 창구 로 배 정 될 수도 있어 요.
  • 다음은 부하 균형 잡 힌 WEB 애플 리 케 이 션 을 구축 하 겠 습 니 다.
    1)WEB 응용 프로그램 구축
    WEB 애플 리 케 이 션 을 준비 하고 두 개의 Tomcat 로 배치 합 니 다.테스트 할 때 요청 이 어떤 Tomcat 에서 처리 되 는 지 구분 할 수 있 도록 Tomcat 포트 번 호 를 결과 로 되 돌려 줍 니 다.
    
    /**
     *        Tomcat   
     */
    @RequestMapping("/port/get")
    @ResponseBody
    public String getPort(HttpServletRequest request) {
     return String.valueOf(request.getLocalPort());
    }
    이 예 에 서 는 각각 5677,5688 두 포트 를 사용 하여 이 프로젝트 를 배치 합 니 다.방문/port/get 은 결 과 를 Tomcat 의 포트 번호 로 되 돌려 달라 고 요청 합 니 다.
    http:// localhost:5677/port/get
    http:// localhost:5688/port/get
    2)Nginx 부하 균형 설정
    Window 아래 Nginx 설치 가 간단 합 니 다.설치 할 줄 모 르 는 학생 자체 바 이 두 는 Nginx 설정 파일:nginx.conf 를 간단하게 소개 합 니 다.
    
    # Nginx   
    worker_processes 1;
    events {
     #        
     worker_connections 1024;
    }
    # Nginx  HTTP       
    # http    ,     
    http {
     #     ,          
     # Nginx  88,89,90    ,      server
     server {
     #    ,   88       server        
     listen 88;
     #     
     server_name localhost;
     #          URL,     URL   location        
     # /    88       
     location / {
     #          ,             
     #  :   /a.html,   D:/a.html   
     root D:/;
     }
     }
     
    }
    
    
    위 설정 파일 의 가장 기본 적 인 Nginx 설정 은 우리 가 접근http://localhost:88할 때 Nginx 에서 처리 합 니 다.다음은 Nginx 의 부하 균형 을 설정 합 니 다.
    설정 1)에서 정 의 된 두 개의 tomcat 는 http 노드 에 다음 과 같은 코드 를 추가 합 니 다.
    
    #                 
    # upstream    , springsession       
    # server    ,          (  tomcat)
    # server          ,    ip:  
    # weight           ,  4    3    5688, 1  5677
    upstream springsession { 
     server localhost:5677 weight=1; 
     server localhost:5688 weight=3; 
    }
    Nginx 에 접근 할 모든 요청 을 두 서버 로 전송 하도록 설정 합 니 다.
    
    location / {
     # root D:/;
     #       springsession upstream  
     proxy_pass http://springsession; 
    }
    3)부하 균형 테스트
    접근http://localhost:88/port/get,Nginx 는 두 대의 tomcat 중 하나 로 전송 요청 을 처리 합 니 다.반환 요청 결과 가 다른 것 을 발견 할 수 있 습 니 다.
  • 설정 의 가중치 에 따라 4 번 방문 할 때마다 3 번 은 5688 에서 1 번 은 5677 로 처리 합 니 다.
  • 가중치 설정 은 최종 평균치 가 3/4 와 1/4 일 뿐 앞의 세 번 의 방문 이 모두 5688 로 처리 되 는 것 은 아니다.
  • weight 를 설정 하지 않 을 때 한 번 에 두 개의 tomcat 를 요청 할 확률 이 각각 50%를 차지한다.
  • 부하 균형 설정 이 완료 되 었 습 니 다.다음 문제 가 있 습 니 다.
    1 번 창구 에서 주문 할 때 열 쇠 를 이 창구 에 잠시 보관 하 세 요.다음 에 주문 할 때 2 번 창구 나 다른 창구(1 번 창구 로 배 치 될 수도 있 습 니 다)로 배 치 될 수도 있 습 니 다.다른 창구 에서 열 쇠 를 찾 는 것 은 분명 통 하지 않 습 니 다.다른 창 에는 열쇠 가 없 기 때 문 입 니 다.이 럴 때 는 1 번 창구 로 빠르게 배 치 될 수 있 기 를 기도 할 수 있 습 니 다.
    열 쇠 를 저장 하 는 동작 이 SESSION 에 정 보 를 저장 하 는 것 으로 바 뀌 면 요청 이 Tomcat 1 에 의 해 처 리 될 때 Tomcat 1 은 SESSION 을 생 성 합 니 다.SESSION 에 정 보 를 설정 하고 다음 요청 은 Tomcat 2 에 배정 되 었 습 니 다.Tomcat 2 는 또 하나의 SESSION 을 생 성 합 니 다.이것 은 두 개의 독립 적 이 고 공유 되 지 않 는 SESSION 입 니 다.따라서 Tomcat 2 에서 Tomcat 1 에 저 장 된 정 보 를 얻 을 수 없습니다.
    로그 인의 원 리 는 바로 SESSION 에 로그 인 상 태 를 저장 하 는 것 입 니 다.위의 분석 에 따 르 면 클 러 스 터 에 로그 인 한 서비스 에서 효력 을 잃 습 니 다.Tomcat 1 에 로그 인 하고 다음 에 Tomcat 2 를 방문 합 니 다.이때 SESSION 을 통 해 로그 인 상 태 를 판단 한 것 은 로그 인 하지 않 은 것 이 고 다시 로그 인 해 야 합 니 다.사용자 가 미 쳤 습 니 다.미 쳤 습 니 다.사장 님 도 미 치 겠 습 니 다.
    만약 공용 위치 에서 물건 을 보관 하 는 데 사용 된다 면 모든 주문 창 이 공용 위치 에서 고객 의 물품 을 액세스 하면 위의 문 제 는 쉽게 해 결 될 것 이다.
    이것 이 바로 본 고의 중점 이다.클 러 스 터 에서 각 WEB 가 응용 하 는 SESSION 을 통일 적 으로 관리 하 는 것 이다.
  • 용기 의 선택:SESSION 을 통일 적 으로 저장 할 수 있 는 용기 가 필요 합 니 다.다음 3 가지 분석 을 통 해 Redis 가 가장 적합 합 니 다.SESSION 은 자주 읽 기 때문에 데이터 베 이 스 는 파일 시스템 이 적합 하지 않 습 니 다.메모리 에서 조작 하 는 것 이 좋 습 니 다.SESSION 은 ID 가 있 고 하나의 ID 는 하나의 SESSION 에 대응 하 며 K/V 용기 SESSION 은 실효 성 이 있 는 것 이 좋 습 니 다.삭제 가 필요 합 니 다).만 료 시간
  • 을 설정 하 는 것 이 좋 습 니 다.
  • SESSION 액세스 메커니즘:SESSION 은 Tomcat 에서 생 성 되 었 기 때문에 먼저 Tomcat 의 SESSION 메커니즘 을 수정 하고 Redis 에서 SESSION 을 액세스 하 는 것 이 문제 가 될 수 있 습 니 다.만약 에 Tocmat 가 업그레이드 되 었 다 고 가정 하면 우 리 는 Tomcat 에 대해 다시 수정 해 야 합 니 다.따라서 이 방안 은 타당 성 이 떨 어 집 니 다.우 리 는 이렇게 고려 할 수 있 습 니 다.Tomcat 이 SESSION 을 생 성 하 더 라 도.저희 도 WEB 애플 리 케 이 션 에서 사용 합 니 다.왜 WEB 애플 리 케 이 션 에서 SESSION 을 다시 만 들 지 않 습 니까?이 필 터 를 만 듭 니 다.WEB 애플 리 케 이 션 에 들 어가 기 전에 Tomcat 의 SESSION 을 버 리 고 Redis 에서 SESSION 을 가 져 옵 니 다.
  • 공교롭게도 이런 틀 이 우리 가 위의 생각 을 완성 하 는 데 도움 을 주 었 다.설정 만 하면 통일 관 리 를 실현 할 수 있다.그 가 바로 Spring Session 이다.
    Spring Session 의 기능 에 깊 은 인상 을 남기 기 위해 서 는 Spring Session 이 없 을 때 우리 의 클 러 스 터 애플 리 케 이 션 이 SESSION 을 어떻게 처리 하 는 지 테스트 해 보 겠 습 니 다.
    균형 잡 힌 WEB 애플 리 케 이 션 에 컨트롤 러 방법 을 추가 하여 매번 SESSION ID 를 출력 합 니 다.
    
    /**
     *        SESSION ID
     */
    @RequestMapping("/sessionid/get")
    @ResponseBody
    public String getPort(HttpServletRequest request, HttpSession session) {
     int port = request.getLocalPort(); //   
     String sessionId = request.getSession().getId(); // SESSION ID
     
     return "port: " + port + ", session id: " + sessionId;
    }
    프로젝트 시작,여러 번 방문http://localhost:88/sessionid/get

    두 번 모두 같은 Tomcat 아래 에 있 는 SESSOIN ID 는 변 하지 않 습 니 다.
    서로 다른 Tomcat 아래 에 두 번 방문 하 는 SESSION ID 는 달라 집 니 다.
    다른 Tomcat 을 방문 한 후 같은 Tomcat 을 다시 방문 할 때 도 SESSION ID 가 달라 집 니 다.
    상기 상황 이 발생 한 원인 은 다음 과 같다.
  • 5677 을 방 문 했 습 니 다.SESSION 이 없 기 때문에 Tomcat 5677 은 SESSION 을 생 성 했 고 ID 는 1 이 며 1 을 클 라 이언 트
  • 로 되 돌려 줍 니 다.
  • 5677 방문,브 라 우 저 는 SESSIONID=1,Tomcat 5677 에서 해당 하 는 SESSION 을 찾 았 습 니 다.따라서 SESSIONID 1
  • 5688 방문,브 라 우 저 는 SESSIONID=1,Tomcat 5688 에서 해당 하 는 SESSION 을 찾 지 못 하고 SESSION 을 다시 생 성 합 니 다.ID 는 2 이 고 2 를 클 라 이언 트
  • 로 되 돌려 줍 니 다.
  • 5677 방문,브 라 우 저 는 SESSIONID=2,Tomcat 5677 에서 해당 하 는 SESSION 을 찾 지 못 하고 SESSION 을 다시 생 성 합 니 다.ID 는 3 이 고 3 을 클 라 이언 트
  • 로 되 돌려 줍 니 다.
  • 5688 방문,브 라 우 저 는 SESSIONID=3,Tomcat 5688 에서 해당 하 는 SESSION 을 찾 지 못 하고 SESSION 을 다시 생 성 합 니 다.ID 는 4 이 고 4 를 클 라 이언 트
  • 로 되 돌려 줍 니 다.
    4)통일 세 션 관리
    다음은 웹 애플 리 케 이 션 의 세 션 을 Spring Session 으로 관리 해 보도 록 하 겠 습 니 다.
    1)레 디 스 설치 및 오픈
    문장 참조https://www.jb51.net/article/145704.htm
    2)스프링 세 션 의존 도 추가
    
    // Spring Session  
    "org.springframework.session:spring-session-data-redis:2.0.5.RELEASE",
    // Redis  
    "io.lettuce:lettuce-core:5.0.4.RELEASE"
    3)스프링 세 션 필터 설정
    웹.xml 에 Spring Session 에서 제공 하 는 필 터 를 설정 합 니 다.이 필 터 는 Tomcat 에서 생 성 된 SESSION 을 Redis 에 저 장 된 SESSION 으로 대체 합 니 다.
    
    <!-- Spring Session    -->
    <!--      WEB     Tomcat   SESSION   Redis  SESSION -->
    <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>
    4)SpringSession/Redis 설정
    Spring 프로필 에 Spring Session 설정 과 Redis 설정 추가
    
    beans {
     xmlns context: "http://www.springframework.org/schema/context"
     //       
     context.'annotation-config'()
     //   Spring Session
     //       Web.xml    Spring Session   
     //  Tomcat Session   Redis    Session
     sessionConfig(RedisHttpSessionConfiguration)
     //   Redis     
     //       6379  
     lettuce(LettuceConnectionFactory)
     
    }
    5)테스트
    프로젝트 를 시작 하고 여러 번 방문http://localhost:88/sessionid/get하 며 SESSION ID 를 방문 하 는 것 은 같 습 니 다.

    동시에 Redis 에 도 현재 SESSION 의 기록 이 나 타 났 다.

    Spring Session 을 사용 한 후 클 러 스 터 에 있 는 WEB 애플 리 케 이 션 을 방문 할 때 SESSION 처리 과정:
  • 5677 에 접근 합 니 다.Redis 에 SESSION 이 없 기 때문에 하나의 SESSION 을 생 성하 여 Redis 에 저장 합 니 다.ID 는 1 이 고 1 을 클 라 이언 트
  • 로 되 돌려 줍 니 다.
  • 5677 방문,브 라 우 저 는 SESSIONID=1,Tomcat 5677 은 Redis 에서 SESSION 을 찾 았 습 니 다.그래서 SESSIONID 1
  • 5688 방문,브 라 우 저 는 SESSIONID=1,Tomcat 5688 은 Redis 에서 SESSION 을 찾 았 습 니 다.그래서 SESSIONID 1
  • Redis 를 제거 하고 5677 을 다시 방문 합 니 다.Redis 에 ID 가 1 인 SESSION 이 없 기 때문에 다시 생 성 되 고 ID 도 상응 하 게 변 경 됩 니 다
  • 5)예시 코드
    이때 우 리 는 SESSION 을 통일 적 으로 관리 하 는 것 을 실현 했다.어떤 TOMCAT 를 방문 하 더 라 도 똑 같은 SESSION 을 찾 을 수 있다.
    우리 의 응용 이 클 러 스 터 를 한 후에 SESSION 을 통일 적 으로 관리 하 는 것 은 필수 적 인 일이 다.SESSION 을 통일 적 으로 관리 하 는 방식 이 매우 많다.본 고 는 그 중의 한 가지 방식 일 뿐이다.학생 들 에 게 SESSION 을 통일 적 으로 관리 하 는 중요성 과 그의 기본 원 리 를 이해 하 게 하 는 데 중심 을 둔다.
    예제 코드 주소:https://github.com/atd681/alldemo
    예제 항목 이름:atd 681-springsession
    총결산
    위 에서 말 한 것 은 편집장 님 께 서 소개 해 주신 SpringSession+Redis 가 클 러 스 터 세 션 공 유 를 실현 하 는 방법 입 니 다.여러분 께 도움 이 되 셨 으 면 좋 겠 습 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

    좋은 웹페이지 즐겨찾기