前言
我们的一个新项目是一个RESTful架构风格的程序,服务器端用Java编写,对客户端提供REST Web Service。使用Tomcat作为Servlet Container,Tomcat本身是无状态的(stateless,REST的特点),无需做Session同步。不过为了实现可伸缩性,可用性以及可靠性的非功能性要求,需要做负载均衡,使用Apache HTTP Server作为前置。
Apache HTTP Server(以下简称Apache)整合Tomcat,通过模块来实现。有两个方案,mod_jk和mod_proxy。前者是老牌劲旅,功能强大完备,但是理念有些落后,Apache安装包不包含,需要额外下载;后者是主力新军,有待雕琢和检验,天空才是极限,Apache安装包自带。具体的比较可以参考*上的帖子(见参考1)本文只介绍mod_jk的方式。
结构图如下:
具体步骤
1. 安装Apache和Tomcat
我用的操作系统是Windows,选择的都是绿色版本(无需安装,解压缩即可的那种)。 Apache HTTP Server的安装有很多教程,这里不再铺开来说。注意两点,一是设置ServerRoot,如果在Windows系统下,把Apache直接装在所在盘的根目录即可免去配置ServerRoot;而是配置端口,Apache的默认端口是80,有可能80端口已经被已有程序占用,那么得配置。启动有问题的话,请到logs目录下查看日志。
Tomcat安装在多台机器上直接启用即可。如果你向我一样一台机器安装两个Tomcat,那么必须解决端口冲突的问题。我的做法是把两个Tomcat命名为A和B,A端口不变,B端口加1,Server, Connector for http以及Connector for AJP都要修改,涉及5个数字。Tomcat的数量当然不仅限于2个,可以自行发挥,类推即可。
安装好之后需要验证安装。Apache是否成功,单个Tomcat是否成功,两个Tomcat同时运行是否成功。
2. 下载mod_jk,并安装mod_jk
注意下载与Apache版本对应的mod_jk,复制到Apache的modules目录即可。
3. 配置mod_jk
涉及到两个两个文件conf/httpd.conf和conf/workers.properties。具体的配置含义可以自行查询。
conf/httpd.conf需要增加几行配置项(如果是Apache2.4, 记得取消注释LoadModule access_compat_module modules/mod_access_compat.so)。代码如下:
# load mod_jk
LoadModule jk_module modules/mod_jk.so
# Specify path to worker configuration file
JkWorkersFile conf/workers.properties
# Configure logging and memory
JkShmFile logs/mod_jk.shm
JkLogFile logs/mod_jk.log
JkLogLevel info
# Configure monitoring
JkMount /jkmanager/* jkstatus
<Location /jkmanager>
Order deny,allow
Deny from all
Allow from localhost
</Location>
# Configure applications
JkMount /* loadbalancer
新建conf/workers.properties文件,专属于于mod_jk。代码如下:
# Define worker names
worker.list=jkstatus, loadbalancer
# Create virtual workers
worker.jkstatus.type=status
worker.loadbalancer.type=lb
# Declare Tomcat server workers 1 through n
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker2.type=ajp13
worker.worker2.port=8010
worker.worker2.host=localhost
# Associate real workers with virtual LoadBalancer worker
worker.loadbalancer.balance_workers=worker1,worker2
It’s Done,就是那么简单。赶快试试吧。
后记
我们的服务器是无状态的,无需Session同步。如果你的项目需要,那么我的理解与Apache也没有关系,直接使用Tomcat的Cluster功能即可。
我们项目用到了WebSocket,WebSocket的可以做Load balancing。WebSocket的Load balancing与普通http请求相同,这是因为WebSocket是由Http Upgrade而来,初始的URL负载均衡了,WebSocket自然均衡。不过由于WebSocket是长连接,如果Server断掉了,WebSocket客户端必须主动发起重连,也就是客户端需要重连机制。