高可用笔记(8) CAS集群

简介: CAS是耶鲁大学提供的一套开源的单点登录系统。这里用ehcache做同步缓存实现CAS集群。

测试环境

host1 192.168.30.1
host2 192.168.30.2

准备环境

在host1和host2的tomcat目录下(/var/lib/tomcat/webapps/)部署cas.war

高可用方案

cas_ha

在cas/WEB-INF/classes下新建文件ehcache-replicated.xml:


<ehcache name="ehCacheTicketRegistryCache" 
         updateCheck="false" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

   <diskStore path="java.io.tmpdir/cas"/>

    <!-- Automatic Peer Discovery
       <cacheManagerPeerProviderFactory 
            class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
            properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"
            propertySeparator="," />
       -->
   
   <!-- Manual Peer Discovery -->
<!-- 注意,这里配置远程ehcache主机的ip -->
   <cacheManagerPeerProviderFactory 
                class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
                properties="peerDiscovery=manual,
                rmiUrls=//remotehost:40001/org.jasig.cas.ticket.ServiceTicket|//remotehost:40001/org.jasig.cas.ticket.TicketGrantingTicket" />
  
               <!-- 这里配置本机ehcache的port -->
   <cacheManagerPeerListenerFactory 
            class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
            properties="port=40001" />
</ehcache>

备份原来的/cas/WEB-INF/spring-configuration/ticketRegistry.xml,重新建一个ticketRegistry.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to Jasig under one or more contributor license
    agreements. See the NOTICE file distributed with this work
    for 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 file
    except in compliance with the License.  You may obtain a
    copy of the License at the following location:

      http://www.apache.org/licenses/LICENSE-2.0

    Unless 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 ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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.xsd">
    <description>
        Configuration for the EhCache TicketRegistry which stores the tickets in a distributed EhCache and cleans
        them out as specified intervals.
    </description>

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache-replicated.xml" />
        <property name="shared" value="false" />
        <property name="cacheManagerName" value="ticketRegistryCacheManager" />
    </bean>

    <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.EhCacheTicketRegistry"
            p:serviceTicketsCache-ref="serviceTicketsCache"
            p:ticketGrantingTicketsCache-ref="ticketGrantingTicketsCache" />

    <bean id="abstractTicketCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean" abstract="true">
        <property name="cacheManager" ref="cacheManager" />
        <property name="diskExpiryThreadIntervalSeconds" value="0" />
        <property name="diskPersistent" value="false" />
        <property name="eternal" value="false" />
        <property name="maxElementsInMemory" value="10000" />
        <property name="maxElementsOnDisk" value="0" />
        <property name="memoryStoreEvictionPolicy" value="LRU" />
        <property name="overflowToDisk" value="false" />
        <property name="bootstrapCacheLoader">
            <ref local="ticketCacheBootstrapCacheLoader"/>
        </property>
    </bean>
    
    <bean id="serviceTicketsCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean" parent="abstractTicketCache">
        <description>
            Service Tickets (ST) and Proxy Tickets are only valid for short amount of time (default is 10 seconds), and
            most often are removed from the cache when the ST is validated.  The ST cache must be replicated quickly
            since validation is expected within a few second after its creation.  The CAS instance validating the ST may
            not be one that created the ST, since validation is a back-channel service-to-CAS call that is not aware of
            user session affinity.  Synchronous mode is used to ensure all CAS nodes can validate the ST.
        </description>
        <property name="cacheName" value="org.jasig.cas.ticket.ServiceTicket" />
             
        <property name="cacheEventListeners">
            <ref local="ticketRMISynchronousCacheReplicator"/>
        </property>
        
        <!-- 
            The maximum number of seconds an element can exist in the cache without being accessed. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTI eviction takes place (infinite lifetime).
         -->
        <property name="timeToIdle" value="0" />
        
        <!-- 
            The maximum number of seconds an element can exist in the cache regardless of use. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTL eviction takes place (infinite lifetime).
        -->
        <property name="timeToLive" value="300" />
    </bean>
    
    <bean id="ticketGrantingTicketsCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean" >
        <description>
            Ticket Granting Tickets (TGT) are valid for the lifetime of the SSO Session.  They become invalid either
            by expiration policy (default 2 hours idle, 8 hours max) or by explicit user sign off via /cas/login.
            The TGT cache can be replicated slowly because TGT are only manipulated via web user started operations
            (mostly grant service ticket) and thus benefit of web session affinity.
        </description>
        
        <property name="cacheName" value="org.jasig.cas.ticket.TicketGrantingTicket" />
              
        <property name="cacheEventListeners">
            <ref local="ticketRMIAsynchronousCacheReplicator"/>
        </property>
        
        <!-- 
            The maximum number of seconds an element can exist in the cache regardless of use. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTL eviction takes place (infinite lifetime).
            
            For this sample configuration, 2 hours of inactivity before ticket granting tickets 
            are expired automatically
        -->
         
        <property name="timeToIdle" value="7201" />
        
        <!-- 
            The maximum number of seconds an element can exist in the cache without being accessed. 
            The element expires at this limit and will no longer be returned from the cache. 
            The default value is 0, which means no TTI eviction takes place (infinite lifetime).
         -->
        <property name="timeToLive" value="0" />
    </bean>
    
    <bean id="ticketRMISynchronousCacheReplicator" class="net.sf.ehcache.distribution.RMISynchronousCacheReplicator">
        <constructor-arg name="replicatePuts" value="true"/> 
        <constructor-arg name="replicatePutsViaCopy" value="true"/> 
        <constructor-arg name="replicateUpdates" value="true"/>  
        <constructor-arg name="replicateUpdatesViaCopy" value="true"/>  
        <constructor-arg name="replicateRemovals" value="true"/>       
    </bean>
    
    <bean id="ticketRMIAsynchronousCacheReplicator" class="net.sf.ehcache.distribution.RMIAsynchronousCacheReplicator" parent="ticketRMISynchronousCacheReplicator">
        <constructor-arg name="replicationInterval" value="10000"/>  
        <constructor-arg name="maximumBatchSize" value="100"/>       
    </bean>
    
    <bean id="ticketCacheBootstrapCacheLoader" class="net.sf.ehcache.distribution.RMIBootstrapCacheLoader">
        <constructor-arg name="asynchronous" value="true"/>  
        <constructor-arg name="maximumChunkSize" value="5000000"/>  
    </bean>
            
</beans>

在/cas/WEB-INF/lib下加入jars:

cas-server-integration-ehcache-3.5.2.1.jar
ehcache-core.jar

重启两台主机的tomcat,done!

如果是源码编译

在cas-server-webapp的pom.xml中加入:

    <dependency>
      <groupId>org.jasig.cas</groupId>
      <artifactId>cas-server-integration-ehcache</artifactId>
      <version>${project.version}</version>
    </dependency>

然后重新打包,done!

目录
相关文章
|
8月前
|
消息中间件 人工智能 自然语言处理
基于 RocketMQ 事件驱动架构的 AI 应用实践
基于 RocketMQ 事件驱动架构的 AI 应用实践
265 2
|
6月前
|
数据可视化 数据处理
CUT&Tag 数据处理和分析教程(9)
CUT&Tag 数据处理和分析教程(9)
190 15
CUT&Tag 数据处理和分析教程(9)
|
缓存 自然语言处理 API
阿里云百炼产品月刊【2025年4月】
本月刊主要介绍了阿里云百炼平台4月最新更新内容,包括模型服务和产品功能两大部分。在模型服务方面,发布了全新的混合推理模型Qwen3系列,支持思考与非思考模式,性能达到业界顶尖水平;新增了图生视频、语音合成及视觉理解等多款模型,大幅提升多媒体处理能力。产品功能上,新增MCP市场与管理功能,允许用户开通或自定义MCP服务,并在应用中引用以增强能力。此外,部分历史快照模型将于5月8日下线,已实施限流措施。
692 0
|
Java 网络安全
几个基于springboot在线服务过段时间突然停掉的原因
几个基于springboot在线服务过段时间突然停掉的原因
438 0
|
监控 Ubuntu Linux
Linux时间改错了,我想让他恢复正确时间
Linux时间改错了,我想让他恢复正确时间
|
机器学习/深度学习 算法 数据挖掘
Python 机器学习算法交易实用指南(一)(1)
Python 机器学习算法交易实用指南(一)
490 4
|
存储 easyexcel Java
比 poi导入导出更好用的 EasyExcel使用小结
比 poi导入导出更好用的 EasyExcel使用小结
252 0
|
存储 缓存 前端开发
100道 IT名企前端面试真题,Web前端阿里等大厂面试题汇总
100道 IT名企前端面试真题,Web前端阿里等大厂面试题汇总
|
NoSQL Java Redis
SpringBoot整合Redis及StringRedisTemplate的使用
SpringBoot整合Redis及StringRedisTemplate的使用
374 0