利用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.mzph.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;在她们去年合著的《自我清洁》一书中强调了养成良好生活习惯可为身体排毒的重要性。 近日…