会话保持 (转)

http://www.cnblogs.com/kellyseeme/p/7599061.html

理论部分

    会话也就是session,主要存储在服务器端,用来识别用户的身份。

    在浏览器中向服务端发送请求的时候,不是http协议就是https协议,而两种协议在发送请求的时候,都是基于http协议,http协议又是无状态的,也就是stateless,在每次用户发送请求过去的时候,这都是一次新的连接,服务端是不会认识你是谁的。

    那么怎么让服务端来识别客户端谁是谁呢,从而也就有cookie,cookie好像没有中文翻译,cookie主要存储在客户端,一般是保存在某个特定路径的文件之中,从而在每次发送请求的时候,都会附加上这个cookie信息,服务端得到这个信息之后,就会判定你是哪个用户等信息,cookie主要就是找到服务端的session信息,从而用来追踪用户。

    在生产环境中,只要涉及到负载均衡的地方,我们就需要考虑会话保持,否则假如一个应用程序是需要登录的,那么会频繁的需要登录。

    负载均衡主要分为硬件负载均衡F5,CITRIX等,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
[root@mogilenode3 kel]# cat index.jsp
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head>
        <title>JAVA 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_proxy,mod_proxy_http,mod_proxy_ajp,mod_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 loadfactor=1 route=mogilenode1
    BalancerMember ajp://192.168.1.238:8009 loadfactor=1 route=mogilenode3
    ProxySet stickysession=ROUTEID
</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=/" env=BALANCER_ROUTE_CHANGED
<proxy balancer://tomserver>
    BalancerMember http://192.168.1.236:8080 loadfactor=1 route=mogilenode1
    BalancerMember http://192.168.1.238:8080 loadfactor=1 route=mogilenode3
    ProxySet stickysession=ROUTEID
</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 name="Catalina" defaultHost="www.kel.com" jvmRoute="mogilenode1">

使用tomcat cluster演示会话保持

    在apache或者nginx端只要做负载均衡的配置即可,也就是在nginx中去掉ip_hash,在apache中去掉ProxySet stickysession=ROUTEID,主要的配置在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 className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
         channelSendOptions="8">
  <Manager className="org.apache.catalina.ha.session.DeltaManager"
           expireSessionsOnShutdown="false"
           notifyListenersOnReplication="true"/>
  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="228.0.0.4"
                port="45564"
                frequency="500"
                dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="auto"
              port="4000"
              autoBind="100"
              selectorTimeout="5000"
              maxThreads="6"/>
    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
  </Channel>
  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
         filter=""/>
  <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
  <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
            tempDir="/tmp/war-temp/"
            deployDir="/tmp/war-deploy/"
            watchDir="/tmp/war-listen/"
            watchEnabled="false"/>
  <ClusterListener className="org.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
[root@mogilenode2 extra]# route add default gw 192.168.1.1
[root@mogilenode2 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
[root@mogilenode1 kel]# route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
[root@mogilenode1 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
[root@mogilenode3 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354790.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html url js编码顺序,前端url编码

为什么要编码&#xff1a;Http协议中参数的传输是"keyvalue"这种简直对形式的&#xff0c;如果要传多个参数就需要用“&”符号对键值对进行分割如"?name1value1&name2value2"&#xff0c;这样在服务端在收到这种字符串的时候&#xff0c;会用“&a…

AWS SQS和Spring JMS集成

Amazon WEB服务为我们提供了SQS消息传递服务。 sqs的java sdk与JMS兼容。 因此&#xff0c;可以将SQS与spring提供的JMS集成框架集成在一起&#xff0c;而不是将SQS用作简单的spring bean。 我将使用spring-boot和gradle。 gradle文件&#xff1a; group com.gkatzioura.sq…

手势相关-解决手势冲突

解决UITableview点击事件与手势的冲突 1.签手势代理 <UIGestureRecognizerDelegate> 2.是tableview点击事件则屏蔽手势 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIS…

html动画用css还是js,javascript与css3动画结合使用小结

当Html5,css3已渐渐成为主流的时候&#xff0c;我还非常习惯的用js去做一些简单的动画。因为在桌面浏览器上&#xff0c; 并非所有的都支持css3。用户也倒是很奇怪&#xff0c;用户习惯并不是每个用户都可以被培养。总有不少人会觉得win7.win8没xp好用。但手机方面就大不一样了…

洛谷 P3146 [USACO16OPEN]248

P3146 [USACO16OPEN]248 题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.The g…

java将HTML文件转化为pdf文件,如何使用Java将HTML网页转换为PDF文件

我一直在互联网上搜索如何使用Java将HTML页面转换为PDF文件。我发现了很多指针&#xff0c;简而言之&#xff0c;它们不起作用或难以实现。我也下载了一个商业产品&#xff0c;pdf4ml;该API是我很乐意与之合作的&#xff0c;除了当我在维基百科上检索一个简单的页面时&#xff…

java抽象类和模板模式_测试抽象类和模板方法模式

java抽象类和模板模式摘自Wikipedia&#xff0c;“模板方法定义了算法的程序框架。 子类可以覆盖一个或多个算法步骤&#xff0c;以允许不同的行为&#xff0c;同时确保仍然遵循总体算法。” 通常&#xff0c;此模式由两个或多个类组成&#xff0c;一个是提供模板方法&#xff…

第三章 使用单元测试测试简单的首页

3.1第一个Django应用&#xff0c;第一个单元测试 python3 manage.py startapp lists 创建一个应用 功能测试站在用户的角度从外部测试应用&#xff0c;而单元测试从程序员的角度从内部测试应用 3.2Django中的单元测试 打开新生成的的文件lists/tests.py 注&#xff1a;单元测试…

微型计算机应用领域及应用,自考“微型计算机应用基础”自考大纲(1)

I. 课程性质微型计算机应用基础是高等教育自学考试经济管理类各专业的一门必修的应用基础课程&#xff0c;同时它也适用于文、法、医、农各专业选修。了解计算机这一现代化工具的性能、特点和一般工作原理&#xff0c;掌握计算机基础知识&#xff0c;学会计算机的基本操作&…

Lambda的Lambda(如果可选)

因此&#xff0c;我对JDK 8中Optional接口的两个限制感到沮丧。第一个问题是&#xff0c;没有明显的方法可以在块中执行else操作&#xff0c;因为只有isPresent方法&#xff0c;除非您使用的是老式的if语句。 第二个问题当然是古老的板栗&#xff0c;即使您能够做到&#xff0c…

win7链接html线到屏幕上,为你解决win7系统html文件图标变成空白的具体技巧 - win7吧...

我们经常在电脑上安装应用软件&#xff0c;难免会遇到诸如win7系统html文件图标变成空白的状况&#xff0c;对于大多电脑用户而言&#xff0c;大家几乎都是首次看到win7系统html文件图标变成空白这种状况&#xff0c;其实小编的经验是碰到win7系统html文件图标变成空白的问题别…

周赛。。。。

分糖果 分糖果 题意 要篮子里有不少于 n 块糖果&#xff0c;幼儿园的所有 n 个小朋友&#xff08;包括你自己&#xff09;都从篮子中拿走恰好一块糖&#xff0c;直到篮子里的糖数量少于 n 块。此时篮子里剩余的糖果均归你所有——这些糖果是作为你搬糖果的奖励。 思路 这个程…

计算机科学之前说,国内计算机科学十强大学是哪些?前2名没悬念,后面几所都不好说...

随着科技的发展、产业结构的不断优化&#xff0c;许多单位对计算机相关专业人才需求量越来越大&#xff0c;计算机专业毕业生就业情况普遍不差。加上计算机学科本身就给人一种“格局很高”的感觉&#xff0c;所以该专业成为了当下最热门的专业之一&#xff0c;每年高考都会有一…

服务引用代理类_在代理类中引用动态代理

服务引用代理类在Stackoverflow中有一个有趣的问题 &#xff0c;关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务&#xff0c;Spring AOP&#xff0c;缓存&#xff0c;异步流等。需要对代理的引用&#xff0c;因为如果存在对自身的调用通过代理bean&#xff…

HTML中confirm替换,Javascript直接Confirm()函数替换

我想替换Javascript Confirm()函数以允许自定义按钮,而不是Yes / Cancel.我尝试搜索,但是所有解决方案都是事件驱动的,例如jquery对话框(其中代码不等待响应,而是事件驱动的).有谁知道非事件驱动的解决方案.它必须在Safari和IE中都可以使用(因此没有vbscript).这是系统许多部分…

关于windows防火墙关不掉解决办法

建立一个.bat文件&#xff0c;写以下内容: echo off title 正在启动防火墙服务 sc config MpsSvc startauto net start MpsSvc pause 至此完毕&#xff0c;重启试试就知道了 转载于:https://www.cnblogs.com/ciscolee/p/7616588.html

Java中特质模式的定义

在本文中&#xff0c;我将介绍特征的概念&#xff0c;并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例。 我将首先提出一个虚构的案例&#xff0c;其中可以使用特征来减少重复&#xff0c;然后以使用Java 8的特征模式示例实现为结尾。 假设您正在开发留言…

计算机 注册表 远程桌面,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...

计算机在开启远程桌面的时候选中了“仅允许运行使用网络级别身份验证的远程桌面计算机连接”&#xff0c;于是连接时提示错误如下&#xff1a;远程计算机需要网络级别身份验证&#xff0c;而您的计算机不支持该验证&#xff0c;请联系您的系统管理员或者技术人员来获得帮助解决…

前端笔记----定位

一.定位分三种&#xff1a;相对定位&#xff0c;绝对定位和固定定位。 1.相对定位&#xff1a;元素所占据的文档流的位置保留&#xff0c;元素本身相对自身原位置进行偏移&#xff1b; 如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

html往下滑变成水平,HTML - 水平滑块CSS最佳方法_html_开发99编程知识库

由於每個部分的位置已經設置為relative&#xff0c;意味著將relative定位到上一節&#xff0c;因此可以將其他部分設置為left: 0 。* {margin: 0;}#all-sections{display:inline-flex;}.main, .about, .professional, .fun-stuff, .blog, .contact{height:100vh;position: rela…