CAS單點登錄(十二)——集群部署
通過前面一系列的文章介紹,關於CAS的基本知識點大致介紹完了,今天講解一下CAS中集群的部署。我們知道當訪問量越來越來多時,我們需要對CAS服務的性能進行提升,而通過集群的方式提高CAS的服務性能是比較直接的。
在部署的服務中,通過使用nginx來實現負載均衡分發到CAS具體的服務上,但是我們知道前端每次訪問時是隨機訪問分配的,所以就會出現session共享問題,同時在不同CAS中的TGT分配的ticket也不同,因為默認ticket是保存在內存中的。所以我們需要統一管理session和ticket來解決問題。
今天我們來講解一下CAS的集群部署的使用,在開頭我們提到了session和ticket存儲管理的方式,在集群下目前使用redis方式,是比較流行和簡單的方式,所以今天我們采用這種方式來解決。
一、Ticket的持久化
在前面的第五章,我們講解過Service配置不同方式的持久化,這里的session和ticket方式其實也大致類似,我們通過查看官方文檔,可以發現官方提供了多種不同Ticket的持久化方式,包括:
JPA
CouchDb
Couchbase
Hazelcast
MongoDb
Redis
…
一系列的操作方式,可以根據自己的需求選擇合適的方式即可,這里我們采用Redis配置。
首先引入具體的依賴:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-redis-ticket-registry</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
然后在application.properties中添加如下redis的相關配置:
##
# Ticket Registry配置
#
cas.ticket.registry.redis.host=localhost
cas.ticket.registry.redis.database=0
cas.ticket.registry.redis.port=6379
cas.ticket.registry.redis.password=
cas.ticket.registry.redis.timeout=2000
cas.ticket.registry.redis.useSsl=false
cas.ticket.registry.redis.usePool=true
cas.ticket.registry.redis.pool.max-active=20
cas.ticket.registry.redis.pool.maxIdle=8
cas.ticket.registry.redis.pool.minIdle=0
cas.ticket.registry.redis.pool.maxActive=8
cas.ticket.registry.redis.pool.maxWait=-1
cas.ticket.registry.redis.pool.numTestsPerEvictionRun=0
cas.ticket.registry.redis.pool.softMinEvictableIdleTimeMillis=0
cas.ticket.registry.redis.pool.minEvictableIdleTimeMillis=0
cas.ticket.registry.redis.pool.lifo=true
cas.ticket.registry.redis.pool.fairness=false
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Redis的地址和密碼更改給相應的配置即可,然后我們啟動CAS服務。
當我們登錄成功后,可以在Redis相應的客戶端查看到具體的信息,如下:
同時當我們退出登錄后,Redis中的ticket也被銷毀掉了。
二、Session的持久化
Session的持久化和Ticket類似,官方同時也為我們提供了多種方式可選。如下:
Client-side
Server-side
Hazelcast
Redis
MongoDb
這里我們選擇Redis方式進行配置,同樣添加依賴。
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp-session-redis</artifactId>
<version>${cas.version}</version>
</dependency>
1
2
3
4
5
同時在application.properties中添加配置項,如下:
##
# Session Redis配置
#
cas.webflow.autoconfigure=true
cas.webflow.alwaysPauseRedirect=false
cas.webflow.refresh=true
cas.webflow.redirectSameState=false
cas.webflow.session.lockTimeout=30
cas.webflow.session.compress=false
cas.webflow.session.maxConversations=5
spring.session.store-type=redis
spring.redis.host=localhost
spring.redis.password=
spring.redis.port=6379
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
同樣的將Redis更改為相應的配置即可。重啟服務,可以發現Redis中的Session保存在其中了。
現在我們測試一下集群環境下的CAS是否可用,為了方便測試,我們關閉掉https,在Tomcat中的Server.xml配置了配置http的設置,這里配置了8080和8081端口。
如果CAS要使用http還需要配置,如下:
##
# 允許http配置
#
cas.tgc.secure=false
cas.warningCookie.secure=false
1
2
3
4
5
重新啟動服務,現在我們啟動了2個CAS服務來模擬集群情況,分別在8080和8081端口。
通過添加加密配置,如下:
cas.tgc.crypto.enabled=false
1
注意:使用redis進行session的緩存的時候,起初沒有配置這個的時候(當然.signing.key和encryption.key也沒有配置)。發現進去無法進行共享session,這是因為cas每次啟動的時候會隨機生成這兩個key的值,這樣集群部署的時候就會出現這兩個值不一樣。當然除了配置false以外,還有一種方式就是將這兩個值賦予固定的值。
三、配置Nginx實現負載均衡
在Nngix中主要配置upstream參數,默認按照輪詢調度的策略選擇組內服務器處理請求。
在http模塊下配置如下:
upstream cas {
server localhost:8081;
server localhost:8080;
}
1
2
3
4
然后再在server模塊中配置如下:
server {
listen 81;
# server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
proxy_pass http://cas;
}
# .....
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
然后我們啟動Nginx服務,訪問http://localhost:81/,然后輸入信息進行登陸。發現並不能成功登陸CAS,如果我們更改Nginx中的配置如下:
upstream cas {
server localhost:8081;
server localhost:8080;
ip_hash;
}
1
2
3
4
5
重啟Nginx發現登錄成功!!奇怪了為啥我們統一了session使用Redis管理了,怎么還需要配置ip_hash,那還不如不進行統一管理redis來管理session了。我們知道ip_hash是對每個請求按訪問的ip的hash結果分配,這樣每次客戶端ip固定訪問一個后端服務器,可以解決session的問題。
那是因為我們CAS管理session沒起作用?我們嘗試更換http://localhost:8081或http://localhost:8080登錄,刷新其他頁面http://localhost:81發現登錄成功!然后退出一個CAS服務,其他所以CAS服務都退出了。那說明Redis中的session起作用了,可為啥還是不行?
這個是因為CAS每次登錄需要刷新多次才可以登錄成功,也就是登錄過程發起了多次訪問。所以當第一次訪問http://localhost:8081,第二次又跑到http://localhost:8080,所以在http://localhost:81登錄總是失敗。
目前可以通過在upstream中配置jvm_route、sticky或ip_hash來解決,如果你有更好方案,請告知,學習一下。
代碼實例:Chapter11
參考
關於CAS 負載均衡 無狀態部署改造點。
CAS5.2x單點登錄(十四)---------cas集群部署
cas5.3.2單點登錄-分布式部署(二十一)
https://apereo.github.io/cas/5.3.x/installation/Configuration-Properties.html#spring-webflow
https://apereo.github.io/cas/5.3.x/installation/Webflow-Customization-Sessions.html
————————————————
版權聲明:本文為CSDN博主「Anumbrella」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Anumbrella/article/details/90578300