Viele Projekte in Dachang werden auf mehreren Servern bereitgestellt. Wenn wir auf den Dienst zugreifen, kann es sein, dass er auf verschiedenen Servern ausgeführt wird Ich bin auf ein solches Anmeldeszenario gestoßen (wie im Bild gezeigt). Mithilfe dieser Informationen können Sie feststellen, ob der Benutzer angemeldet ist
Angenommen, diese Anmeldung erfolgt über Server 01, dann werden die Anmeldesitzungsinformationen dieses Mal im Speicher 01 gespeichert. Wenn ich sie jedoch erneut besuche, führt Server 02 den Vorgang aus, die Anmeldesitzungsinformationen befinden sich jedoch im Speicher 01 Server 02 kann es nicht erhalten, daher wird es beurteilt, dass ich nicht angemeldet bin und falsche Informationen zurückgeben ...Was wir erreichen wollen, ist, dass die durch die Anmeldung bei einem Server generierte Sitzung mit anderen Servern geteilt werden kann
, Wie kann man es also erreichen?Lösung Da der Speicher dieser Server nicht gemeinsam genutzt werden kann, reicht es aus, einen gemeinsamen Speicherplatz zu haben, auf den diese Server gemeinsam zugreifen können (wie im Bild gezeigt). Das sollte mir in den Sinn kommen. Solange diese Servercluster eine Datenbank gemeinsam nutzen und die generierten Sitzungsinformationen in der Datenbank speichern, kann jeder darauf zugreifen. Es gibt relationale und nicht relationale Datenbanken (NoSql):
Relationale Datenbank: MySQL usw.
Nicht-relationale Datenbank: Redis (K/V-Datenbank) usw.
kann auch über den Dateiserver implementiert werden, der hier nicht vorgestellt wird Diese Methode kann über iphash von nginx implementiert werden, die Idee unterscheidet sich jedoch von den beiden oben genannten. Das heißt, alle Anfragen für dieselbe IP werden von nginx berechnet und die Ergebnisse werden an sie gebunden Danach greift diese Anfrage auf den Server zu.
Dabei gibt es jedoch einige Probleme. Erstens macht der Lastausgleich keinen Sinn, wenn der gebundene Server hängen bleibt oder Ihre Anfrage von anderen Diensten verteilt wird und nicht über den Nginx-Dienst läuft . Dann wird iphash auch nicht wirksam. Verwenden Sie es daher mit Vorsicht Der Code wird beim Anmelden aufgezeichnet. Sitzungsinformationen des Benutzers:Dieser Dienst ist über die folgenden zwei Schnittstellen verfügbar: (Die folgenden Tests werden im selben Dienst getestet)
Anmeldeschnittstelle: Login-Benutzersitzungsinformationen aufzeichnen Anmeldetest: Get Aktuelle Benutzerinformationsschnittstelle: Durch Anmeldesitzung abrufen Aktuelle Benutzerinformationen Testen Sie, um die aktuell angemeldeten Benutzerinformationen zu erhalten:Da es sich jetzt um zwei Dienste handelt, ist es definitiv nicht möglich, die Sitzung zu teilen Wenn Sie sich am Port 8080 beim Dienst anmelden, können Sie sich nicht am Port 8082 anmelden. Der Dienst erhält die aktuellen Benutzerinformationen (ich betone noch einmal: Der obige Test kann die aktuellen Benutzerinformationen abrufen, da er im selben Dienst getestet wird. Das Dieselbe Dienstsitzung wird in ihrem eigenen Speicher gespeichert und kann natürlich von ihr selbst aufgerufen werden
Zunächst müssen Sie Redis herunterladen und das Tutorial hier online herunterladen. Ich verwende direkt den von Docker auf dem Server erstellten Redis-Container (einfach und benutzerfreundlich, sehr zu empfehlen):
#🎜🎜 ## 🎜🎜#Sie können es über das visuelle Tool verbinden:
Auf diese Weise wird Redis konfiguriert. Konfigurieren Sie nun Redis im Projektcode: # 🎜🎜#
Redis-Abhängigkeit und Spring-Session-Konfigurationsabhängigkeit in das Projekt einführen (Sitzung automatisch in Redis speichern):<!-- 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>Konfigurieren Sie die Verbindung Redis und sitzungsbezogen in der application.yml-Datei Konfiguration:
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)Tatsächlich gibt es nur eine Schlüsselkonfiguration: Store-Type: Redis Solange dies konfiguriert ist, wird die Sitzung im Code sein in Redis statt im eigenen Speicher gespeichert;
# 🎜🎜#Sie können es als nächstes testen:
Anmeldeschnittstelle aufrufen, Benutzersitzungsinformationen generieren und Redis anzeigen:
# 🎜🎜#Sie können sehen, dass die Benutzeranmeldesitzung in Redis gespeichert wurde, sodass ich mich bei Port 8080 anmelde und die Anmeldesitzungsinformationen auch bei 8082 abrufen kann: # 🎜🎜 ## 🎜🎜#Login:#🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜#Informationen:#🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜 🎜#Auf diese Weise wird die Sitzungsfreigabe durch Redis erreicht;
#🎜🎜 #Hinweis: Die eingeführten Redis- und Spring-Redis-Abhängigkeitsversionen müssen ähnlich sein.Das obige ist der detaillierte Inhalt vonMit welcher Methode implementiert Redis die Sitzungsfreigabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!