基于redis的cas集群配置
2015-03-02 14:47
429 查看
1、cas ticket统一存储
做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致。官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方例子改了一个基于redis版本的。
对应的ticketRegistry.xml的配置如下:
这里既然使用了redis作为ticket存储,就需要将原来的方案给注释掉:
到这里,cas的改进就OK了,下面就需要将session也做集群同步。
2、tomcat session集群同步
这里采用开源的tomcat-redis-session-manager,git hub地址为:https://github.com/jcoleman/tomcat-redis-session-manager
这里只使用的是jdk1.7,tomcat7,tomcat6需要重新编译好像。
1)拷贝编译打包之后的tomcat-redis-session-manager-VERSION.jar,jedis-2.5.2.jar,commons-pool2-2.2.jar到tomcat/lib目录下
2)修改Tomcat context.xml (or the context block of the server.xml if applicable.)
至此cas集群配置就可以了。
做cas集群首先需要将ticket拿出来,做统一存储,以便每个节点访问到的数据一致。官方提供基于memcached的方案,由于项目需要,需要做计入redis,根据官方例子改了一个基于redis版本的。
public class RedisTicketRegistry extends AbstractDistributedTicketRegistry{ @NotNull private final RedisTemplate<String,Object> reidsTemplate; /** * TGT cache entry timeout in seconds. */ @Min(0) private final int tgtTimeout; /** * ST cache entry timeout in seconds. */ @Min(0) private final int stTimeout; public RedisTicketRegistry(RedisTemplate<String,Object> reidsTemplate,int tgtTimeout,int stTimeout){ this.reidsTemplate=reidsTemplate; this.tgtTimeout=tgtTimeout; this.stTimeout=stTimeout; } @Override public void addTicket(Ticket ticket) { logger.debug("Adding ticket {}", ticket); try { reidsTemplate.opsForValue().set(ticket.getId(),ticket, getTimeout(ticket), TimeUnit.SECONDS); } catch (final Exception e) { logger.error("Failed adding {}", ticket, e); } } @Override public Ticket getTicket(String ticketId) { try { final Ticket t = (Ticket) this.reidsTemplate.opsForValue().get(ticketId); if (t != null) { return getProxiedTicketInstance(t); } } catch (final Exception e) { logger.error("Failed fetching {} ", ticketId, e); } return null; } @Override public boolean deleteTicket(String ticketId) { logger.debug("Deleting ticket {}", ticketId); try { this.reidsTemplate.delete(ticketId); return true; } catch (final Exception e) { logger.error("Failed deleting {}", ticketId, e); } return false; } @Override public Collection<Ticket> getTickets() { throw new UnsupportedOperationException("GetTickets not supported."); } @Override protected void updateTicket(Ticket ticket) { logger.debug("Updating ticket {}", ticket); try { this.reidsTemplate.delete(ticket.getId()); reidsTemplate.opsForValue().set(ticket.getId(),ticket, getTimeout(ticket), TimeUnit.SECONDS); } catch (final Exception e) { logger.error("Failed updating {}", ticket, e); } } @Override protected boolean needsCallback() { // TODO Auto-generated method stub return true; } private int getTimeout(final Ticket t) { if (t instanceof TicketGrantingTicket) { return this.tgtTimeout; } else if (t instanceof ServiceTicket) { return this.stTimeout; } throw new IllegalArgumentException("Invalid ticket type"); } }
对应的ticketRegistry.xml的配置如下:
<bean id="ticketRegistry" class="com.test.cas.ticket.registry.RedisTicketRegistry"> <constructor-arg index="0" ref="redisTemplate" /> <constructor-arg index="1" value="1800" /> <constructor-arg index="2" value="10" /> </bean> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="200" /> <property name="testOnBorrow" value="true" /> </bean> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="redis_server_ip" p:port="6379" p:pool-config-ref="poolConfig"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="connectionFactory"> </bean>
这里既然使用了redis作为ticket存储,就需要将原来的方案给注释掉:
<!-- Ticket Registry <bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.DefaultTicketRegistry" /> --> <!--Quartz --> <!-- TICKET REGISTRY CLEANER <bean id="ticketRegistryCleaner" class="org.jasig.cas.ticket.registry.support.DefaultTicketRegistryCleaner" p:ticketRegistry-ref="ticketRegistry" p:logoutManager-ref="logoutManager" /> <bean id="jobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" p:targetObject-ref="ticketRegistryCleaner" p:targetMethod="clean" /> <bean id="triggerJobDetailTicketRegistryCleaner" class="org.springframework.scheduling.quartz.SimpleTriggerBean" p:jobDetail-ref="jobDetailTicketRegistryCleaner" p:startDelay="20000" p:repeatInterval="5000000" /> -->
到这里,cas的改进就OK了,下面就需要将session也做集群同步。
2、tomcat session集群同步
这里采用开源的tomcat-redis-session-manager,git hub地址为:https://github.com/jcoleman/tomcat-redis-session-manager
这里只使用的是jdk1.7,tomcat7,tomcat6需要重新编译好像。
1)拷贝编译打包之后的tomcat-redis-session-manager-VERSION.jar,jedis-2.5.2.jar,commons-pool2-2.2.jar到tomcat/lib目录下
2)修改Tomcat context.xml (or the context block of the server.xml if applicable.)
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/> <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="redis_server_name" port="6379" database="0" maxInactiveInterval="1800"/>
至此cas集群配置就可以了。
相关文章推荐
- 基于redis的cas集群配置(转)
- redis的安装配置及其基于sentinel的redis集群高可用方案
- 基于Redis的CAS服务端集群
- 基于Redis的CAS集群
- 基于Redis的CAS集群
- 基于keepalived、redis sentinel的多实例redis集群【1】---路由以及哨兵配置
- CAS集群部署基于Redis缓存配置详细方案
- redis 集群配置(基于3.0.5)
- 基于keepalived、redis sentinel的多实例redis集群【2】---realserver配置
- 基于Redis的CAS集群
- 基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置
- 基于Redis的Twitter克隆版Retwis配置详解
- 基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置 Peter Wei
- 基于DR模型的持久防火墙标记数据包集群配置及检测RS服务器健康脚本
- [置顶] CAS原理与配置-基于CAS的单点登陆的研究(上)
- nginx + jetty 基于wadi的集群配置
- 配置基于DR模式和NAT模式Lvs集群
- 集群:基于DRBD的双节点Master-Slave存储 配置文档
- 基于apache的tomcat负载均衡和集群配置(基于mod_jk.so)
- VMware Workstation 9下基于Ubuntu 12.10服务器版本的Hadoop集群的配置