CAS 集群部署

2021年09月15日 阅读数:5
这篇文章主要向大家介绍CAS 集群部署,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
业务场景

单点登陆服务器若是压力过大的状况,那么能够使用集群分担压力,可是cas 默认不支持session同步。linux

因此能够须要作session同步,能够使用j2cache 实现session同步。另外在登陆后,cas服务器保存了客户端web

对应的ticketId,所以也须要将ticket实现同步。redis

实现方法

1.准备jar包

CAS 集群部署_cas 集群

将这些包copy 到cas的 WEB-INF/lib目录下缓存

2.编辑CAS web.xml 文件

在web.xml 的服务器

<filter-mapping>
        <filter-name>encoding-filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

后面添加cookie

 <filter>
    <filter-name>j2cache-session-filter</filter-name>
    <filter-class>net.oschina.j2cache.session.J2CacheSessionFilter</filter-class>
    <init-param><!-- 内存中存放会话数 -->
        <param-name>session.maxSizeInMemory</param-name>
        <param-value>2000</param-value>
    </init-param>
    <init-param><!-- 会话有效期,单位:秒钟 -->
        <param-name>session.maxAge</param-name>
        <param-value>1800</param-value>
    </init-param>
    <!-- cookie configuration -->
    <init-param>
        <param-name>cookie.name</param-name>
        <param-value>J2CACHE_SESSION_ID</param-value>
    </init-param>
    <init-param>
        <param-name>cookie.path</param-name>
        <param-value>/</param-value>
    </init-param>
    <init-param>
        <param-name>cookie.domain</param-name>
        <param-value></param-value>
    </init-param>
 
   
            <init-param>
                <param-name>redis.mode</param-name>
                <param-value>single</param-value>
            </init-param>
            <init-param>
                <param-name>redis.hosts</param-name>
                <param-value>192.168.31.100:6379</param-value>
            </init-param>
            <init-param>
                <param-name>redis.channel</param-name>
                <param-value>j2cache</param-value>
            </init-param>
            <init-param>
                <param-name>redis.cluster_name</param-name>
                <param-value>j2cache</param-value>
            </init-param>
            <init-param>
                <param-name>redis.timeout</param-name>
                <param-value>2000</param-value>
            </init-param>
            <init-param>
                <param-name>redis.password</param-name>
                <param-value></param-value>
            </init-param>
            <init-param>
                <param-name>redis.database</param-name>
                <param-value>0</param-value>
            </init-param>
            <init-param>
                <param-name>redis.maxTotal</param-name>
                <param-value>100</param-value>
            </init-param>
            <init-param>
                <param-name>redis.maxIdle</param-name>
                <param-value>10</param-value>
            </init-param>
            <init-param>
                <param-name>redis.minIdle</param-name>
                <param-value>10</param-value>
            </init-param>
        </filter>

        <filter-mapping>
            <filter-name>j2cache-session-filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

redis 能够作相应配置。session

3.ticket同步实现

cas 服务器默认使用本地缓存来管理ticket,当使用集群实现时就会出现这样的状况。app

好比用户在CAS A登陆,那么客户端就会获取到一个ST 票据,而后在验证这个票据去CAS服务器验证,dom

若是这个时候请求发送到CAS B那么这个时候就会报错,说找不到ST,这个时候就须要作到ST票据在不一样服务器上同步。ide

咱们能够看到cas 配置文件ticketRegistry.xml。

他的默认配置为:

 <bean   />
    
    <!--Quartz -->
    <!-- TICKET REGISTRY CLEANER -->
    <bean  
        p:ticketRegistry-ref="ticketRegistry"
        p:logoutManager-ref="logoutManager" />
    
    <bean  
        p:targetObject-ref="ticketRegistryCleaner"
        p:targetMethod="clean" />
    
    <bean  
        p:jobDetail-ref="jobDetailTicketRegistryCleaner"
        p:startDelay="20000"
        p:repeatInterval="5000000" />

咱们能够看到这个 DefaultTicketRegistry的代码以下:

CAS 集群部署_分享_02

他是简单的把票据放到一个ConcurrentHashMap对象中。

因此咱们须要设计一个本身的票据注册器,可以支持集群式部署。

咱们能够设计一个本身的票据注册器,咱们能够使用redis,或memache来实现。

public class J2CacheTicketRegistry extends AbstractDistributedTicketRegistry implements DisposableBean{

    private ICache cache;
    
    private  int tgtTimeout;
 
    private  int stTimeout;
    
    
    
    public void setTgtTimeout(int tgtTimeout) {
        this.tgtTimeout = tgtTimeout;
    }

在ticketRegistry.xml中注册。

<bean  >
      <property name="cache" ref="iCache"></property>
      <property name="tgtTimeout" value="28800"></property>
      <property name="stTimeout" value="28800"></property>
  </bean>
  <bean   init-method="init" destroy-method="destroy"></bean> 

4.NGINX配置

upstream linuxidc {
            server 192.168.31.77:8082;
            server 192.168.31.77:8081;
        
        }

添加cas配置

location /cas {
                        proxy_pass http://linuxidc/cas;
                        proxy_set_header Host $host:$server_port;
            proxy_set_header X-Real-Ip $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
        }

这样就实现了cas session同步。

 
上一篇: nacos集群部署
下一篇: kubernetes集群部署