1、背景
最近博主在做微服務的子模塊,遇到下面情景問題,服務A和 服務B 都是後臺API接口服務,通過負載均衡進行發佈在兩臺linux服務器上面,前端頁面通過nginx調用這兩個服務,就產生了下面問題。頁面第一次請求訪問服務A,然後在和A服務做了登錄請求並且和A創建了會話session。然後在不可控的情況下,下一個接口調到了服務B,這時候頁面和服務B沒有會話session,導致被判定爲未登錄狀態,直接打回。
經過分析問題之後,找到微服務的解決辦法,只需要把服務A和服務B 的session通過redis共享起來就可以解決上面問題。
2、實現步驟
首先我們需要引用下面的包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
當然版本可以更具自身項目再另外做出調整。
我這裏介紹的是Spring booot的集成方式,比較簡潔、方便下面步驟
在application.properties配置文件中加上連接配置信息
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
然後就是最後一步在啓動類上面加上註解
@EnableRedisHttpSession(redisNamespace = "demo")
redisNamespace是可以區分項目,如果有很多項目都在用這一個redis可以加上這個配置進行區分,如果不需要區分其實也可以加上註解就行了。
然後就在服務A上 和服務B上的代碼都做出這樣的修改,就把服務A和B的session都共享到redis裏面了。
3、總結
其實發現這個問題的時候,會感覺很難做,無從下手,感覺這是一個很有難度的事情。但是如果仔細將問題原因分析出來,然後查找相關的資料,其實早就有很簡單的解決方案了。
因爲我的項目是Spring boot開發的所以集成Spring session redis非常容易。