tomcat

数据库优化

1:可以用数据库缓存,常见的memcached

2:数据库自身有很多缓存机制,可使用应对的缓存策略

3:对数据来说;尽可能使用索引

4:对请求来说,可以实现读写分离,对读请求进行负载均衡

5:对大数据或者表,可根据业务逻辑进行分库分表

6:所有的优化,尽可能往内存中存放; 缓存为王

分库分表:

1,水平拆分:将一个大数据表拆分成若干个小表; 例如:一个表中有10亿条记录,将着10亿条记录分成10万条记录为一个表

2,垂直拆分:将一个字段或多个字段分成一个表

数据库优化:

1:缓存优化;可以在程序中写一个缓存服务器,实现缓存

2:数据层面;表尽可能加索引; 读写分离

读写分离:

读和写放在不同的服务器里

 

编程语言分类

硬件级:微码编程,汇编语言

系统级:C, C++

应用级:Java PHP Python Ruby Perl C#,.....

 

面向对象:以数据为中心,面向对象从另一个角度解决这个问题,它抛弃了函数,把对象作为程序的基本单元;对象就是对事物的一种抽象描述

面向过程:以指令为中心;面向过程的设计思路就是首先分析问题的步骤

 

面向对象中:

继承:将上一个程序继承下来,不需要再重新启动一个

封装:不需要知道对方怎么工作,只需要调用就行了

多态:能有多种用途,能实现多种功能

 

PHP开发技术和Java开发技术应用区别

PHP:适合快速开发,中小型应用系统,开发成本低,能够对变动的需求做出快速的反应

Java:适合与开发大型的应用系统,应用的前景比较开阔,系统容易维护,可复用性较好。

 

Java包含三大分支:

1:J2SE----Java standard edition 标准版本,这个是下面两个的基础 ; 一般是位于客户端的应用

2:J2ME----Java Micro edition 一般位于嵌入式应用,例如手机游戏

3:J2EE-----Java Enterprise Edition 一般为服务器端的应用:例如JSP站点

J2EE 规范包含Servlet,主要是为了扩展java作为web服务的功能,他的作用就是为java程序提供 一个统一的web应用的规范,方便程序员统一的使用这种规范来编写程序,应用容器可以使用提供的规范来实现自己的特性。

静态网站技术和动态网站技术区别

web服务器习惯处理静态页面,所以需要一个程序来帮忙处理动态请求(如

当前时间)。Web服务器程序会将动态请求转发给帮助程序,帮助程序处理

后,返回处理后的静态结果给web服务器程序。这样就避免了web服务器

程序处理动态页面。Servlet的本质是一个帮助程序。

 

servlet容器的作用

Web服务器接收到该请求后,并不是将请求直接交给Servlet,而是交给Servlet容器。Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理, 并产生一个响应。这个响应由Servlet容器返回给Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给Web浏览

由于Web服务提供的是静态页面,Web将动态页面发送给Servlet,Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理, 并产生一个响应

生成静态页面,返还给Web服务端,Web服务端,再将这个结果响应给客户端既浏览器

Java Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。 Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立 的字节码,可以被动态地加载到支持Java技术的Web服务器中运行。

Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于 MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用 Servlet的方法(doGet()doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP术 推出后,管理和运行Servlet/JSP的容器也称为Web容器。

有了servlet之后,用户通过单击某个链接或者直接在浏览器的地址栏中输入URL来访问Servlet,Web服务器接收到该请求后,并不是将请求直接交给Servlet,而是交给Servlet容器。Servlet容器实例化Servlet,调用Servlet的一个特定方法对请求进行处理, 并产生一个响应。这个响应由Servlet容器返回给Web服务器,Web服务器包装这个响应,以HTTP响应的形式发送给Web浏览

servlet容器能提供什么?

通信支持:利用容器提供的方法,你能轻松的让servlet与web服务器对话,而不用自己建立serversocket、监听某个端口、创建流等 等。容器知道自己与web服务器之间的协议,所以你的servlet不用担心web服务器(如Apache)和你自己的web代码之间的API,只需要考 虑如何在servlet中实现业务逻辑(如处理一个订单)。

生命周期管理:servlet容器控制着servlet的生与死,它负责加载类、实例化和初始化servlet,调用servlet方法,以及使servlet实例被垃圾回收,有了servlet容器,你不需要太多的考虑资源管理。

多线程支持:容器会自动为它所接收的每个servlet请求创建一个新的java线程。针对用户的请求,如果servlet已经运行完相应的http服务方法,这个线程就会结束。这并不是说你不需要考虑线程安全性,其实你还会遇到同步问题,不过这样能使你少做很多工作。

声明方式实现安全:利用servlet容器,你可以使用xml部署描述文件来配置和修改安全性,而不必将其硬编码写到servlet类代码中。

JSP支持:servlet容器负责将jsp代码翻译为真正的java代码

tomcat是什么?

用Java语言写的实现Servlet和JSP容器的服务器

Tomcat的核心分为3个部分:

(1)Web容器---处理静态页面;

(2)catalina --- 一个servlet容器-----处理servlet;

(3)还有就是JSP容器,它就是把jsp页面翻译成一个Servlet。

 

JSP和Servlet的区别

JSP在本质上就是Servle,但是两者的创建方式不一样。Servlet都是由Java程序代码构成,用于流程控制和事务处理,通过Servlet来生成动态网页很不直观。而JSP由HTML代码和JSP标签构成,可以方便的编写动态网页。

JSP和Servlet主要有两方面的不同:

编译:JSP修改后可以立即看到结果,不需要编译;而Servlet需要编译

转换:JSP是动态网页开发技术,是运行在服务器端的脚本语言;而Servlet是Web服务器端编程技术。

所以JSP运行时就是转换为Servlet,也就是JAVA程序来执行。

通俗而言:jsp就是在html里面写java代码,servlet就是在java里面写html代码…其实jsp经过容器解释之后就是servlet.

 

Tomcat服务器接受客户请求并做出响应的过程如下:

1)客户端(通常都是浏览器)访问web服务器,发送HTTP请求

2)web服务器接受到请求后,传递给Servlet容器

3)Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和相应的对象。

4) Servlet实例使用请求对象得到客户端的信息,然后进行相应的处理

5)Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器

JRE: Java Runtime Environment

JDK:Java Development Kit JRE

JRE:是Java运行环境,包含了Java虚拟机,Java基础类库。是使用Java语言编写的程序运行所需要的软件环境,是提供给想运行Java程序的用户使用的。

JDK:是Java开发工具包,是程序员使用Java语言编写Java程序所需的开发工具包,是提供给程序员使用的JDK包含了JRE,同时还包含了编译Java源码的编译器Javac,还包含了很多Java程序调试和分析分工具::jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。如果你需要运行Java程序,只需要安装JRE就行了;如果你需要编写Java程序,需要安装JDK

JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收购SUN公司的JRE版本。

JAVA虚拟机、tomcat、servlet关系

Tomcat作为独立的Web服务器来单独运行,Servlet容器组件作为Web服务器中的一部分而存在,这是Tomcat的默认工作模式。在这种工作模式下,Tomcat是一个独立运行JAVA程序,需要启动一个Java虚拟机进程来运行Tomcat.

在这种模式下,Tomcat分为Web服务器插件和Serlvet容器组件两部分。

Web服务器插件在其他的web服务器进程外部地址空间启动一个Java虚拟机,Swevlet容器组件在此java虚拟机中运行。。如有客户端发出调用Serlvet

请求,Web服务器插件获得对此请求的控制并转发给Servlet容器组件(采用IPC通讯机制,即进程间通信的一种机制)。

 

JDK安装方式

安装相应版本的rpm包;

jdk-VERSION-OS-ARCH.rpm

例如:jdk-1.8.0_25-linux-x64.rpm centos7系统自带

yum -y install java-1.8.0-openjdk-devel

java -version 显示java程序的版本信息

注意:安装完成后,要配置JAVA_HOME环境变量,指向java的安装路径;

或者直接官网下载RPM包:

lftp 172.17.0.1

rpm -ivh jdk-8u144-linux-x64.rpm

vim /etc/profile.d/java.sh

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64

JRE_HOME=$JAVA_HOME/jre

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

 

tomcat安装方式

1、从官网下载tomcat二进制安装包(http://tomcat.apache.org/

#wget

http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-

8/v8.5.11/bin/apache-tomcat-8.5.11.tar.gz

#tar xvf apache-tomcat-8.5.11.tar.gz -C /usr/local/

查看解压后的目录;

#ll /usr/local/ | grep tomcat

2、为方便管理,创建软链接;

3、创建环境配置脚本;

#vim /etc/profile.d/tomcat.sh

赋予执行权限;

#chmod +x /etc/profile.d/tomcat.sh

加载环境配置;

#source /etc/profile.d/tomcat.sh

4、启动tomcat

#/usr/local/tomcat/bin/catalina.sh start 或 #catalina.sh start

查看tomcat是否正常启动

5、测试本地8080端口是否正常监听

#curl -I 127.0.0.1:8080

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

另一种安装方式:

tomcat安装方式

yum install tomcat -y #安装tomcat主程序

yum install -y tomcat-admin-webapps tomcat-docs-webapp tomcatwebapps

#安装tomcat对应的页面

mkdir /var/lib/tomcat/webapps/{ROOT,test}/{WEB-INF,METAINF,

classes,lib} -pv #创建页面所需要的工作目录

rpm包安装的程序环境:

配置文件目录:/etc/tomcat

主配置文件:server.xml

webapps存放位置:/var/lib/tomcat/webapps/

examples

manager

host-manager

docs

Unit File:tomcat.service

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

环境配置文件:/etc/sysconfig/tomcat #调整jdk内存使用大小等初始值

6、通过浏览器访问测试(需指定8080端口),注意selinux与

iptables策略;

tomcat的组成

bin:脚本,及启动时用到的类;

conf:配置文件目录;

lib:库文件,Java类库,jar;

logs:日志文件目录;

temp:临时文件目录;

webapps:网站代码 webapp的默认目录;网站源文件

work:工作目录,存放编译后的字节码文件;

 

tomcat的配置文件构成:

server.xml:主配置文件;

web.xml:Web应用程序描述文件,可以设置tomcat支持的文件类型,都是关于是

Web应用程序的配置文件

context.xml:可以用来配置数据库之类的信息

tomcat-users.xml:用户认证的账号和密码文件;角色(role),用户(User);

此文件在tomcat启动时被装入内存;

catalina.policy:当使用-security选项启动tomcat时,用于为tomcat设置安全策

略;

catalina.properties:Java属性的定义文件,用于设定类加载器路径,以及一些与

JVM调优相关参数;

logging.properties:日志系统相关的配置;

 

server.xml 配置文件

Server:Server表示整个的Catalina Servlet容器。Tomcat提供了Server接口的一个默认实现,这通常不需

要用户自己去实现。在Server容器中,可以包含一个或多个Service组件。代表tomcat instance,即表现出

的一个java进程;监听在8005端口,只接收"SHUTDOWN"。各server监听的端口不能相同,因此,在同

一物理主机启动多个实例时,需要修改其监听端口为不同的端口;

Service:Service是存活在Server内部的中间组件,它将一个或多个连接器(Connector)组件绑定到一个

单独的引擎(Engine)上。用于实现将一个或多个connector组件关联至一个engine组件;

Connector组件:连接器(Connector)处理与客户端的通信,它负责接收客户请求,以及向客户返回响应

结果。在Tomcat中,有多个连接器可以使用。常见的有三类http/https/ajp;

Engine组件:在Tomcat中,每个Service只能包含一个Servlet引擎(Engine)。引擎表示一个特定的

Service的请求处理流水线。作为一个Service可以有多个连接器,引擎从连接器接收和处理所有的请求,将

响应返回给适合的连接器,通过连接器传输给用户。Servlet实例,即servlet引擎,其内部可以一个或多个

host组件来定义站点;

Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机 类似 nginx server

Context组件 一个Context表示了一个Web应用程序,运行在特定的虚拟主机中,一个Host可以包含多个

Context(代表Web应用程序) 类似nginx location

每一个组件都由一个Java"类"实现,这些组件大体可分为以下几个类型:

顶级组件:Server

服务类组件:Service

连接器组件:http, https, ajp(apache jserv protocol)

容器类:Engine, Host, Context 部署应用程序的组件

被嵌套类:valve, logger, realm, loader, manager, …

集群类组件:listener, cluster, …

 

JSP WebAPP的组织结构:

/: webapps的根目录

index.jsp:主页;

...W EB-INF/:当前webapp的私有资源路径;通常用于存储当前webapp的web.xml和

context.xml配置文件;

META-INF/:类似于WEB-INF/;

classes/:类文件,当前webapp所提供的类;

lib/:类文件,当前webapp所提供的类,被打包为jar格式;

webapp归档格式:

.war:Web应用程序归档,webapp;

.jar: Java应用程序归档,EJB的类打包文件(类库);

.rar:资源适配器类打包文件;

.ear:企业应用程序归档包,企业级webapp;

 

tomcat的日志类

%a - 远程IP地址

%A - 本地IP地址

%b - 发送的字节数,不包括HTTP头,或" - "如果没有发送字节

%B - 发送的字节数,不包括HTTP头

%h - 远程主机名

%H - 请求协议

%l (小写的L)- 远程逻辑从identd的用户名(总是返回' - ')

%m - 请求方法

%p - 本地端口

%q - 查询字符串(在前面加上一个"?"如果它存在,否则是一个空字符串

%r - 第一行的要求

%s - 响应的HTTP状态代码

%S - 用户会话ID

%t - 日期和时间,在通用日志格式

%u - 远程用户身份验证

%U - 请求的URL路径

%v - 本地服务器名

%D - 处理请求的时间(以毫秒为单位)

%T - 处理请求的时间(以秒为单位)

%I (大写的i) - 当前请求的线程名称

 

tomcat的部署

部署(deploy)webapp的相关操作:

deploy:将webapp的源文件放置于目标目录(网页程序文件存放目录),配置tomcat服务器能

够基于web.xml和context.xml文件中定义的路径来访问此webapp;将其特有的类和依赖的

类通过class loader装载至JVM;

部署有两种方式:

自动部署:auto deploy

手动部署:

冷部署:把webapp复制到指定的位置,而后才启动tomcat;

热部署:在不停止tomcat的前提下进行部署;

部署工具:manager、ant脚本、tcd(tomcat client deployer)等;

undeploy:拆除(反部署),停止webapp,并从tomcat实例上卸载webapp;

start:启动处于停止状态的webapp;

stop:停止webapp,不再向用户提供服务;其类依然在jvm上;

redeploy:重新部署;

 

以下是Tomcat Manager 4种角色的大致介绍(下面URL中的*为通配符):

manager-gui

允许访问html接口(即URL路径为/manager/html/*)

manager-script

允许访问纯文本接口(即URL路径为/manager/text/*)

manager-jmx

允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)

manager-status

允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)

admin-gui(HTML UI接口)或admin-script(纯文本接口)。即URL路径为/hostmanager

 

作业:

 

 

目前公司和企业使用的Web服务器还有WebSphere,WebLogic,Jetty,JBoss等

等,但是大多数是收费的,针对我们平时开发的大多数项目,

Tomcat的性能已经能够满足我们的要求,因此大多数企业中的开

发者或者小公司还是常用Tomcat作为应用服务器。这些也是servlet容器

 

tomcat常用组件和属性

tomcat的常用组件配置:

Server:代表tomcat instance,即表现出的一个java进程;监听在8005端口,只接收"SHUTDOWN"。各server监听的

端口不能相同,因此,在同一物理主机启动多个实例时,需要修改其监听端口为不同的端口;

Service:用于实现将一个或多个connector组件关联至一个engine组件;

Connector组件:

负责接收请求,常见的有三类http/https/ajp;(AJP(Apache JServ Protocol)是定向包协议。因为性能原因,使用二进

制格式来传输可读性文本。WEB服务器通过 TCP连接 和 SERVLET容器连接。)

属性:

port="8080"

protocol="HTTP/1.1"

connectionTimeout="20000"

address:监听的IP地址;默认为本机所有可用地址;

maxThreads:最大并发连接数,默认为200;

enableLookups:是否启用DNS查询功能;

acceptCount:等待队列的最大长度;

redirectPort="8443" 需要安全通信的场合,将把客户请求转发至SSL的redirectPort端口

sslProtocol: 使用ssl协议的加密方式

 

tomcat的常用组件配置:

Engine组件:Servlet实例,即servlet引擎,其内部可以一个或多个host组件来定义站点; 通常需要通过defaultHost来定

义默认的虚拟主机;

属性:name=

defaultHost="localhost"

Host组件:位于engine内部用于接收请求并进行相应处理的主机或虚拟主机,示例:

<Host name="localhost" appBase="webapps"

unpackWARs="true" autoDeploy="true">

</Host>

常用属性说明:

(1) appBase:此Host的webapps的默认存放目录,指存放非归档的web应用程序的目录或归档的WAR文件目录路径;可以

使用基于$CATALINA_BASE变量所定义的路径的相对路径;

(2) autoDeploy:在Tomcat处于运行状态时,将某webapp放置于appBase所定义的目录中时,是否自动将其部署至

tomcat;

(3)unpackWARs="true" 则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序

 

tomcat的常用组件配置:

Context组件:

示例:

<Context path="/PATH" docBase="/PATH/TO/SOMEDIR" />

Valve组件:

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

prefix="localhost_access_log" suffix=".txt"

pattern="%h %l %u %t &quot;%r&quot; %s %b" />

Valve存在多种类型:

定义访问日志:org.apache.catalina.valves.AccessLogValve

定义访问控制:org.apache.catalina.valves.RemoteAddrValve

<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="172\.16\.100\.67"/>

 

 

 

 

定义名称 ;以及名称匹配:

 

实现企业级常见架构LNMT

LNMP动态请求通过cgi(通用网关接口)交给PHP处理

LNMT动态请求通过 tomcat 中的servlet处理的

LNMT:Linux Nginx MySQL Tomcat

Client (http) --> nginx (reverse proxy)(http) --> tomcat (http connector)

location / {

proxy_pass http://tc1.magedu.com:8080;

} 转交

location ~* \.(jsp|do)$ {

proxy_pass http://tc1.mage du.com:8080;

}

 

nginx反向代理tomcat:

反向代理:客户端将请求发送给nginx,Nginx再将请求发送给tomcat

http段:

location段:

也可以通过动静分离实现:

 

nginx -t :nginx配置文件的排错命令

显示配置文件中行号:

定义nginx集群:通过upstream配集群

hash:会话保持

实现LNMT的会话保持

会话保持:

(1) session sticky

基于source_ip nginx: ip_hash haproxy: source lvs: sh

基于cookie:nginx:sticky haproxy: cookie

(2) session cluster:delta session manager

(3) session server:redis(store), memcached(cache

DeltaManager会话管理器是tomcat默认的集群会话管理器;它主要用于集群中各个节点之间会话状态的同步维护

所有的节点都是tomcat,当客户端向其中一个节点发送请求时,tomcat会创建一个session,在tomcat中有一个session管理机制,通过组播,会向所有的节点发广播,其他节点收到广播之后,会将这个session复制一份,存到自己的机器上。

 

 

 

基于tomcat集群会话保持配置文件

<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">

<MembershipclassName="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"/>

<SenderclassName="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"/>

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

</Cluster>

 

基于tomcat集群会话保持配置

1、Cluster配置:

Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点.

className 表示tomcat集群时,之间相互传递信息使用那个类来实现信息

之间的传递.

channelSendOptions可以设置为2、4、8、10,每个数字代表一种方式

2 = Channel.SEND_OPTIONS_USE_ACK(确认发送)

4 = Channel.SEND_OPTIONS_SYNCHRONIZED_ACK(同步发送)

8 = Channel.SEND_OPTIONS_ASYNCHRONOUS(异步发送)

在异步模式下,可以通过加上确认发送(Acknowledge)来提高可靠性,此

时channelSendOptions设为10

实现会话保持的代码:

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"

channelSendOptions="8">

2.Manager介绍

Manger对象用于实现HTTP会话管理的功能,Tomcat中有5种Manger的实现:

(1).StandardManager

Tomcat6的默认会话管理器,用于非集群环境中对单个处于运行状态的Tomcat实例会话

进行管理。当Tomcat关闭时,这些会话相关的数据会被写入磁盘上的一个名叫

SESSION.ser的文件,并在Tomcat下次启动时读取此文件。

(2).PersistentManager

当一个会话长时间处于空闲状态时会被写入到swap会话对象,这对于内存资源比较吃紧

的应用环境来说比较有用。

 

(4).BackupManager

用于Tomcat集群的会话管理器,与DeltaManager不同的是,某节点会话的改变只会同

步给集群中的另一个而非所有节点。

 

2、Manager配置

className-指定实现org.apache.catalina.ha.ClusterManager接口的类,信息之间的管

expireSessionsOnShutdown-设置为true时,一个节点关闭,将导致集群下的所有

Session失效

notifyListenersOnReplication-集群下节点间的Session复制、删除操作,是否通知

session listeners

<Manager className="org.apache.catalina.ha.session.DeltaManager"

expireSessionsOnShutdown="false"

notifyListenersOnReplication="true"/>

 

3、Channel介绍和配置

Channel是Tomcat节点之间进行通讯的工具Channel包括4个组件:

Membership 集群的可用节点列表

Receiver 接收器,负责接收消息

Sender 发送器,负责发送消息

Interceptor Cluster的拦截器

<Channel className="org.apache.catalina.tribes.group.GroupChannel">

 

Membership:维护集群的可用节点列表,它可以检查到新增的节点,也可以检查到没有心跳的节点

className-指定Membership使用的类

address-组播地址

port-组播端口

frequency-发送心跳(向组播地址发送UDP数据包)的时间间隔(单位:ms)。默认值为500

dropTime-Membership在dropTime(单位:ms)内未收到某一节点的心跳,则将该节点从可用节点

列表删除。默认值为3000

注: 组播(Multicast):一个发送者和多个接收者之间实现一对多的网络连接。

一个发送者同时给多个接收者传输相同的数据,只需复制一份相同的数据包。

它提高了数据传送效率,减少了骨干网络出现拥塞的可能性

相同组播地址、端口的Tomcat节点,可以组成集群下的子集群

<Membership className="org.apache.catalina.tribes.membership.McastService"

address="228.0.0.4"

port="45564"

frequency="500"

dropTime="3000"/>

 

Receiver : 接收器,负责接收消息

接收器分为两种:BioReceiver(阻塞式)、NioReceiver(非阻塞式)

className-指定Receiver使用的类

address-接收消息的地址

port-接收消息的端口

autoBind-端口的变化区间

如果port为4000,autoBind为100,接收器将在4000-4099间取一个端口,进行监听

selectorTimeout-NioReceiver内轮询的超时时间

maxThreads-线程池的最大线程数

<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"

address="auto"

port="4000"

autoBind="100"

selectorTimeout="5000"

maxThreads="6"/>

 

Sender : 发送器,负责发送消息

Sender内嵌了Transport组件,Transport真正负责发送消息

-->

<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">

<!--

Transport:定义传输方式

Transport分为两种:bio.PooledMultiSender(阻塞式)、nio.PooledParallelSender(非阻塞式)

<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>

</Sender>

 

Interceptor : Cluster的拦截器

TcpFailureDetector-网络、系统比较繁忙时,Membership可能无法及时更新可用节点列表,

此时TcpFailureDetector可以拦截到某个节点关闭的信息,

并尝试通过TCP连接到此节点,以确保此节点真正关闭,从而更新集群可以用节点列表

<Interceptor

className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>

MessageDispatch15Interceptor-查看Cluster组件发送消息的方式是否设置为

Channel.SEND_OPTIONS_ASYNCHRONOUS(Cluster标签下的channelSendOptions为8时)。 设

置为Channel.SEND_OPTIONS_ASYNCHRONOUS时,

MessageDispatch15Interceptor先将等待发送的消息进行排队,然后将排好队的消息转给Sender

<Interceptor

className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>

ClusterListener : 监听器,监听Cluster组件接收的消息

使用DeltaManager时,Cluster接收的信息通过ClusterSessionListener传递给DeltaManager

-->

<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>

 

基于tomcat集群会话保持测试页面

<%@ page language="java" %>

<html>

<head><title>TomcatB</title></head>

<body>

<h1><font color="blue">TomcatB </h1>

<table align="centre" border="1">

<tr>

<td>Session ID</td>

<% session.setAttribute("abc","abc"); %>

<td><%= session.getId() %></td>

</tr>

<tr>

<td>Created on</td>

<td><%= session.getCreationTime() %></td>

</tr>

</table>

</body>

</html>

 

tomcat结合memcached实现seesion共享

Tomcat Session Server (memcached)

https://github.com/magro/memcached-session-manager

支持的session server类型:

memcached:

redis:

memcached-session-manager-2.1.1.jar

memcached-session-manager-tc7-2.1.1.jar(注意:要根据

tomcat版本下载相应的)

spymemcached-2.11.1.jar

msm-javolution-serializer-2.1.1.jar

javolution-5.4.3.1.jar

 

 

 

JVM虚拟机工作机制和优化

堆:(对象)

引用类型的变量,其内存分配在堆上或者常量池(字符串常量、基本数据类型常量)

,需要通过new等方式来创建。

堆内存主要作用是存放运行时创建(new)的对象。

(主要用于存放对象,存取速度慢,可以运行时动态分配内存,生存期不需要提前确

定)

栈:(基本数据类型变量、对象的引用变量){对象的定义内容}

基本数据类型的变量(int、short、long、byte、float、double、boolean、char等

)以及对象的引用变量 ,其内存分配在栈上,变量出了作用域就会自动释放。

栈内存的主要作用是存放基本数据类型和引用变量。栈的内存管理是通过栈的"后进先

出"模式来实现的。

(主要用来执行程序,存取速度快,大小和生存期必须确定,缺乏灵活性)

 

Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)

之一,为应用程序提供内存的自动分配(Memory Allocation)、自动回收(Garbage

Collect)功能,这两个操作都发生在Java堆上(一段内存快)。

某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活

着的(Live),否则死亡(Dead),视为垃圾,可被垃圾回收器回收再利用。

垃圾回收操作需要消耗CPU、线程、时间等资源,所以容易理解的是垃圾回收操作不

是实时的发生(对象死亡马上释放),当内存消耗完或者是达到某一个指标(Threshold,

使用内存占总内存的比列,比如0.75)时,触发垃圾回收操作。

有一个对象死亡的例外,java.lang.Thread类型的对象即使没有引用,只要线程还在运

行,就不会被回收。

依据统计分析可知,Java(包括一些其它高级语言)里面大多数对象生命周期都是短暂的

,所以把Java内存分代管理。分代的目的无非就是为不同代的内存块运用不同的管理

策略(算法),从而最大化性能。相对于年老代,通常年轻代要小很多,回收的频率高,

速度快。年老代则回收频率低,耗时长内存在年轻代里面分配,年轻代里面的对象

经过多个回收周期依然存活的会自动晋升到年老代。

 

垃圾回收的类型

所有的回收器类型都是基于分代技术。Java HotSpot虚拟机包含三代,年轻代(Young

Generation)、年老代(Old Generation)、永久代(Permanent Generation)。

永久代

存储类、方法以及它们的描述信息。可以通过-XX:PermSize=64m和-

XX:MaxPermSize=128m两个可选项指定初始大小和最大值。通常 我们不需要调节该

参数,默认的永久代大小足够了,不过如果加载的类非常多,不够用了,调节最大值

即可。

年老代

主要存储年轻代中经过多个回收周期仍然存活从而升级的对象,当然对于一些大的内

存分配,可能也直接分配到永久代(一个极端的例子是年轻代根本就存不下)。

年轻代

绝大多数的内存分配回收动作都发生在年轻代。如下图所示, 年轻代被划分为三个区域

原始区(Eden)和两个小的存活区(Survivor),两个存活区按功能分为From和To。绝

大多数的对象都在原始区分配,超过一个垃圾回收操作仍然存活的对象放到存活区

JAVA虚拟机垃圾回收机制

Minor GC

从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC。这一定义

既清晰又易于理解。但是,当发生Minor GC事件的时候,

当 JVM 无法为一个新的对象分配空间时会触发 Minor GC,比如当 Eden 区满了。所

以分配率越高,越频繁执行 Minor GC。

所有的 Minor GC 都会触发"全世界的暂停(stop-the-world)"即停止应用程序的线程。

 

Major GC vs Full GC

指发生在老年代的 GC,出现了 Major GC,经常

会伴随至少一次的 Minor GC 。MajorGC 的速度一般会比 Minor GC 慢 10

倍以上。

当发生Full GC时,也会触发"全世界的暂停(stop-the-world)"即停止应用程序的

线程。并且持续时间长。

 

大GC和小GC:

小GC:一个JAVA程序,当一个请求需要NEW一个对象时,需要去新生代中的原始区申请空间,发现满了,就会启动垃圾回收机制,回收年轻代中的存活区,如果发现好几次回收不上来,就会将其转到老年代。

大GC:通过小GC垃圾回收机制,转移到大老年代后,如果老年代满了,就会启动大GC

 

JVM常用的分析工具:

jps: jps主要用来输出JVM中运行的进程状态信息

jinfo:查看进程的运行环境参数,主要是jvm命令行参数; (可以查看很多信息结构,主要是排查路径,变量,操作系统,老年代,新生代大小等有什么错误)

jstat:对jvm应用程序的资源和性能进行实时监控;

jstack:查看所有线程的运行状态;

jmap:查看jvm占用物理内存的状态

jps:Java virutal machine Process Status tool,jps [-q] [-mlvV] [<hostid>]

-q:静默模式;

-v:显示传递给jvm的命令行参数;

-m:输出传入main方法的参数;

-l:输出main类或jar完全限定名称;

-V:显示通过flag文件传递给jvm的参数;

[<hostid>]:主机id,默认为localhost;

 

jinfo:输出给定的java进程的所有配置信息;主要查看环境变量

jinfo [option] <pid>

-flags:to print VM flags

 

Tomcat排错三剑客工具:

jstack:查看指定的java进程的线程栈的相关信息;(重要的排错工具)jmap:Memory Map, 用于查看堆内存的使用状态;(重要的排错工具)

jstat:输出指定的java进程的统计信息(重要 的排错工具)

主要查看:

jstack [-l] <pid>

jstack -F [-m] [-l] <pid>

-l:long listings,会显示额外的锁信息,因此,发生死锁时常用此选项;比如block

-m:混合模式,既输出java堆栈信息,也输出C/C++堆栈信息;比如在什么地理位置存了什么东西

-F:当使用"jstack -l PID"无响应,可以使用-F强制输出信息

Htop:可以抓一个JAVA线程来看系统使用情况;可以查看哪个线程是否有异常

 

 

jstat:输出指定的java进程的统计信息(重要 的排错工具)

jstat -help|-options

jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

# jstat -options

-class:class loader 类加载统计

-compiler:JIT 编译统计

-gc:gc

-gcnew:新生代

-gcold:老年代

-printcompilation JVM编译方法统计

[<interval> [<count>]]

interval:时间间隔,单位是毫秒;

count:显示的次数;

 

设置1秒显示1000次:

 

 

jmap:Memory Map, 用于查看堆内存的使用状态;(重要的排错工具)

这个命令主要用于JAVA开发工作中发现程序很卡,会让运维打印出来内存的使用情况

这个命令从内存中查看打印对象内容的详细信息非常消耗资源,在生产环境中不要随便用

jmap [option] <pid>

查看堆空间的详细信息:

jmap -heap <pid>

查看堆内存中的对象的数目:

jmap -histo <pid>

live:只统计活动对象;

保存堆内存数据至文件中,而后使用jvisualvm或jhat进行查看:

jmap -dump:<dump-options> <pid>

dump-options:

live dump only live objects; if not specified, all objects in the heap are

dumped.

format=b binary format

file=<file> dump heap to <file>

jmap -dump:format=b,file=dumpFileName

 

如果tomcat出现问题可以从以下几方面着手查看:

首先查看服务和以下几点:

tomcat优化可从三方面着手:

1、架构层面

2、tomcat配置文件设置(并发)可以去共享线程池调节数据大小,一般把最大线程数改成日常峰值的2倍 最大空闲时间等

3、tomcat对业务场景的内存定制

 

Tomcat配置文件优化

tomcat优化

一、配置文件参数优化

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"

maxThreads="500" minSpareThreads="20" maxSpareThreads="50"

maxIdleTime="60000"/>

maxThreads :Tomcat 使用线程来处理接收的每个请求,这个值表示 Tomcat 可创建的最大的线程

数,默认值是 200

minSpareThreads:最小空闲线程数,Tomcat 启动时的初始化的线程数,表示即使没有人使用也

开这么多空线程等待,默认值是 10。

maxSpareThreads:最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要

的 socket 线程。

maxIdleTime: 最大空闲时间

 

tomcat优化

一、配置文件参数优化

<Connector executor="tomcatThreadPool"

port="8080" protocol="HTTP/1.1"

URIEncoding="UTF-8"

connectionTimeout="30000" #连接超时时间

enableLookups="false" #是否启用dns解析,建议禁用;

connectionUploadTimeout="150000" #上传最大超时时间

acceptCount="300" #等待队列的最大长度; 默认为100个。

keepAliveTimeout="120000" #长连接保持时间

maxKeepAliveRequests="500" # 每个TCP连接接受最大的Http请求数目,当处理一个

keep alive请求达到这个最大值,Tomcat关闭这个连接

compression="on" #是否启用传输压缩机制,建议"on";

compressionMinSize="2048" #启用压缩传输的数据流最小值,单位是字节

compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,i

mage/jpg,image/png" 定义启用压缩功能的MIME类型;

redirectPort="8443" />

 

二、tomcat启动参数优化

Tomcat 启动命令行中的优化参数,就是 JVM 的优化 。Tomcat 首先跑在 JVM 之上的,因为它

的启动其实也只是一个 java 命令行,首先我们需要对这个 JAVA 的启动命令行进行调优。不管是

YGC 还是 Full GC,GC 过程中都会对导致程序运行中中断,正确的选择不同的 GC 策略,调整

JVM、GC 的参数,可以极大的减少由于 GC 工作,而导致的程序运行中断方面的问题,进而适当

的提高 Java 程序的工作效率。但是调整 GC 是以个极为复杂的过程,由于各个程序具备不同的特

点,如:web 和 GUI 程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的)

,而且由于跑在各个机器上的配置不同(主要 cup 个数,内存不同),所以使用的 GC 种类也会

不同。

CATALINA_OPTS:用于当 Java 运行时选项"start"或"run"命令执行。

CATALINA_OPTS=" -server -verbose:gc -XX:+PrintGCTimeStamps -Xms1024m -

Xmx1024m -XX:NewSize=341m -XX:MaxNewSize=341m -XX:SurvivorRatio=2 -

XX:PermSize=128m -XX:MaxPermSize=128m -XX:ThreadStackSize=512"

 

二、tomcat启动参数优化

CATALINA_OPTS=" -server -verbose:gc -Xms1024m -Xmx1024m -XX:NewSize=341m -

XX:MaxNewSize=341m -XX:NewRatio=2 -XX:PermSize=128m -XX:MaxPermSize=128m -

XX:ThreadStackSize=512" 将这串代码加入到配置文件中,增加性能

-server 进入服务器模式,可提升运行时性能和内存管理效率很高

-verbose:gc - 输出GC详细信息,可以了解这些垃圾收集发生的情况 便于排错

-Xms:表示 Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存

-Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出

,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。

OOM:内存泄漏;当内存用的过大时,会发生OOM内存泄漏情况,会强行把这个进程杀死

-XX:NewSize:设置新生代内存大小。

-XX:MaxNewSize:设置最大新生代新生代内存大小

-XX:PermSize:设置持久代内存大小

-XX:MaxPermSize:设置最大值持久代内存大小

-XX:NewRatio=2:设置年轻代(包括1个Eden和2个Survivor区)与年老代的比值。表示年轻代

比年老代为1:2。

 

tomcat企业常见面试题

1、tomcat是什么?

servlet容器,三部分组成:web server ; servlet容器 ;jsp容器

工作原理:处理servlet容器动态请求,通过tomcat加载,把servlet容器动态请求进行编译处理,然后交给JPM,翻译成机器码。

 

2、什么是GC,工作机制是什么?

3、tomcat如何实现session共享?

三种方式

4、如何进行tomcat优化?

5、jsp网站出了问题,该如何排错?

学会看日志

JAVA排错工具三剑客

6、tomcat的server.xml配置文件结构是怎样的?

server service connecter 引擎 host conseat

7、网站war包如何进行部署?

8、说说你常用的java排错工具有哪些?

jstack:查看指定的java进程的线程栈的相关信息;(重要的排错工具)jmap:Memory Map, 用于查看堆内存的使用状态;(重要的排错工具)

jstat:输出指定的java进程的统计信息(重要 的排错工具)

posted @ 2017-11-27 09:01  梦梦萌  阅读(331)  评论(0编辑  收藏  举报