一、思路:
1.用apache做请求代理均匀分配服务器请求压力(博主用的是Apache2.2版本)
2.tomcat做集群,共享请求的session
二、实现步骤(以两个tomcat允许同一个程序为例):
1.将同一tomcat拷贝两份,然后修改tomcat的server.xml(在conf/目录下)
如:tomcat1的server.xml(需修改的地方)
tomcat2的server.xml
<Server>、<Connector>、<Connector >(AJP),修改只是确保tomcat启动时端口不冲突
2.配置tomcat集群
在server.xml的<Engine>标签下拷贝如下内容
<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.MessageDispatch15Interceptor"/>
</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.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
这样tomcat集群就设置好了
3.修改apache的配置文件httpd.conf
在Apache安装目录下找到Apache2.4/conf/下的 httpd.conf,去掉以下文本前的注释符(#)以便让Apache在启动时自动加载代理(proxy)模块。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
去掉 Include conf/extra/httpd-vhosts.conf前面的注释#,
4.在httpd.conf文档最下面加上以下代码:
ProxyRequests Off
<proxy balancer://cluster>
BalancerMember ajp://localhost:8059 loadfactor=1 route=tomcat7_local_3 smax=5 max=20 ttl=120 retry=300 timeout=15
BalancerMember ajp://localhost:8019 loadfactor=1 route=tomcat7_local_2 smax=5 max=20 ttl=120 retry=300 timeout=15
ProxySet lbmethod=byrequests
</proxy>
ajp配置的端口与上面修改tomcat的ajp端口一致,注意route与tomcat中的jvmRoute一致
5.conf/extra/httpd-vhosts.conf,配置虚拟站点,在最下面加上以下代码:
#虚拟机配置,负载均衡配置 注意空格
<VirtualHost *:80>
ServerAdmin sun@locahost
ServerName localhost
ServerAlias localhost
ProxyPass / balancer://cluster/ stickysession=JSESSIONID|jsessionid nofailover=On
ProxyPassReverse / balancer://cluster/
#ErrorLog "logs/error.log"
#CustomLog "logs/access.log" common
</VirtualHost>
6.在web项目的web.xml文件下添加<distributable />标签如下:
<distributable />
启动两个tomcat跟apache就行了,博主配置的负载策略是byrequests,就是httpd.conf文件里配置的 ProxySet lbmethod的属性值,也有其它策略(可以自行百度其区别)
运行结果:
接口代码