什么是中间件?
对于这个问题,应该说还没有一个标准的定义,或者说还没有完全取得学术界和产业界的共识。 IDC曾经给中间件下的定义是中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信。 我国学术界一般认可的定义是中间件是指网络环境下处于操作系统、数据库等系统软件和应用软件之间的一种起连接作用的分布式软件,主要解决异构网络环境下分布式应用软件的互连与互操作问题,提供标准接口、协议,屏蔽实现细节,提高应用系统易移植性
中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。形象地说就是上下之间的中间。 此外,中间件主要为网络分布式计算环境提供通信服务、交换服务、语义互操作服务等系统之间的协同集成服务,解决系统之间的互连互通问题。形象地说就是所谓左右之间的中间。
linux下安装tomcat
Tomcat下载地址: http://tomcat.apache.org/download-70.cgi 下载后解压:tar -zxvf apache-tomcat-7.0.73.tar.gz mkdir /usr/local/tomcat 将tomcat复制到/usr/local下 cp apache-tomcat-7.0.73 /usr/local/tomcat 注:tomcat服务器运行时是需要JDK支持的,所以必须配置好JDK,注意JDK与tomcat版本
配置环境变量
编辑profile文件:vi /etc/profile 在文件中添加以下代码: export TOMCAT_HOME=/usr/local/tomcat7 export CATALINA_HOME=/usr/local/tomcat7 保存文件退出编辑。 使设置立即生效:source /etc/profile 至此,tomcat已经搭建完毕。
tomcat的相关设置
启动和关闭tomcat: ./startup.sh 或者 ./catalina.sh start 启动tomcat ./catalina.sh stop 或 ./shutdown.sh 停止tomcat /home/apache-tomcat-7.0.73/conf/中的server.xml文件默认端口为8080, 打开防火墙端口命令如下: /sbin/iptables -I INPUT -p tcp –dport 8080 -j ACCEPT 保存 /etc/rc.d/init.d/iptables save 重启防火墙使得立即生效 /etc/init.d/iptables restart
防火墙中添加8080端口
也可以在/etc/sysconfig/iptables文件中增加一行信息: -A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 8080 -j ACCEPT 查看防火墙状态的命令: service iptables status
使用浏览器访问tomcat管理页面
2.优化
JavaWeb应用部署
将JavaWeb应用部署到Tomcat服务器:就是将开发好的JavaWeb应用打包成war包,然后发布到tomcat服务器的webapps目录下
内存优化
优化内存,主要是在bin/catalina.sh 配置文件中进行。linux上,在catalina.sh中添加: JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxNewSize=256M" -server:启用jdk的server版本。 -Xms:虚拟机初始化时的最小堆内存。 -Xmx:虚拟机可使用的最大堆内存。 -Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
-XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64。 -XX:MaxNewSize:新生代占整个堆内存的最大值。 • -XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。
内存泄漏
XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。 说说为什么会内存益出: 这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。 GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。 这种错误常见在web服务器对JSP进行precompile的时候。
堆内存报错
错误提示:java.lang.OutOfMemoryError:Java heap space Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误,Outof Memory(系统内存不足)的异常,从而导致客户端显示500错误,一般调整Tomcat的-Xms和-Xmx即可解决问题,通常将-Xms和-Xmx设置成一样,堆的最大值设置为物理可用内存的最大值的80%。 set JAVA_OPTS=-Xms512m-Xmx512m
非堆内存报错
错误提示:java.lang.OutOfMemoryError: PermGenspace PermGenspace的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。解决方法: setJAVA_OPTS=-XX:PermSize=128M
在使用-Xms和-Xmx调整tomcat的堆大小时,还需要考虑垃圾回收机制。如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
连接数优化-优化线程数
优化连接数,主要是在conf/server.xml配置文件中进行修改。 找到Connectorport="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads),如下: <Connectorport="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />
其中: • maxThreads:tomcat可用于请求处理的最大线程数,默认是200 • minSpareThreads:tomcat初始线程数,即最小空闲线程数 • maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭 • acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100
使用线程池
在server.xml中增加executor节点,然后配置connector的executor属性,如下: <Executorname="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/> <Connectorport="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>
其中: • namePrefix:线程池中线程的命名前缀 • maxThreads:线程池的最大线程数,tomcat能创建来处理请求的最大线程数 • maxSpareTHreads, 最大空闲线程数,在最大空闲时间内活跃过,但现在处于空闲,若空闲时间大于最大空闲时间,则回收,小于则继续存活,等待被调度 • minSpareThreads:线程池的最小空闲线程数,无论如何都会存活的最小线程数 • maxIdleTime:最大空闲时间,超过这个空闲时间,且线程数大于最小空闲数的,都会被回收 • threadPriority:线程优先级
tomcat线程池工作原理图
注:当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报java.net.SocketException:Too many open files错误。可使用下面步骤检查: ps -ef |grep tomcat 查看tomcat的进程ID,记录ID号,假设进程ID为10001 lsof -p 10001|wc -l 查看当前进程id为10001的 文件操作数 使用命令:ulimit -a 查看每个用户允许打开的最大文件数
Tomcat Connector三种运行模式(BIO, NIO, APR)
BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。 NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件): <Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/> APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。