電商平臺(tái)中無(wú)論是前端還是后端會(huì)存在大量的業(yè)務(wù)應(yīng)用,在整個(gè)交易的過(guò)程中請(qǐng)求是在各個(gè)業(yè)務(wù)應(yīng)用中流轉(zhuǎn)的,對(duì)于用戶來(lái)講只需要登錄一次就可以訪問所有的業(yè)務(wù),這就是單點(diǎn)登錄SSO。
單點(diǎn)登錄開源有很多的解決方案,比如基于session的SSO和基于cookie的SSO。
業(yè)界使用比較多的基于session的SSO的開源解決方案比如CAS,流程示意圖如下:
這里不去詳細(xì)說(shuō)明流程,讀者可以參考其他資料的說(shuō)明
基于cookie的SSO在原理上和上面的差不多,區(qū)別是把用戶設(shè)置到cookie中作為token的一部分進(jìn)行傳遞,而基于session的SSO中cookie是服務(wù)器給客戶端生成的TGT。
相對(duì)來(lái)說(shuō),基于cookie的安全性不高。
以上是單機(jī)環(huán)境下的方案,更多的滿足傳統(tǒng)企業(yè)級(jí)的方案;而在電商平臺(tái)中,對(duì)SSO的性能、可用性、緩存數(shù)據(jù)量都是一個(gè)挑戰(zhàn),因此需要基于CAS做改造,滿足互聯(lián)網(wǎng)的要求。
簡(jiǎn)單對(duì)CAS的性能做了個(gè)壓測(cè):
軟硬件環(huán)境:兩個(gè)App,一個(gè)CAS Server。機(jī)器都是PC server,16core 32G
場(chǎng)景:用戶在一個(gè)迭代中做登陸、操作業(yè)務(wù)、登出操作
測(cè)試結(jié)果:
CAS Server的機(jī)器情況
top - 17:05:18 up 1 day, 8:39, 2 users, load average: 4.25, 2.62, 1.22
Tasks: 783 total, 1 running, 782sleeping, 0 stopped, 0 zombie
Cpu(s): 69.4%us, 5.9%sy, 0.0%ni, 22.7%id, 0.0%wa, 0.0%hi, 2.0%si, 0.0%st
Mem: 65964644k total, 16462164k used,49502480k free, 251036k buffers
Swap: 30719992k total, 0k used, 30719992k free, 1240744k cached
TPS:2000,RT:20-30ms
改造后的SSO的架構(gòu)示意圖如下:
1、 改造CAS Server為無(wú)狀態(tài)的節(jié)點(diǎn),以前緩存的ticket、用戶等信息放到后端的cache中
2、 后端Cache采用redis,去掉持久化的功能,只做cache用
3、 考慮數(shù)據(jù)量的關(guān)系,Cache采用分布式的方案,進(jìn)行數(shù)據(jù)切分,每個(gè)sharding只存儲(chǔ)一定范圍的數(shù)據(jù)
4、 每個(gè)sharding采用主備方式,leader作為主節(jié)點(diǎn),replica只作為備份,在主節(jié)點(diǎn)宕機(jī)時(shí)可以升級(jí)為主節(jié)點(diǎn)
5、 整個(gè)集群的采用zookeeper進(jìn)行分布式集群管理服務(wù)。
6、 App watch sso節(jié)點(diǎn)的變化,采用輪詢RR算法選擇一臺(tái)SSO Server進(jìn)行請(qǐng)求,SSOServer對(duì)ticket采用hash算法定位到后端的cache進(jìn)行存儲(chǔ)。
7、 用戶登出平臺(tái)時(shí),采用輪詢RR算法選擇一臺(tái)SSO Server進(jìn)行請(qǐng)求,清除Cache中的相關(guān)信息以及http方式回調(diào)各個(gè)應(yīng)用的登出服務(wù)接口
8、平臺(tái)初始化階段需要把cache的各個(gè)sharding分配到某臺(tái)SSO Server上做定時(shí)的Ticketexpire驗(yàn)證清理工作,也就是一臺(tái)SSO Server負(fù)責(zé)一個(gè)或者多個(gè)sharding的Ticketexpire工作,進(jìn)而http方式回調(diào)各個(gè)應(yīng)用的登出服務(wù)接口。
聯(lián)系客服