spring-session+nginx實(shí)現(xiàn)session共享和負(fù)載均衡

一边败、為什么需要session共享

HttpSession是由servelet容器進(jìn)行管理的挡鞍。而我們常用的應(yīng)用容器有 Tomcat/Jetty等法褥, 這些容器的HttpSession都是存放在對應(yīng)的應(yīng)用容器的內(nèi)存中丹禀,在分布式集群的環(huán)境下摩疑,通常我們使用Nginx或者LVS危融、Zuul等進(jìn)行反向代理和負(fù)載均衡,因此用戶請求是由一組提供相同服務(wù)的應(yīng)用來進(jìn)行處理雷袋,而用戶最終請求到的服務(wù)由Nginx和LVS吉殃、Zuul進(jìn)行確定辞居。
那么問題就來了,我們怎樣保證多個相同的應(yīng)用共享同一份session數(shù)據(jù)蛋勺?對于這種問題Spring為我們提供了Spring Session進(jìn)行管理我們的HttpSession瓦灶。

二、基礎(chǔ)Spring Boot配置Spring Session

1.添加Spring session的包抱完,而Spring session 是將HttpSession存放在Redis中贼陶,因此需要添加Redis的包。我們這里是用了Spring boot進(jìn)行配置Redis巧娱。
<dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session</artifactId>
                <version>1.3.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.3.5.RELEASE</version>
        </dependency>
        <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
                <version>1.2.2.RELEASE</version>
                <type>pom</type>
        </dependency>
2碉怔、啟動類使用@EnableRedisHttpSession注解進(jìn)行配置啟用使用Spring session
@SpringBootApplication
@MapperScan(basePackages = "com.engine56.container.common.mapper")
@EnableTransactionManagement
public class ContainerApplication {
    
    public static void main( String[] args ){
        new SpringApplicationBuilder(ContainerApplication.class).web(true).run(args);
    }
3、配置我們的Redis鏈接禁添,我們這里使用的是Spring Boot作為基礎(chǔ)進(jìn)行配置撮胧,因此我們只需要在YML或者Properties配置文件添加Redis的配置即可。此處在application.properties中配置
spring.redis.database=0
# Redis服務(wù)器地址
spring.redis.host=127.0.0.1
# Redis服務(wù)器連接端口
spring.redis.port=6379
# Redis服務(wù)器連接密碼(默認(rèn)為空)
spring.redis.password=123456
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
spring.redis.pool.max-active=8
# 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=8
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=0
4老翘、在controller編寫代碼
@GetMapping("/session")
    public String test(HttpServletRequest request){
        HttpSession session = request.getSession();  
        UUID uid = (UUID) session.getAttribute("uid");
        String msg = "拿到了session!";
        if (uid == null) {  
            uid = UUID.randomUUID();  
            session.setAttribute("uid", uid);
            session.setAttribute("userinfo","張三芹啥,男,12歲");
            msg="沒拿到session";
        }else{
            return msg+" :::  "+session.getAttribute("userinfo");
        }
        return msg;
    }
5铺峭、測試

將項目用兩個不同端口啟動墓怀,用第一個端口訪問后,用第二個端口再訪問卫键,看是否拿到session傀履。
測試結(jié)果:第一次訪問輸出:沒拿到session;第二次訪問輸出:拿到了session永罚!張三啤呼,男,12歲呢袱。

三官扣、SpringSession與shiro集成

1、首先要了解springSession實(shí)現(xiàn)原理
  • 通過@EnableRedisHttpSession可以知道羞福,Spring Session是通過RedisHttpSessionConfiguration類進(jìn)行配置惕蹄,該類是用于創(chuàng)建一個過濾SessionRepositoryFilter
    擴(kuò)展知識:Spring Session提供了3種方式存儲session的方式。
    @EnableRedisHttpSession-存放在緩存redis
    @EnableMongoHttpSession-存放在Nosql的MongoDB
    @EnableJdbcHttpSession-存放數(shù)據(jù)庫
  • 此filter放在所有filter之前治专,接管session管理卖陵。
  • 如何獲取getSession:
    先檢查是不是已經(jīng)有session了。如果有的話张峰,就將其返回泪蔫,
    否則的話,它會檢查當(dāng)前的請求中是否有session id喘批。
    如果有的話撩荣,將會根據(jù)這個session id铣揉,從它的SessionRepository中加載session。
    如果session repository中沒有session餐曹,或者在當(dāng)前請求中逛拱,沒有當(dāng)前
    session id與請求關(guān)聯(lián)的話,那么它會創(chuàng)建一個新的session台猴,并將其
    持久化到session repository中
  • 如何存儲session
    請求時朽合,先獲取當(dāng)前session,不為空時即保存session饱狂。保存后曹步,判斷
    當(dāng)前請求中的sessionId是否與當(dāng)前sessionId一致,若不一致休讳,則將當(dāng)
    前sessionId保存至cookie箭窜。
2、shiro配置
@Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(EgRealm myShiroRealm) {
        DefaultWebSecurityManager dwsm = new DefaultWebSecurityManager();
        dwsm.setRealm(myShiroRealm);
        //<!-- 用戶授權(quán)/認(rèn)證信息Cache, 采用EhCache 緩存 --> 
        dwsm.setCacheManager(getEhCacheManager());
        return dwsm;
    }

ServletContainerSessionManager:DefaultWebSecurityManager使用的默認(rèn)實(shí)現(xiàn)衍腥,用于Web環(huán)境,其直接使用Servlet 容器的會話纳猫;
故婆咸,不需要再額外配置,spring-session直接為shiro所用芜辕。

三尚骄、nginx實(shí)現(xiàn)負(fù)載均衡

以上實(shí)現(xiàn)了session共享后,如何做到負(fù)載均衡就要靠nginx了侵续,配置如下:
(具體需要如何配置看項目業(yè)務(wù)需要了)

upstream blank {
        server 127.0.0.1:3000 weight=10;
        server 127.0.0.1:3001 weight=1;
    }

    server {
        listen       8000;
        server_name  localhost; 
    location ~^/engine56{
        proxy_pass  http://blank;//注意:blank要和上面upstream后的名稱一致倔丈。
        }
        location / {
            root  D:\xxxx\xxxxx;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市状蜗,隨后出現(xiàn)的幾起案子需五,更是在濱河造成了極大的恐慌,老刑警劉巖轧坎,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宏邮,死亡現(xiàn)場離奇詭異,居然都是意外死亡缸血,警方通過查閱死者的電腦和手機(jī)蜜氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捎泻,“玉大人飒炎,你說我怎么就攤上這事“驶恚” “怎么了郎汪?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵赤赊,是天一觀的道長。 經(jīng)常有香客問我怒竿,道長砍鸠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任耕驰,我火速辦了婚禮爷辱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘朦肘。我一直安慰自己饭弓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布媒抠。 她就那樣靜靜地躺著弟断,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趴生。 梳的紋絲不亂的頭發(fā)上阀趴,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音苍匆,去河邊找鬼刘急。 笑死,一個胖子當(dāng)著我的面吹牛浸踩,可吹牛的內(nèi)容都是我干的叔汁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼检碗,長吁一口氣:“原來是場噩夢啊……” “哼据块!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起折剃,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤另假,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后怕犁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浪谴,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年因苹,在試婚紗的時候發(fā)現(xiàn)自己被綠了苟耻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡扶檐,死狀恐怖凶杖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情款筑,我是刑警寧澤智蝠,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布腾么,位于F島的核電站,受9級特大地震影響杈湾,放射性物質(zhì)發(fā)生泄漏解虱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一漆撞、第九天 我趴在偏房一處隱蔽的房頂上張望殴泰。 院中可真熱鬧,春花似錦浮驳、人聲如沸悍汛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽离咐。三九已至,卻和暖如春奉件,著一層夾襖步出監(jiān)牢的瞬間宵蛀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工县貌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糖埋,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓窃这,卻偏偏與公主長得像,于是被迫代替她去往敵國和親征候。 傳聞我的和親對象是個殘疾皇子杭攻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容