1. 程式人生 > >spring-boot+Redis實現簡單的分散式叢集session共享

spring-boot+Redis實現簡單的分散式叢集session共享

  寫在前面:

     首先宣告,筆者是一名Java程式設計屆的小學生。前面一直在幾家公司裡面做開發,其實都是一些傳統的專案,對於像分散式啦,叢集啦一些大型的專案接觸的很少,所以一直沒有自己整合和實現過。由於最近幾天專案不是很忙,自己又有點時間所以就想自己玩玩。以下的專案全是筆者自己一手搭建起來的,但是由於技術有限可能不是很完美。如果哪位大佬發現問題歡迎在下方批評指正~~

    好了,廢話不在多說,我們先從下面這張圖開始(ps:由於筆者沒畫過圖,所以還請大家將就這看吧!)

 在這個圖中我們可以看出大概的實現流程及方式,下面我們用專案來說明一下。請往下看

1.先看一下我專案的pom檔案

2.接下來我們看一下Redis的配置資訊,在專案的application.yml裡面,由於我配置了多環境,所以我的放在了application-local.yml裡面,直接在application.yml裡面引入local就行了。

 application.yml裡面引入local的配置

3.然後是Redis的操作類,網上很多,我也是在網上找的。

4.然後我們編寫測試的model,mapper,service和controller。model和mapper我就不再貼出來了,我們只說service和controller。下面是service的程式碼。

  public Map getList(int page, int size) {
        Map params = new HashMap<>();
        params.put("page", (page - 1) * size);
        params.put("size", size);
        Map map = new HashMap<>();
        map.put("total", testMapper.selectCount(null));
        map.put("list", testMapper.selectList(params));
        return map;
    }

這是一會測試用的獲取列表方法。

上圖中紅框內的就是登入成功後把當前的session放入Redis裡面,由於我是簡單的測試沒用到別的使用者資訊,所以我是用sessionID做key然後放入的一個UUID並設定它的超時時間,單位為秒,上圖也就是設定的30分鐘後過期。

5.接下來是controller的測試程式碼

這是測試列表的介面,上面的@ApiOperation和@ApiImplicitParams註解是swagger-ui的註解它可以直接在頁面展示請求介面的引數名稱和型別,咱們這次不說swagger-ui,所以我在此就不在多說了。下次有機會單獨說一下。

上圖中紅框內的是我自定義了一些異常的捕獲和丟擲到頁面。由於我們在登入的方法裡面把session放入的Redis

6.但是我們在接下來的使用者其他請求中怎麼驗證呢?不可能在每個方法裡面都驗證一次吧。說到這我相信有的同學已經想到了,對,就是用Filter(攔截器),我們需要定義一個全域性的攔截器,請看下邊

注意上圖程式碼中的註解,在springboot專案中需要加入上面的註解,下面方法的作用是在專案啟動的時候把自定義需要忽略的請求放入Set中。

上面程式碼中我的註釋加的很詳細,所以我就不在過多的介紹了。因為我想把這個專案做成前後端分離的,所以我定義了攔截全部非ajax的請求,防止通過url拼接的方式訪問系統。

7.接下來我們啟動主程式測試一下

可以看到已經啟動成功,由於我們攔截了非ajax請求所以下面我們使用postman測試一下

 我們先請求一下獲取列表的介面請看下邊的返回資訊

在看一下我們專案的控制檯輸出

可以看到介面已經按照我們的邏輯返回資訊,那個msg就是我們自定義的異常資訊,下面的異常資訊就是我們自定義的異常列舉

接下來我們使用錯誤的賬號密碼登陸一下看看能不能按照我們的邏輯返回

OK,使用錯誤的賬號密碼也可以按我們定義的資訊返回,下面我們使用正確的賬號和密碼登入一下,看看可不可以成功登入

哎呀呀,沒有按照我們的預想執行,還拋了一個小小的異常。不過很簡單,我們根據丟擲的異常資訊很容易定位到問題的所在,所以說專案中自定義一些異常資訊還是有一定用處的。下面我們把Redis開啟在登入一下

 

好了,返回了登入成功的資訊,這次我們在訪問一下獲取列表的介面看一下有沒有什麼驚喜,下面是剛才沒有登入以前訪問的返回資訊,提示我們登入已過期

 

這次我們在重新訪問一次

歐耶,這次是真的可以了。因為我們設定了過期時間為30分鐘,所以我們中間不做任何動作的情況下(也就是不在有效時間內訪問任何介面),過30分鐘以後再訪問除登入外的任何介面,都會返回給我們上邊那個登入資訊已過期的資訊。

寫在最後:

    到此,這個簡單的session共享就完成了,只要使用者的瀏覽器不宕,不管把請求轉發到哪個service都可以得到使用者的session資訊。好了,就這樣吧!希望大家一起進步哈。我這也算是拋磚引玉了,歡迎各位大佬的批評和指正~~~~~