Springsession nginx反向代理集成過程
一概述
springsession 配置,如果是sevlet的web應(yīng)用后會(huì)自動(dòng)集成 jdbc ,redis,Hazelcast,MongoDB
二session概述
2.1 分布式項(xiàng)目的session問題
在分布式項(xiàng)目中如果客戶端給服務(wù)端發(fā)送了一個(gè)請(qǐng)求,在nginx做反向代理的情況下,第一個(gè)請(qǐng)求可能到達(dá)tomcat1,此時(shí)tomcat1就會(huì)創(chuàng)建一個(gè)session然后將響應(yīng)給客戶端;同理客戶端再次發(fā)送一個(gè)請(qǐng)求,然后nginx又做了一次反向代理,此時(shí)的請(qǐng)求可能到達(dá)tomcat2,此時(shí)tomcat2會(huì)建立一個(gè)session響應(yīng)給客戶端;那么問題就產(chǎn)生了,同一個(gè)客戶端發(fā)了2個(gè)請(qǐng)求,結(jié)果造成兩次會(huì)話的數(shù)據(jù)不一致。

2.2主流的解決方案
針對(duì)2.1分布式session共享問題,當(dāng)代主流的解決方案是使用redis做session以達(dá)到session共享的目的。請(qǐng)求達(dá)到不同的tomcat之后都會(huì)往同一個(gè)redis中寫數(shù)據(jù), 當(dāng)tomcat響應(yīng)數(shù)據(jù)的時(shí)候就會(huì)往同一個(gè)redis中讀數(shù)據(jù) 以前我們需要手動(dòng)的將tomcat獲得的session數(shù)據(jù)存到redis,響應(yīng)的時(shí)候再去redis中取數(shù)據(jù)。現(xiàn)在springsession會(huì)自動(dòng)幫我們的數(shù)據(jù)從tomcat中同步到redis,或者自動(dòng)的從redis中取數(shù)據(jù)。

三session共享實(shí)現(xiàn)方案
3.1環(huán)境說明
1jdk1.8
2redis5.05
3idea工具
4maven構(gòu)建
5springboot 2.1.1
3.2pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<!-- redis啟動(dòng)器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- web啟動(dòng)器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring session啟動(dòng)器 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
</dependencies>
3.3application.yml
spring: redis: host: 192.168.0.104 port: 6379 database: 0 session: store-type: redis redis: cleanup-cron: 0 1 * * * *
3.4controller
package com.youku1327.spring.session.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpSession;
/**
* @Author lsc
* @Description //spring session
* @Date 2019/9/22 14:01
* @Version 1.0
*/
@RestController
public class SpringSessionController {
@GetMapping("set/spring/session")
public String setSpringSession(HttpSession httpSession){
httpSession.setAttribute("user","youku1327");
System.out.println("設(shè)置session");
return "set spring session success";
}
@GetMapping("get/spring/session")
public String getSpringSession(HttpSession httpSession){
httpSession.setAttribute("user","youku1327");
System.out.println("響應(yīng)session");
return httpSession.getAttribute("user").toString();
}
}
3.5啟動(dòng)類
package com.youku1327.spring.session;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author lsc
* @Description //
* @Date 2019/9/22 13:29
* @Version 1.0
*/
@SpringBootApplication
public class SpringSessionApplication {
public static void main(String[] args) {
SpringApplication.run(SpringSessionApplication.class,args);
}
}
3.6啟動(dòng)兩個(gè)實(shí)例

3.7測(cè)試
訪問8080端口設(shè)置session

訪問8083端口獲得session

3.8默認(rèn)是spring:session做為key前綴有需要改變可以在yml中配置

四nginx反向代理說明
在nginx安裝目錄的conf文件夾的nginx.conf
server {
listen 端口;
server_name 發(fā)布項(xiàng)目的ip地址;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass 轉(zhuǎn)發(fā)的ip地址;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
配置2個(gè)server 分別 監(jiān)聽 8080 8083 端口 配置轉(zhuǎn)發(fā)ip ,好后退出保存 nginx -s reload
我們就可以不同的訪問轉(zhuǎn)發(fā)ip實(shí)現(xiàn)nginx的反向代理
五參考文檔
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決feignClient調(diào)用時(shí)獲取返回對(duì)象類型匹配的問題
這篇文章主要介紹了解決feignClient調(diào)用時(shí)獲取返回對(duì)象類型匹配的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
java實(shí)現(xiàn)的小時(shí)鐘示例分享
這篇文章主要介紹了java實(shí)現(xiàn)的小時(shí)鐘示例,需要的朋友可以參考下2014-02-02
詳解Java實(shí)現(xiàn)緩存(LRU,FIFO)
本篇文章主要介紹了詳解Java實(shí)現(xiàn)緩存(LRU,FIFO) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04
SpringBoot啟動(dòng)過程的實(shí)現(xiàn)
這篇文章主要介紹了SpringBoot啟動(dòng)過程的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
深入了解Java SpringBoot自動(dòng)裝配原理
在使用springboot時(shí),很多配置我們都沒有做,都是springboot在幫我們完成,這很大一部分歸功于springboot自動(dòng)裝配。本文將詳細(xì)為大家講解SpringBoot的自動(dòng)裝配原理,需要的可以參考一下2022-03-03
java 多線程實(shí)現(xiàn)在線咨詢(udp)
這篇文章主要介紹了java 多線程實(shí)現(xiàn)在線咨詢(udp)的示例,幫助大家更好的理解和學(xué)習(xí)Java 網(wǎng)絡(luò)編程的相關(guān)內(nèi)容,感興趣的朋友可以了解下2020-11-11

