предыдущий постSpringSession: интегрировать SpringBootописывает, какSpringBoot
Интеграция ДжоливудаSpringSession
, весь процесс очень прост, и его также легко проанализироватьSpringSession
принцип действия. Следуя предыдущей практике, в этой статье в основном анализируютсяSpringSession
принцип.
1. Начните со схемы согласованности сеанса
оsession
а такжеcookie
Для некоторых знаний вы можете обратиться к статье, которую я написал ранее:Поговорим о сеансах и файлах cookie.
Session
Как механизм, используемый сервером для записи состояния клиента, он прозрачен для клиента; ноSession
Для нормальной работы по-прежнему требуется поддержка клиентского браузера. мы все знаем,HTTP
Протоколы не имеют состояния,Session
не могу полагаться наHTTP
соединение, чтобы определить, является ли это одним и тем же клиентом, поэтому серверу необходимо отправить идентификационный флаг браузеру клиента (sessionId
), эта опознавательная метка проходит черезCookie
механизм до конца.
1.1. Происхождение проблемы согласованности сеансов
Когда пользователь впервые посещает нашServlet
Когда на стороне сервера приложений будет создан независимыйSession
, и хранится в памяти. Эта ситуация может быть реализована в сценарии с одним сервером приложений (здесь не обсуждается один из его недостатков, а именно нагрузка на сервер, вызванная использованием памяти). В кластерном сценарии этот механизм будет иметь проблемы:
1.1.1. Автономная сцена
Поскольку это сервер приложений, каждый запрос пользователя обрабатывается этой машиной, поэтому не будетsession
общая проблема.
1.1.2 Кластерный сценарий
Предположим, что сейчас в кластере три машины (сверху вниз: A->B->C). Когда текущий пользователь инициирует доступ в первый раз, запрос назначается машине А для обработки.Session
Данные записываются в память машины А, при повторной инициации доступа запрашивается выделенная обработка Б, но в это время в памяти Б нет данных текущего пользователя, поэтому естьsession
противоречивая ситуация.
1.2, Решение проблемы согласованности сеанса
В нынешнюю эпоху сервис-ориентированных и унифицированных приложений простыеSession
Он больше не может соответствовать нашим требованиям. Затем нам нужно найти решение для замены текущей реализации хранилища памяти на одной машине.
1.2.1 Механизм реализации на основе IP-HASH
В 1.1.2, поскольку мы не можем знать, какой машине будет назначен запрос, это приведет кsession
Возникают проблемы несоответствия. Если мы сможем решить проблему, заключающуюся в том, что каждый запрос пользователя может быть закреплен за определенной машиной, то проблемы, упомянутой выше, на самом деле не существует.IP-HASH
Это такая схема. запрашивающим клиентомIP
провестиHASH
Вычислите и сопоставьте результат расчета с конкретной машиной, чтобы запрос мог быть фиксированно привязан к определенной машине, таким образом эффективно избегаяsession
Возникновение проблем согласованности.
Преимущества этого подхода:
- Нет необходимости изменять какой-либо код приложения, 0 вторжений.
- Высокая безопасность, не зависит от рисков, связанных с другими сторонними системами кэширования.
- бюджетный
Но проблема также очевидна, этот метод фактически избегаетsession
Проблемы согласованности возникают не дляsession
Решение проблемы непротиворечивости. Главная проблема:
- Основываясь на памяти приложений, это окажет определенное давление на сервер приложений.
- Перезапуск службы вызовет
session
данные потеряны - Не подходит для горизонтального масштабирования, горизонтальное масштабирование также может быть потеряно
session
- Есть единая точка высокой нагрузки, то есть большинство запросов проходит через
HASH
Попадите в ту же машину после расчета, пока остальные машины простаивают.
1.2.2 Репликация сеанса
Принцип реализации этого метода заключается в том, что сервер приложений создаетsession
После этого многоадресная рассылкаsession
отправляется на другие серверы приложений в рамках многоадресного адреса. Таким образом, по сравнению сIP-HASH
Способ стать надежнее:
- Также нет необходимости менять какой-либо бизнес-код
- Возможность адаптации к нескольким стратегиям нагрузки
- После того, как машина перезагрузится или выйдет из строя, можно не опасаться потери, потому что есть избыточные резервные копии
Но у этого подхода есть и большая проблема:
- Первый — это синхронизация между серверами
session
Он будет занимать определенное количество сетевых ресурсов, и в то же времяsession
Есть задержка при синхронизации между разными машинами. - Или на основе хранилища памяти, ограниченного влиянием объема памяти компьютера, плохой горизонтальной масштабируемостью.
- Память сервера должна хранить память на других машинах
session
Данные, потребление памяти будет увеличиваться с увеличением масштаба кластера, что может привести к частым запускам машины.GC
.
1.2.3 Реализовать централизованное управление сеансами с помощью трехстороннего механизма кэширования
Вышеупомянутые два метода управляются самим сервером.session
Да, основная проблема это влияние на производительность и память. Принцип этого метода состоит в том, чтобыsession
Размещено на стороннем программном обеспечении (например,redis
) для единого управления. Этот метод может эффективно решить проблемы производительности, использования памяти и горизонтального расширения. Однако из-за внедрения стороннего программного обеспечения возрастут сложность внедрения и затраты на эксплуатацию и обслуживание.
Распределенныйsession
Большинство схем реализации основано на этом методе;SpringSession
не исключено.
2, Анализ функциональной структуры SpringSession
Перед распределенным сценариемSession
Проблемы согласованности описаны и решеныSession
Разбор нескольких стратегий на предмет непротиворечивости (немного грубовато, в интернете много знаний). Имея в виду этот фон, давайте посмотрим наSpringSession
принцип реализации.
2.1 Введение
Spring Session
Обеспечивает управление информацией о сеансе пользователя.API
и реализация, что упрощает поддержку кластерных сеансов, не полагаясь на решения, специфичные для контейнера приложений. Он также обеспечивает прозрачную интеграцию:
- Разрешает контейнер приложения (
Tomcat
и т. д.) нейтральный способ заменыHttpSesseion
, поддерживается вheaders
доступно вsession IDs
использоватьRESTful API
. - предоставляется при получении
WebSocket
продолжайте сообщениеHTTP
Возможность выживания сеанса - Позволяет производить замену нейтральным по отношению к контейнеру приложения способом.
Spring WebFlux
изWebSession
.
Вышеприведенный перевод документа с официального сайтаSpring Session
2.2 Модули
Spring Session
В основном включает 4 модуля:
-
spring-session-core
:при условииSpring Session
основной функционал иAPI
-
spring-session-data-redis
:кredis
как механизм храненияSessionRepository
выполнить -
spring-session-hazelcast
:кHazelcast
как механизм храненияSessionRepository
выполнить -
spring-session-jdbc
: реляционная база данных как механизм храненияSessionRepository
выполнить
В целом ядроAPI
+ Реализация хранилища, скриншоты инженерных модулей следующие:
2.3 Функциональная структура
SpringSession в целом можно разделить на три части:
- Для обработки веб-уровня это включает переписывание запросов, добавление пользовательских фильтров в цепочку фильтров, обработку файлов cookie, обработку заголовков http и т. д.
- Общая базовая инкапсуляция, такая как определение абстрактного интерфейса верхнего уровня класса хранения, пользовательская конфигурация, обработка событий и т. д.
- Часть хранилища, которая на самом деле является реализацией интерфейса общедоступного базового пакета, предоставляет множество реализаций хранилища, включая Redis, хранилище в памяти, jdbc и т. д.
2.4 Поддержка нескольких сеансов
Для часто используемых распределенных сеансов реализация обычно полагается на файлы cookie. Но в весенней сессии реализована стратегия на основе заголовка для передачи jessionID. В то же время до версии 2.0.4 для того же браузера и того же веб-сайта springsession поддерживает несколькоsession
проблема, но поддержка сеансов была прекращена после этого выпуска. Для получения дополнительной информации о поддержке нескольких сеансов см.официальная документация.
резюме
В этой статье кратко представлены несколько стратегий реализации распределенного сеанса. Для распределенных сеансов ключевым является решение проблемы согласованности.В настоящее время большинство решений, которые я видел, реализованы с помощью [централизованного управления сеансами с помощью трехсторонней структуры кэширования], включая введение в эту серию статей.
В дополнение к представлению о решении согласованности распределенного сеанса, как вторая статья SpringSession, здесь представлен краткий анализ функциональных модулей Springsession, чтобы анализ исходного кода можно было провести позже.