自2006年后Sun分拆Java技术为三个方向:Java 2 SE(标准版) Java 2 EE(企业版) Java 2 ME(移动端)
TOMCAT是Java 2 EE技术体系的不完整实现,很多API仍然不能和J2EE相比拟,由于Sun在后TOMCAT算是Apache基金会中和apache并驱前行的顶级项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。
但TOMCAT并非唯一的选择,因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的JAVA应用服务器。
商业实现:
WebSphere, WebLogic, Oc4j, Glassfish, Geronimo, JOnAS, JBoss, ...
开源实现:
Tomcat, Jetty, Resin, ...
其中JSP在Tomcat中运行由jasper将.jsp内容自动转化为java代码并加载入类库
.jsp -->jasper--> .java --> javac --> .class --> jvm
注意:基于jasper将静态输出的数据转为java代码进行输出,结果为servlet规范的代码;
今天主要为了实现Tomcat的会话保持,也就是会话粘性,其实实现Tomcat Cluster或者TOmcat+memcached之前就有很多方法,但大体上分为
代理端会话粘性:若其中一个代理出现问题,会话粘性单点失效
Nginx: ip_hash
haproxy: source
lvs: sh
集群会话同步:Tocmat会话两两互为同步,单并不适合大流量,Tomcat性能下降
Tomcat: delta session manager
会话共享:高效,但配置较为麻烦依赖于第三方插件,淡然还有很多方案,只是这里不一一推荐
Tomcat+Memcached/Redis
今天主要研究Tomcat+Memcached
环境:
192.168.2.128 node1 Nginx
192.168.2.129 node4 Tomcat1
192.168.2.130 node5 Tomcat2
安装Tomcat
安装Tomcat之前首先安装jdk环境,jdk分为openjdk和Oracle jdk,OracleJDK作为openjdk的稳定功能收录版
yum安装方式:
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel ##java-1.8.0-openjdk-devel中包含了一些jvm状态分析工具,比如jps和jstat
yum install tomcat tomcat-lib tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
tar包安装:
安装JDK:
rpm -ivh jdk-8u201-linux-x64.rpm
cat /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/java/default
export PATH=$JAVA_HOME/bin:$PATH
. /etc/profile.d/jdk.sh
安装Tomcat:
tar xf apache-tomcat-7.0.92.tar.gz -C /usr/local/
ln -s apache-tomcat-7.0.92 tomcat
cat tomcat.sh
export TOMCAT_HOME=/usr/local/tomcat
export PATH=$TOMCAT_HOME/bin:$PATH
. /etc/profile.d/tomcat.sh
配置Tomcat,编写jsp
mkdir -pv /usr/local/tomcat/webapps/test/{classes,lib,meta-inf,WEB-INF} vim /usr/local/tomcat/webapps/test/index.jsp <%@ page language="java" %> <html> <head><title>TomcatB</title></head> <body> <h1><font color="blue">TomcatB.ifan.com</font></h1> <table align="centre" border="1"> <tr> <td>Session ID</td> <% session.setAttribute("ifan.com","ifan.com"); %> <td><%= session.getId() %></td> </tr> <tr> <td>Created on</td> <td><%= session.getCreationTime() %></td> </tr> </table> </body> </html>
检查配置文件:
[root@node2 test]# catalina.sh configtest
启动服务:
[root@node2 test]# catalina.sh start
检查端口:8080 8009 8005(启动较慢)
分别访问192.168.2.129:8080和192.168.2.130:8080以及http://url:8080/test正常即可
由于与TOMCAT默认通讯的方式有两种:
http协议(默认8080端口)支持Nginx,apache等http协议前端服务器
ajp协议(默认8009端口)仅Apache支持,如果不使用则可以关闭
另外的8005端口为Tomcat的管理端口,据说还有jk的链接方式,不过这个项目好像已经被apache基金会废弃了,不在研究
安装Nginx
安装Nginx:
yum install Nginx -y cat /etc/Nginx/conf.d/http-tomcat.conf
配置Nginx服务:
[root@node1 ~]# cat /etc/Nginx/conf.d/Nginx_tomcat.conf upstream tcsrv { # ip_hash; ##这里采用Tomcat Cluster的会话复制来实现就不再使用ip_hash,使用基本轮训即可 server 192.168.2.129:8080 weight=1; server 192.168.2.130:8080 weight=1; } server{ listen 80; server_name http.ilinux.io; proxy_set_header X-Forwarded-For $remote_addr; ##将用户客户端真实IP传递给Tomcat,httpd2.4无需配置透传,Tomcat自动获得的就是真实IP location / { proxy_pass http://tcsrv; } }
配置ubuntu本地hosts:
ifan@ifan-PC:~$ cat /etc/hosts
127.0.0.1 localhost
0.0.0.0 account.jetbrains.com
127.0.1.1 ifan-PC
192.168.2.128 http.ilinux.io ajp.ilinux.io
测试访问:
http://http.ilinux.io 能够轮训看到TomcatA和B即可
Tomcat Cluster集群会话同步配置:
编辑集群内每台tomcat主配置文件server.xml在需要配置的Host标签内添加
<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" <!-- auto需要将本机主机名在本机的hosts内做ip映射,否则会bind错误 --> port="4000" autoBind="100" selectorTimeout="5000" maxThreads="6"/> <!-- 最大线程数,可以理解为集群服务器总数为N,则该值为N-1 --> <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>
在test项目单独复制web.xml并在web-app标签内配置<distributable/>
cp /usr/local/tomcat/conf/web.xml /usr/local/tomcat/webapps/test/WEB-INF/ vim /usr/local/tomcat/webapps/test/WEB-INF/web.xml <web-app> ... <distributable/> ... web-app/>
配置tomcat主机对本机主机名hosts解析
[root@node4 ~]# cat /etc/hosts
192.168.2.129 node4
检测配置:
[root@node4 ~]# catalina.sh configtest
[root@node4 ~]# catalina.sh start;tailf /usr/local/tomcat/logs/catalina.2019-02-22.log
再次访问http://http.ilinux.io/test,可以留意到Session ID 是一致的,这就说明当前端HA/Nginx/LVS无论如何调度到集群中任何主机,那么会话都是持续保持的
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。