Springsession nginx反向代理整合過程
一概述
springsession 配置,如果是sevlet的web應用後會自動整合 jdbc,redis,Hazelcast,MongoDB
二session概述
2.1 分散式專案的session問題
在分散式專案中如果客戶端給服務端傳送了一個請求,在nginx做反向代理的情況下,第一個請求可能到達tomcat1,此時tomcat1就會建立一個session然後將響應給客戶端;同理客戶端再次傳送一個請求,然後nginx又做了一次反向代理,此時的請求可能到達tomcat2,此時tomcat2會建立一個session響應給客戶端;那麼問題就產生了,同一個客戶端發了2個請求,結果造成兩次會話的資料不一致。
2.2主流的解決方案
針對2.1分散式session共享問題,當代主流的解決方案是使用redis做session以達到session共享的目的。請求達到不同的tomcat之後都會往同一個redis中寫資料, 當tomcat響應資料的時候就會往同一個redis中讀資料 以前我們需要手動的將tomcat獲得的session資料存到redis,響應的時候再去redis中取資料。現在springsession會自動幫我們的資料從tomcat中同步到redis,或者自動的從redis中取資料。
三session共享實現方案
3.1環境說明
1jdk1.8
2redis5.05
3idea工具
4maven構建
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啟動器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- web啟動器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- spring session啟動器 --> <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("設定session"); return "set spring session success"; } @GetMapping("get/spring/session") public String getSpringSession(HttpSession httpSession){ httpSession.setAttribute("user","youku1327"); System.out.println("響應session"); return httpSession.getAttribute("user").toString(); } }
3.5啟動類
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啟動兩個例項
3.7測試
訪問8080埠設定session
訪問8083埠獲得session
3.8預設是spring:session做為key字首有需要改變可以在yml中配置
四nginx反向代理說明
在nginx安裝目錄的conf資料夾的nginx.conf
server { listen 埠; server_name 釋出專案的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 轉發的ip地址; proxy_connect_timeout 600; proxy_read_timeout 600; } }
配置2個server 分別 監聽 8080 8083 埠 配置轉發ip,好後退出儲存 nginx -s reload
我們就可以不同的訪問轉發ip實現nginx的反向代理
五參考文件
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。