利用memcached實現CAS單點登錄集群部署

前言:利用memcached實現CAS單點登錄集群部署

  • 負載均衡
    將接口請求的有狀態性變成無狀態性。是我們在實現負載均衡時必要要解決的問題。以應用接口的session狀態為例,一般解決方法都是將session數據和應用進行剝離,session數據統一保存到同一個數據源中,數據源就是保存數據的地方,我們常使用的MySQL數據庫就是一個數據源。通常為了性能更高,數據源一般采用內存數據庫(memcached、redis)。每當用戶訪問應用集群時,該請求被隨機分配到任何一個節點,節點訪問同一個數據源取session信息,保證了多個節點獲取到的session狀態是一致的。
  • 軟件版本
應用名稱端口版本主機IP
Nginx80881.0.1192.168.7.2
CAS-TomcatA80897.0.35192.168.7.3
n1:libevent2.1.8192.168.7.3
n1:memcached223221.5.12192.168.7.3
n1:magent120001.5.12192.168.7.3
CAS-TomcatB80897.0.35192.168.7.4
n2:libevent2.1.8192.168.7.4
n2:memcached223221.5.12192.168.7.4
n2:magent120001.5.12192.168.7.4
  • 應用架構圖
    利用memcached實現CAS單點登錄集群部署

    實現思路

    CAS(Central Authentication Service)單點登錄的實現依賴了spring-webflow和TGT的ST校驗,其中spring-webflow使用到了session數據,TGT對ST校驗使用到了內存中的數據。將這兩個功能的數據和應用剝離,便是我們實現CAS集群化的關鍵。TGT對ST校驗使用了java類:TicketRegistry。

  • spring-webflow:是基于Spring MVC,實現應用程序的"流程化",用于指導業務邏輯按照固定的流程進行。對應的數據時保存到server的session中。
  • TicketRegistry:CAS票據,存儲在TicketRegistry中,而TicketRegistry是存儲在內存中的,CAS為了擴展,提供了支持TicketRegistry分布式的接口:org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry。通過實現這個接口,將TGT等數據放到內存數據庫中。

步驟

    主要只有三個步驟:1.安裝memcached并配置magent代理2.session共享的配置3.TicketRegistry內存數據剝離的配置

一:安裝memcached并配置magent代理

    192.168.7.3和192.168.7.4兩個節點下都要安裝memcached和magent,安裝步驟只用192.168.7.3舉例。
  • 簡介
    安裝memcached時,需要先安裝依賴庫-libevent。libevent是一個強大的跨平臺事件通知庫,在 memcached 中 libevent 被用來處理網絡事件(連接請求,讀和寫) 或者被用來實現定時器。 使用 libevent 需要包含頭文件 event.h, 并且在 GCC 鏈接時需要使用選項 -levent。
  • 下載地址
    libevent:https://libevent.org/
    memcached:http://memcached.org/downloads
    本文末提供百度網盤的下載鏈接。
  • 安裝libevent和memcached
    創建一個新的文件夾,將libevent和memcached放入其中,并解壓,結果如下圖。
    利用memcached實現CAS單點登錄集群部署
    • libevent安裝命令如下:
      #安裝libevent-使用root賬號。
      # tar -zxvf libevent-2.1.8-stable.tar.gz
      # cd libevent-2.1.8-stable
      #./configure -prefix=/usr && make && make install
      #chmod -R 755 /usr/include 
      #chmod命令對其他用戶授權了libevent的使用權限,非root用戶也可以使用libevent。libevent的github地址:https://github.com/libevent/libevent

      執行結果截圖:
      利用memcached實現CAS單點登錄集群部署

    • memcached安裝命令如下:
      #root用戶安裝memcached
      # tar -zxvf memcached-1.5.12.tar.gz
      # cd memcached-1.5.12
      # ./configure -with-libevent=/usr --prefix=/usr/local/memcached && make && make install
      #chmod -R 755 /usr/local/memcached/ 
      #chmod命令對其他用戶授權了memcached的使用權限,非root用戶也可以使用memcached。

      執行結果截圖:
      利用memcached實現CAS單點登錄集群部署

    • 啟動命令,可使用非root用戶啟動:
      # /usr/local/memcached/bin/memcached -d -m 256 -p 22322 -c 1024 /tmp/memcached.pid
      無日志輸出,且ps -ef | grep memcached 后出現進程,則為成功。
      啟動參數說明:-d 選項是啟動一個守護進程。-m 是分配給Memcache使用的內存數量,單位是MB,默認64MB。-p 是設置Memcache的TCP監聽的端口,最好是1024以上的端口。-c 選項是最大運行的并發連接數,默認是1024。-P 是設置保存Memcache的pid文件。
      • 檢查memcached的運行狀態:
        首先用telnet 127.0.0.1 22322這樣的命令連接上memcache,然后直接輸入stats就可以得到當前memcache的狀態。退出使用"ctrl+]",再輸入quit,進行退出。參數解讀參考:https://blog.csdn.net/andy_dou/article/details/84811715
      • 停止命令:
        # kill -9 pid
    • magent安裝:
      1.執行以下命令修改文件
      # mkdir magent
      #mv magent-0.5.tar.gz magent/
      #cd magent/
      # tar -zxvf magent-0.5.tar.gz 
      # /sbin/ldconfig
      # sed -i "s#CFLAGS = -Wall -O2 -g#CFLAGS =-lrt -Wall -O2 -g#g" Makefile
      # sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile

      2.修改ketama.h文件:在第一行加入以下三行代碼
      #ifndef SSIZE_MAX
      #define SSIZE_MAX 32767
      #endif
      3.執行編譯命令
      #make
      編譯成功后會在該目錄下生成magent啟動腳本。
      4.執行啟動命令
      #./magent -n 51200 -l 192.168.7.3 -p 12000 -s 192.168.7.3:22322 -b 192.168.7.4:22322
      192.168.7.4主機上為:./magent -n 51200 -l 192.168.7.4 -p 12000 -s 192.168.7.4:22322 -b 192.168.7.3:22322。讓兩個memcached互為主備。
      啟動參數說明:
      -n 最大連接數。
      -l 代理的IP地址,即magent的訪問IP。
      -p 代理的端口地址,即magent的訪問端口。
      -s 代理的主節點,可以使用多個-s參數,代理多個主節點。
      -b 代理的備份節點,可以使用多個-b參數,代理多個備份節點。
      具體參數介紹可以使用./magent -help命令查詢。
      5.測試magent代理
      使用“telnet 192.168.7.3 12000”連接到magent代理上,執行“set test 0 0 2”的插入數據操作,退出12000連接。再次連接“telnet 192.168.7.3 22322”,執行“get test”命令,看是否可以輸出數據;連接“telnet 192.168.7.4 22322”,執行“get test”命令,看結果是否一致。一致則為成功。
      如圖:
      利用memcached實現CAS單點登錄集群部署

二:session共享的配置

    session共享完全由tomcat來實現,不必修改web應用。本文忽略Nginx實現負載的相關配置。
  • 上傳session共享所需的jar包
    將以下jar包放到tomcatlib下。本文是采用kryo序列化來實現session的序列化,不同的序列化實現方式,只是引用的jar包不同,方法一致。據說kryo效率比較高。
    相關jar包如下文:
        asm-5.0.3.jarkryo-3.0.3.jarkryo-serializers-0.37.jarmemcached-session-manager-1.9.5.jarmemcached-session-manager-tc7-1.9.5.jarminlog-1.3.0.jarmsm-kryo-serializer-1.9.5.jarobjenesis-2.1.jarreflectasm-1.10.1.jarspymemcached-2.12.0.jar
  • 修改tomcat的配置文件
    tomcat的conf目錄下的context.xml文件,先把默認的context.xml文件內容清空,再將以下代碼復制到context.xml中。其中memcachedNodes是memcached地址,多個memcached使用需","隔開。

                <?xml version='1.0' encoding='utf-8'?><!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor license agreements.  See the NOTICE file distributed withthis work for additional information regarding copyright ownership.The ASF licenses this file to You under the Apache License, Version 2.0(the "License"); you may not use this file except in compliance withthe License.  You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.--><!-- The contents of this file will be loaded for each web application --><Context><!-- Default set of monitored resources --><WatchedResource>WEB-INF/web.xml</WatchedResource><!-- Uncomment this to disable session persistence across Tomcat restarts --><!--<Manager pathname="" />--><!-- Uncomment this to enable Comet connection tacking (provides eventson session expiration as well as webapp lifecycle) --><!--<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />--><Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:192.168.7.3:12000,n2:192.168.7.4:12000"sticky="false"sessionBackupAsync="false"requestUriIgnorePattern=".*\.(ico|png|gif|jpg|jpeg|bmp|css|js|html|htm)$"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
    </Context>
  • 修改tomcat的conf/server.xml文件
    修改server.xml中Engine標簽,在其標簽中添加jvmRoute="tomcat1"屬性,用于區分多個tomcat應用
  • 檢驗Session共享
    利用如下代碼生成test.jsp,并將jsp放入tomcat的webapps中的工程里,可以訪問到的地方。

            <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><BR>SessionID:<%=session.getId()%><BR>SessionIP:<%=request.getServerName()%><BR>SessionPort:<%=request.getServerPort()%><BR>
    **分別**訪問兩個tomcat,只要session的后綴結尾類似于"-n1.tomcat1 "即為成功,sessionid是不一致的也是正確的。如下圖

利用memcached實現CAS單點登錄集群部署
利用memcached實現CAS單點登錄集群部署

三:將TicketRegistry內存數據寫入memcached

1.在cas的tomcat容器中添加一下jar包tomcat的路徑:/webapps/cas_sso/WEB-INF/lib/
        asm-5.0.3.jarcas-server-integration-memcached-3.5.1.jarkryo-3.0.3.jarminlog-1.3.0.jarreflectasm-1.10.1.jarspymemcached-2.12.0.jar
2.修改ticketRegistry.xml文件文件在Tomact中的路徑:/webapps/cas_sso/WEB-INF/spring-configuration/ticketRegistry.xml備份ticketRegistry.xml,并創建新的ticketRegistry.xml文件,內容如下:
            <?xml version="1.0" encoding="UTF-8"?><!--Licensed to Jasig under one or more contributor licenseagreements. See the NOTICE file distributed with this workfor additional information regarding copyright ownership.Jasig licenses this file to you under the Apache License,Version 2.0 (the "License"); you may not use this fileexcept in compliance with the License.  You may obtain acopy of the License at the following location:http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing,software distributed under the License is distributed on an"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANYKIND, either express or implied.  See the License for thespecific language governing permissions and limitationsunder the License.--><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-3.1.xsd"><bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.MemCacheTicketRegistry"><constructor-arg index="0"><bean class="net.spy.memcached.spring.MemcachedClientFactoryBean"p:servers="192.168.7.3:12000,192.168.7.4:12000"p:protocol="BINARY"p:locatorType="ARRAY_MOD"p:failureMode="Redistribute"p:transcoder-ref="serialTranscoder"><property name="hashAlg"><util:constant static-field="net.spy.memcached.DefaultHashAlgorithm.FNV1A_64_HASH" /></property></bean></constructor-arg><constructor-arg index="1" value="36000" /><constructor-arg index="2" value="2" /></bean><bean id="serialTranscoder" class="net.spy.memcached.transcoders.SerializingTranscoder"p:compressionThreshold="2048" /></beans>
參數說明:<constructor-arg index="0">:memcached的地址,多個用逗號隔開。<constructor-arg index="1">:TGT超時時間(秒)<constructor-arg index="1">:ST超時時間(秒)

3.重啟應用測試
使用Nginx做負載,代理兩個CAS服務端。
1.通過瀏覽器訪問Nginx單點登錄登陸后,通過日志查看訪問到哪個CAS節點,將該節點stop。
2.再次通過瀏覽器訪問Nginx,查看是否需要登錄,正常情況是不需要登錄的。成功后標識session共享成功。
3.通過瀏覽器進行cas客戶端訪問,如果沒有跳轉單點,則TGT數據保存到memcached共享成功。

后續:memcached的安全

使用memcached應用時,只需要能連接上主機端口就能用,如果放到互聯網上,這是很不安全的操作。使用memcached時,不要使用默認端口,換個1024以上的端口。針對于這個安全一般有三個解決方案,但每一種都有各自的局限性,可以根據自己的業務來做選擇。
1.雙網卡:應用服務選擇外網的網卡,memcached使用內網的網卡。
2.設置防火墻:使用主機的iptables進行白名單放行,阻止非信任的訪問請求。
3.memcached開啟SASL認證。1.4.3版本后支持此功能。

附件信息
鏈接: https://pan.baidu.com/s/1aihl_abcNguh9QVNSAWwNA 提取碼: 7r1r

轉載于:https://blog.51cto.com/8595476/2387647

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448897.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448897.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448897.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

注冊

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>注冊</title> {# 導入jQuery基礎類庫&#xff0c;才可以使用 $ #} <script src"../static/js/jquery-1.12.4.min.js"&…

Linux中10個有用的命令行補齊命令

本文由 極客范 - 踏雁尋花 翻譯自 Balakrishnan Mariyappan。歡迎加入極客翻譯小組&#xff0c;同我們一道翻譯與分享。轉載請參見文章末尾處的要求。在Linux系統中&#xff0c;輸入一個命令&#xff0c;再按兩次TAB鍵&#xff0c;就會列出所有以輸入字符開頭的可用命令。這并…

分布式開放消息系統 ( RocketMQ ) 的原理與實踐

分布式消息系統作為實現分布式系統可擴展、可伸縮性的關鍵組件&#xff0c;需要具有高吞吐量、高可用等特點。而談到消息系統的設計&#xff0c;就回避不了兩個問題&#xff1a; 消息的順序問題消息的重復問題RocketMQ作為阿里開源的一款高性能、高吞吐量的消息中間件&#xff…

數據結構02-鏈表

說明&#xff1a;由于該數據結構是由java并且是原生實現&#xff0c;所以與C有一些出入&#xff0c;不過原理是相同的 1.鏈表的定義 為了表示線性表元素a與a1的邏輯關系&#xff0c;存儲數據時&#xff0c;除了存儲元素本身的信息之外&#xff0c;還存儲了直接后繼元素的位置信…

第四章 面向對象

第四章 面向對象 1. 基本格式 定義&#xff1a;當函數(業務功能)比較多&#xff0c;可以使用面向對象來進行歸類&#xff0c;如果有一個凡事使用的公共值&#xff0c;也可以放到對象中 #格式&關鍵字 class 類名:def __inti__(self,x)self.x xdef 方法名(self,name):print(…

洛谷P2347 砝碼稱重 某一年noip提高組原題

可以轉化為01背包求方案數的問題&#xff0c;dp數組f[][]表示第幾個砝碼能稱出的重量,可壓縮至一維 轉移方程為f(i,j)f(i-1,j-w[i]) 當前我們可以稱出的重量必定是由之前的砝碼重量轉移過來的 #include<bits/stdc.h> using namespace std; const int N550; const int max…

解決:-bash: unzip: command not found (Linux 中 unZip/Zip 的安裝及使用)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux系統沒有自帶的壓縮解壓工具&#xff1b;需要我們自己安裝&#xff1b; 當用到zip或者unzip如果沒有安裝就會出現 unzip: Command…

云計算時代IT專業人員需具備的10項技能

摘要&#xff1a;IT專業人員需要不斷的學習&#xff0c;才能確保自己的工作能力跟上時代的步伐。云時代IT專業人員不僅需要具備一定的專業技能&#xff0c;比如快速運用自身知識快速在互聯網上構建應用程序&#xff0c;還必須具備商業、金融、業務需求分析等等。 【編者按】談…

java自定義注解學習筆記

注解學習筆記之自定義注解 Target&#xff08;{1,2,3,4,5,6,7}&#xff09; 1.ElementType.CONSTRUCTOR:用于描述構造器2.ElementType.FIELD:用于描述域3.ElementType.LOCAL_VARIABLE:用于描述局部變量4.ElementType.METHOD:用于描述方法5.ElementType.PACKAGE:用于描述包6.Ele…

[xsy3132]數表

題意&#xff1a;一個$n\times m$的數表&#xff0c;數值$\in[0,4)$&#xff0c;你可以任意次選擇一行或一列$1,\text{mod }4$&#xff0c;要最小化所有數的和 因為$n\leq10$&#xff0c;所以數表可以看成$m$個$n$位$4$進制數$a_{1\cdots m}$&#xff0c;以下使用不進位加法 定…

linux 下載、安裝 maven

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 創建maven的文件夾并下載maven的tar包到此文件夾中 //進入一個目錄 cd /usr/local//創建一個文件夾 mkdir maven//下載maven的tar包…

ELK4之進階學習

1.精確查找和模糊查找(term和match的區別) match經過分析(analyer)的, term是不經過分詞,直接去倒排索引中查找精確的值. 2.建議器的簡介(最左前綴或者自帶的做) (1)直接用現成的 (2)不只是糾錯,還有建議等等. (3)優點:用戶體驗,服務器減少請求(減少壓力,太耗電了,熱量太大) (4…

女人必知 教你認清6種隱性壞男人

周圍不乏有女朋友喜歡歷數往事、追憶曾擦肩而過的男人&#xff0c;有的說如果不是自己太苛求提早要見他家人引起反感&#xff0c;早就和心愛的人儷影雙雙甜蜜快樂了&#xff0c;還有的說暗戀的男生那一夜向他表露情感、她萬分感動、可男生最后提出上床她拒絕了、因而錯失了一段…

c# 編程學習(二)

2019獨角獸企業重金招聘Python工程師標準>>> 標識符是對程序中的各個元素進行標識的名稱。 ? 只能使用字母(大寫和小寫)、數字和下劃線 ? 標識符必須以字母或下劃線開頭 變量是容納值的存儲位置。可將變量想象成容納臨時信息的容器 命名變量的建議&#xff1a; …

linux 中的 nohup 命令(設置后臺進程): nohup: ignoring input and appending output to ‘nohup.out’

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 一、Linux 下使用 nohup Unix/Linux下一般比如想讓某個程序在后臺運行&#xff0c;很多都是使用 & 在程序結尾來讓程序自動運行。 …

PowerDesigner表結構和字段大小寫轉換

原文&#xff1a;https://www.cnblogs.com/zhzhang/p/3946609.html 【轉】PowerDesigner表結構和字段大小寫轉換 【轉自】http://blog.csdn.net/xysh1991/article/details/8016192 使用方法&#xff1a;進入PowerDesigner&#xff0c;打開一個PDM&#xff0c;在菜單欄找到&…

解決:Could not find or load main class org.apache.rocketmq.example.quickstart.Producer

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.情景描述 &#xff1a;我只是想安裝運行 rocketmq&#xff0c;執行命令&#xff1a; sh bin/tools.sh org.apache.rocketmq.example.…

深入理解C++ 虛函數表

目錄 深入理解C 虛函數表虛函數表概述單繼承下的虛函數表派生類未覆蓋基類虛函數派生類覆蓋基類虛函數多繼承下的虛函數表無虛函數覆蓋派生類覆蓋基類虛函數鉆石型虛繼承總結幾個原則安全性問題深入理解C 虛函數表 ? C中的虛函數的作用主要是實現了多態的機制。關于多態&#…

react-native-baidu-map使用及注意問題

使用組件&#xff1a; react-native-baidu-map 獲取百度地圖API_KEY 地址&#xff1a;lbsyun.baidu.com&#xff0c;在控制臺成功創建應用后&#xff0c;就可以看到應用的api key了 安裝 yarn add react-native-baidu-map 復制代碼原生部分 Android配置 react-native link reac…

簡單掃清身體垃圾

“我們的身體在被‘設計’之初&#xff0c;就擁有了自主掃除體內垃圾的功能。只不過&#xff0c;這需要我們按照正確的方法去激發它 。”美國暢銷書作者喬斯卡曼和朱莉佩萊斯&#xff0c;在她們去年合著的《自我清潔》一書中強調了養成良好生活習慣可為身體排毒的重要性。 近日…