De nombreux projets à Dachang sont déployés sur plusieurs serveurs. Lorsque nous accédons au service, bien que le même service soit exécuté, il peut s'exécuter sur différents serveurs. ;
J'ai rencontré un tel scénario de connexion lorsque j'étudiais le projet. Supposons qu'il y ait trois serveurs comme suit (comme indiqué sur l'image) et utilisez la session pour stocker les informations de connexion de l'utilisateur. être utilisé pour déterminer si l'utilisateur est connecté :
En supposant que cette connexion est effectuée via le serveur 01, alors les informations de session de connexion cette fois sont stockées dans la mémoire 01 ; mais lorsque je visite à nouveau, le serveur 02 effectue l'opération, mais les informations de session de connexion sont dans la mémoire 01 et le serveur 02 ne peut pas les obtenir, il jugera donc que je ne suis pas connecté et renverra les mauvaises informations. .
Ce que nous voulons réaliser, c'est que la session générée en se connectant à un serveur puisse être partagée avec d'autres serveurs , alors comment y parvenir ?
Solution L'idée est que puisque la mémoire de ces serveurs ne peut pas être partagée, tant qu'il existe un espace partagé auquel ces serveurs peuvent accéder ensemble (comme Picture );
La première chose qui me vient à l'esprit devrait être la base de données tant que ces clusters de serveurs partagent une base de données et stockent les informations de session générées dans. la base de données, ça ne suffira pas. Bon, donc tout le monde peut y accéder ; la base de données a du relationnel et du non relationnel (NoSql) :
Base de données relationnelle : Mysql etc.
#🎜🎜 #Mais cela pose quelques problèmes. Tout d'abord, l'équilibrage de charge n'a pas beaucoup de sens si le serveur lié raccroche, alors iphash sera invalide ou votre requête sera distribuée par d'autres services sans passer par nginx ; ., alors iphash ne prendra pas non plus effet ; utilisez-le donc avec prudence
Ci-dessous, je vais simplement simuler via le code comment réaliser facilement le partage de session via la configuration Redis ; introduction
Après ouverture du service Vous pouvez accéder au document d'interface correspondant :
-------- --------------- ------------Ligne de séparation-------------------------- --------------- -------
Le service dispose des deux interfaces suivantes : (Les tests suivants sont testés dans le même service)#🎜 🎜#
Interface de connexion : enregistrer les informations de session utilisateur de connexion Test de connexion :# 🎜🎜#
Obtenir l'interface des informations utilisateur actuelles : Obtenez les informations actuelles de l'utilisateur en vous connectant à la session Obtenez le test des informations de connexion actuelles de l'utilisateur : #🎜🎜 #Parce qu'il s'agit de deux services maintenant, il n'est certainement pas possible de partager la session. Même si vous vous connectez au service sur le port 8080, vous ne pouvez pas l'obtenir sur le service sur le port 8082. aux informations utilisateur actuelles (j'insiste encore : le test ci-dessus peut obtenir les informations utilisateur actuelles car il est testé ; dans le même service. La même session de service est stockée dans sa propre mémoire et est bien sûr accessible par elle-même)
#🎜 🎜#Opération spécifiqueCe qui suit est de mettre en œuvre une session partagée via Configuration Redis :
Téléchargez d'abord redis et téléchargez les tutoriels en ligne ; ici j'utilise directement le conteneur redis créé via docker sur le serveur (simple et facile à utiliser, fortement recommandé) :
Vous pouvez le connecter via l'outil de visualisation :
De cette façon, redis est configuré. Configurez maintenant redis dans le code du projet :
Introduisez la dépendance redis et la dépendance de configuration spring-session dans le projet (stockez automatiquement la session dans redis) :
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.6.4</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>2.6.3</version> </dependency>
Configurez dans le fichier application.yml. file Configurations associées pour connecter redis et session :
spring: # session配置 session: timeout: 86400 # 设置session失效时间 store-type: redis # 修改spring-session存储配置,默认存储到服务器内存中,现在设置存到redis中(关键) # redis配置 redis: port: 8081 # redis的端口号(这里是我的redis容器在docker中对应的端口号) host: xx.xxx.xxx.xxx # 我的云服务器ip database: 0 # 设置存入redis的哪一个库(默认是0)
En fait, il n'y a qu'une seule configuration clé : store-type : redis Tant que celle-ci est configurée, la session dans le code sera stockée dans redis au lieu de sa propre mémoire.
Ensuite, vous pouvez Testé :
Appelez l'interface de connexion, générez les informations de session utilisateur, vérifiez redis :
Vous pouvez voir que la session de connexion utilisateur a été stockée dans redis, je peux donc me connecter sur le port 8080. , et je peux également obtenir les informations de connexion sur 8082 Informations de session :
Connexion :
Obtenir des informations :
De cette façon, le partage de session se fait via redis
Remarque : l'introduction de redis ; et les versions de dépendance spring-redis doivent être proches.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!