成都快速建站模板,商洛网站建设求职简历,凡科建站源码,做网站搭建环境http://www.cnblogs.com/kellyseeme/p/7599061.html 理论部分 会话也就是session#xff0c;主要存储在服务器端#xff0c;用来识别用户的身份。 在浏览器中向服务端发送请求的时候#xff0c;不是http协议就是https协议#xff0c;而两种协议在发送请求的时候#xff0c… http://www.cnblogs.com/kellyseeme/p/7599061.html 理论部分 会话也就是session主要存储在服务器端用来识别用户的身份。 在浏览器中向服务端发送请求的时候不是http协议就是https协议而两种协议在发送请求的时候都是基于http协议http协议又是无状态的也就是stateless在每次用户发送请求过去的时候这都是一次新的连接服务端是不会认识你是谁的。 那么怎么让服务端来识别客户端谁是谁呢从而也就有cookiecookie好像没有中文翻译cookie主要存储在客户端一般是保存在某个特定路径的文件之中从而在每次发送请求的时候都会附加上这个cookie信息服务端得到这个信息之后就会判定你是哪个用户等信息cookie主要就是找到服务端的session信息从而用来追踪用户。 在生产环境中只要涉及到负载均衡的地方我们就需要考虑会话保持否则假如一个应用程序是需要登录的那么会频繁的需要登录。 负载均衡主要分为硬件负载均衡F5CITRIX等nginx负载均衡apache负载均衡无论是硬件负载均衡或者是软件负载均衡都会有一个会话保持的选项在需要进行会话保持的时候在每一个环节都需要进行会话保持也就是硬件负载均衡要选择会话保持在软件负载均衡也要进行会话保持。 生产环境使用的过时的第一种 在中间件的选择上面apache和webspare在逐渐淘汰在使用此种架构的时候F5会使用会话保持nginx也使用的是ip_hash进行会话保持。此种架构的最大的优势是部署比较简单在进行部署的时候只要将java程序的war包放置到具体的目录即可进行部署在进行自动化发布的时候进行部署是非常简单的事因为集群中各个机器是独立的一个机器出问题不会影响其他的机器缺点就是在部署的时候需要在每个主机上进行放置相同的war包并且配置要保持一直在需要会话保持的场景中如果一台主机down那么就会导致所有的会话丢失。 生产环境使用的过时的架构第二种 在使用domain模式的时候前端的F5和nginx都不需要进行会话保持只要做到负载均衡就好了。此种方式的最大有点就是在自动化部署的时候只要在domain节点的master或者是dmgr部署程序即可主节点会自动将相关的程序同步到其他的slave或者node节点上去在修改配置的时候也只要在master上进行修改即可在会话保持的上面主机之间会同步相关的会话信息从而不用担心某台服务器宕机从而导致会话丢失。缺点就是无论是在发布或者同步配置的时候主节点总要联系上从节点进行同步而从节点的相关进程还是比较容易出现假死的情况在使用这种集群的时候只要master节点或者dmgr节点的服务器损坏那么这个集群就不能重新发布新的程序版本了但是不会影响服务的可用性在每次出现问题的时候因为同步进程有好几个你都不知道是那个进程假死了只能全部进行重启一遍说好的稳定性呢。为啥这种慢慢淘汰一个是因为在自动化发布的时候很容易出现问题在进行灰度发布的时候standalone模式更容易控制而且domain模式有主机数量的限制而standalone模式理论上无上限。 生产环境目前架构如下 在使用此种架构的时候前端无须进行会话保持后端也无须进行会话的同步在有后端主机宕机的时候也不会丢失会话灰度发布也很容易自动化做起来比较简单从而也就成为了目前的架构。 使用tomcat standalon演示会话保持 tomcat的首页内容如下所示可以查看到页面的session信息 View Code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 [rootmogilenode3 kel]# cat index.jsp % page languagejava % % page importjava.util.* % html head titleJAVA PAGE/title /head body % out.println(mogilenode3); % % session.getId() % /body /html 在使用负载均衡的时候准备两台主机均需要安装jdk和tomcat并且提供相同的应用程序在首次访问的时候均会设置cookie信息在java程序中其中会有JSESSIONID在第二次访问同样的主机的时候就不会再次设置这个cookie信息了。 使用nginx进行反代的时候nginx的主要配置文件如下所示 在nginx的时候主要的就是使用ip_hash。 在使用apache进行反代的时候可以使用http协议或者ajp协议配置文件如下所示在编译的时候需要几个模块mod_proxymod_proxy_httpmod_proxy_ajpmod_proxy_balancer View Code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 NameVirtualHost *:80 proxy balancer://tomserver BalancerMember ajp://192.168.1.236:8009 loadfactor1 routemogilenode1 BalancerMember ajp://192.168.1.238:8009 loadfactor1 routemogilenode3 ProxySet stickysessionROUTEID /proxy VirtualHost *:80 DocumentRoot /usr/local/apache/htdocs ServerName www.kel.com ServerAlias www.kel.com ProxyVia On ProxyRequests Off ProxyPreserveHost On ProxyPass /status ! Location /balancer-manager SetHandler balancer-manager ProxyPass ! order allow,deny allow from all /Location ProxyPass / balancer://tomserver/ ProxyPassReverse / balancer://tomserver/ ErrorLog logs/www.kel.com-error_log CustomLog logs/www.kel.com-access_log common /VirtualHost Location /status SetHandler server-status Order allow,deny Allow from all /Location ExtendedStatus On 使用http协议的配置如下 View Code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 NameVirtualHost *:80 Header add Set-Cookie ROUTEID.%{BALANCER_WORKER_ROUTE}e;path/ envBALANCER_ROUTE_CHANGED proxy balancer://tomserver BalancerMember http://192.168.1.236:8080 loadfactor1 routemogilenode1 BalancerMember http://192.168.1.238:8080 loadfactor1 routemogilenode3 ProxySet stickysessionROUTEID /proxy VirtualHost *:80 DocumentRoot /usr/local/apache/htdocs ServerName www.kel.com ServerAlias www.kel.com ProxyVia On ProxyRequests Off ProxyPreserveHost On ProxyPass /status ! Location /balancer-manager SetHandler balancer-manager ProxyPass ! order allow,deny allow from all /Location ProxyPass / balancer://tomserver/ ProxyPassReverse / balancer://tomserver/ ErrorLog logs/www.kel.com-error_log CustomLog logs/www.kel.com-access_log common /VirtualHost Location /status SetHandler server-status Order allow,deny Allow from all /Location ExtendedStatus On 在次两种的配置下tomcat需要配置如下信息 ? 1 Engine nameCatalina defaultHostwww.kel.com jvmRoutemogilenode1 使用tomcat cluster演示会话保持 在apache或者nginx端只要做负载均衡的配置即可也就是在nginx中去掉ip_hash在apache中去掉ProxySet stickysessionROUTEID主要的配置在tomcat的host标签中如下所示 View Code? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 Cluster classNameorg.apache.catalina.ha.tcp.SimpleTcpCluster channelSendOptions8 Manager classNameorg.apache.catalina.ha.session.DeltaManager expireSessionsOnShutdownfalse notifyListenersOnReplicationtrue/ Channel classNameorg.apache.catalina.tribes.group.GroupChannel Membership classNameorg.apache.catalina.tribes.membership.McastService address228.0.0.4 port45564 frequency500 dropTime3000/ Receiver classNameorg.apache.catalina.tribes.transport.nio.NioReceiver addressauto port4000 autoBind100 selectorTimeout5000 maxThreads6/ Sender classNameorg.apache.catalina.tribes.transport.ReplicationTransmitter Transport classNameorg.apache.catalina.tribes.transport.nio.PooledParallelSender/ /Sender Interceptor classNameorg.apache.catalina.tribes.group.interceptors.TcpFailureDetector/ Interceptor classNameorg.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor/ /Channel Valve classNameorg.apache.catalina.ha.tcp.ReplicationValve filter/ Valve classNameorg.apache.catalina.ha.session.JvmRouteBinderValve/ Deployer classNameorg.apache.catalina.ha.deploy.FarmWarDeployer tempDir/tmp/war-temp/ deployDir/tmp/war-deploy/ watchDir/tmp/war-listen/ watchEnabledfalse/ ClusterListener classNameorg.apache.catalina.ha.session.ClusterSessionListener/ /Cluster 在其中需要修改的组播地址防止部署多个集群的时候出现地址冲突在部署的时候可能出现的错误如下 ? 1 2 3 java.net.SocketException: No such device; No faulty members identified. SEVERE: Unable to start cluster. 主要是因为没有设置网关地址或者组播地址在其中如下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [rootmogilenode2 extra]# route add default gw 192.168.1.1 [rootmogilenode2 extra]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.249.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 或者使用如下方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [rootmogilenode1 kel]# route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 [rootmogilenode1 kel]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.249.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 224.0.0.0 0.0.0.0 240.0.0.0 U 0 0 0 eth0 在应用程序的web.xml中在web-app标签中添加指令 distributable/ 监听的地址如下 ? 1 2 3 4 5 6 7 8 9 [rootmogilenode3 WEB-INF]# netstat -tnlp|grep java tcp 0 0 :::8080 :::* LISTEN 3920/java tcp 0 0 ::ffff:192.168.1.238:4000 :::* LISTEN 3920/java tcp 0 0 ::ffff:127.0.0.1:8005 :::* LISTEN 3920/java tcp 0 0 :::8009 :::* LISTEN 3920/java 测试 在第一次发送请求的时候会设置cookie信息如下所示 在第二次发送请求的时候会带上Cookie信息如下 在JAVA程序中只要收到了jsp或者servlet的请求那么就会生成JSESSIONID。 转载于:https://www.cnblogs.com/quietwalk/p/7599953.html