Быстро реализовать совместное использование сеансов кластера Tomcat

Архитектура

Быстро реализовать совместное использование сеансов кластера Tomcat

предисловие

В интернет-сценарии, имеющем дело с огромным пользовательским трафиком, построение кластера Tomcat является незаменимым решением для снижения нагрузки на веб-сервер, и полученная информация о сеансе, то есть проблема асинхронности сеанса, также подвергается воздействию: после того, как пользователь только что вошли в систему, операция снова предлагает вам снова войти в систему, что серьезно влияет на работу пользователя.В этой статье в основном изучается, как использовать структуру Spring Session для решения проблемы совместного использования сеанса кластера Tomcat.Если у вас есть какие-либо дополнения, добро пожаловать в поправьте их.

текст

Подготовка окружающей среды
  • 3 экземпляра Tomcat
  • Redis
Структура проекта

Проект относительно простой, за исключением класса запуска, есть только один класс контроллера.

Реализация контроллера

UserController в основном имеет два метода запроса, один принимает логин пользователя, а другой получает информацию для входа; при вызовеloginПосле интерфейса данные запроса будут храниться в текущем сеансе, а затем вызываться в течение периода действия сеанса.getUserInfoИнтерфейс может получить данные, соответствующие логину.

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login")
    public String login(HttpSession session, HttpServletRequest request) {
        String id = request.getParameter("id");
        String name = request.getParameter("name");
        HashMap<Object, Object> userInfo = new HashMap<>(16);
        userInfo.put("id", id);
        userInfo.put("name", name);
        session.setAttribute("USER_INFO", userInfo);
        return userInfo + "  成功存储到会话中";
    }

    @RequestMapping("/getUserInfo")
    public String getUserInfo(HttpSession session, HttpServletRequest request) {
        Object user_info = session.getAttribute("USER_INFO");
        if (user_info == null) {
            return "请先登录,再读取会话数据";
        }
        return "从会话中读取数据 " + user_info;
    }
}

Теперь мы собираем три экземпляра Tomcat в кластер, а затем запускаем проект; если мы отправим запрос на вход для экземпляра Tomcat, а затем снова отправим запрос на получение информации о пользователе, этот Tomcat сможет правильно вернуть информацию, сохраненную после предыдущего входа в систему. ; Когда мы пытаемся получить информацию о пользователе в другом экземпляре Tomcat, он возвращает «Сначала войдите в систему, затем прочитайте данные сеанса»; это указывает на то, что информация о сеансе этих двух экземпляров Tomcat существует независимо.

Использование весенней сессии

Теперь вы хотите сделать эти сеансы поделиться информацией между Tomcat, просто войти в систему одновременно, вы можете получить доступ к кластеру в других случаях, которые можно использовать данные, вы можете использовать Frame Session Session для достижения, она не может в каком-либо случаю инвазивных процедур Сессия достигнет общих. Прежде всего, мы должны сделать, чтобы ввести библиотеки, связанные с сеансом POM файла

    <dependency>
		<groupId>org.springframework.session</groupId>
		<artifactId>spring-session-data-redis</artifactId>
	</dependency>
    <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>

Из зависимой библиотеки видно, что сеанс Spring использует базу данных памяти Redis для хранения информации о сеансе для обеспечения совместного использования сеансов кластера.

После импорта библиотеки зависимостей нам нужно настроить сеанс в файле application.properties.

server.servlet.session.timeout=3600 //1
spring.session.redis.flush-mode=IMMEDIATE //2 
spring.session.redis.namespace=spring:session //3

// 4
spring.redis.host=127.0.0.1
spring.redis.password=
spring.redis.port=6380

Во-первых, краткое описание только что добавленной конфигурации в файле:

  1. Ограничьте время ожидания сеанса, единица измерения по умолчанию — секунды.
  2. Установите режим обновления сеанса, есть ON_SAVE и IMMEDIATE; IMMEDIATE означает немедленную запись в Redis; ON_SAVE означает, что только при выполненииSessionRepository.save(org.springframework.session.Session)будет записано в Redis.
  3. Пространство имен для хранения сеансов в Redis.
  4. Подключиться к базе данных Redis

Затем снова вызовите запрос на вход после упаковки проекта в каждый Tomcat, а затем запросите все текущие KEYS в Redis.

Из рисунка видно, что именование данных Session в кеше происходит из пространства имен в предыдущем конфигурационном файле, мы берем KEY внутрь, чтобы просмотреть его содержимое, а там информация о пользователе, которую мы сохранили в нем.

Затем мы запрашиваем еще один TOMCAT для получения информации о пользователе, и мы можем обнаружить, что возвращенный результат больше не является предыдущим «Пожалуйста, войдите в систему, а затем прочитайте данные сеанса», но можете вернуть информацию о данных сеанса, зарегистрированную в предыдущем экземпляре Tomcat Обычно., Это также показывает, что разделение сеанса между кластерами Tomcat осуществляется, не очень просто?

Ссылаться на