springboot+spring session+redis+nginx實現session共享和負載均衡

環境

centos七、 jdk1.八、nginx、redis、springboot 1.5.8.RELEASEjava

session共享

  1. 添加spring session和redis依賴nginx

    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
     <groupId>org.springframework.session</groupId>
     <artifactId>spring-session</artifactId>
    </dependency>
  2. application.properties配置git

# session 存入 redis
spring.session.store-type=redis

# redis config
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=20000
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.timeout=0

此處redis密碼設置爲123456github

  1. 測試代碼redis

    @RequestMapping("user")
    @RestController
    public class UserController {
    
        @GetMapping("getSessionId")
        public String getSessionId(HttpServletRequest request) {
            String sessionId = request.getSession().getId();
            System.out.println(sessionId);
            return sessionId;
        }
    }

    項目完整代碼下載地址:[springboot-session-redis]: https://github.com/linj6/springboot-learn/tree/master/springboot-session-redisspring

 

負載均衡

nginx.conf配置centos

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    
    keepalive_timeout  65;

    upstream springboot-session-redis {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }

    server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://springboot-session-redis;
            proxy_set_header Host                $host;
            # 此配置使得服務端能夠獲取客戶端真實ip
            proxy_set_header X-Real-IP           $remote_addr;
            proxy_set_header X-Forwarded-For     $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto   $scheme;
            proxy_redirect                       off;
        }
    }
}

測試

  1. 啓動redisspringboot

    systemctl start redis
  2. 啓動三個應用服務bash

    使用maven打包成jar包後 ,在後臺運行三個服務,端口分別爲808一、808二、8083,日誌分別輸出到nohup.out、nohup2.out、nohup3.outsession

    nohup java -jar springboot-session-redis-0.0.1-SNAPSHOT.jar --server.port=8081 > nohup.out &
    nohup java -jar springboot-session-redis-0.0.1-SNAPSHOT.jar --server.port=8082 > nohup2.out &
    nohup java -jar springboot-session-redis-0.0.1-SNAPSHOT.jar --server.port=8083 > nohup3.out &
  3. 啓動nginx

  4. 訪問http://ip/user/getSessionId

    1. 頁面顯示sessionId的值

    ​ nginx默認負載均衡策略是採用輪詢,此處啓動了三個服務,因此訪問三次該網址,查看三個服務的日誌,會發現每一個服務處理了一次請求。

    以下圖:

    nohup.out

    nohup2.out

    nohup3.out

    從上圖可知三次輸出的sessionId的值也是同樣的,因此實現了session共享,也經過nginx實現了負載均衡。

  5. 查看redis存儲的值

能夠看到生成了三個與spring session相關的key

相關文章
相關標籤/搜索