Быстро реализовать совместное использование сеансов кластера 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
Во-первых, краткое описание только что добавленной конфигурации в файле:
- Ограничьте время ожидания сеанса, единица измерения по умолчанию — секунды.
- Установите режим обновления сеанса, есть ON_SAVE и IMMEDIATE; IMMEDIATE означает немедленную запись в Redis; ON_SAVE означает, что только при выполнении
SessionRepository.save(org.springframework.session.Session)будет записано в Redis. - Пространство имен для хранения сеансов в Redis.
- Подключиться к базе данных Redis
Затем снова вызовите запрос на вход после упаковки проекта в каждый Tomcat, а затем запросите все текущие KEYS в Redis.
Затем мы запрашиваем еще один TOMCAT для получения информации о пользователе, и мы можем обнаружить, что возвращенный результат больше не является предыдущим «Пожалуйста, войдите в систему, а затем прочитайте данные сеанса», но можете вернуть информацию о данных сеанса, зарегистрированную в предыдущем экземпляре Tomcat Обычно., Это также показывает, что разделение сеанса между кластерами Tomcat осуществляется, не очень просто?