Java-Tomcat

一、web补充技术

①:B/S架构

主流的方式,只要有浏览器即可。编程方式直接基于socket即可

②:javascript

简称js,早期只是实现在客户端的浏览器的动态效果,但服务端不会解释运行,所以本质上是静态资源。

2008年后v8引擎诞生,js成为了既可以在前端运行,又可以在后端执行的前后端通吃的编程语言。

③:网页技术之 同步 和 异步

同步:整个页面统一整体加载

异步:在基于交互式网页中,可以实现网页中单个模块的异步单独加载网页内容

主流的网页技术为ajax(Asynchronous Javascript And XML),早期页面交互基于XML,

但XML文件过于臃肿,现如今前后端分离主流交互页面的技术主要是基于json来实现页面交互。

当今主流前后端web分离,基于restful风格

以前前后端分离走的是fastcgi(php适合做单体架构,不适合做微服务)、uswcgi等技术,现在主流走的是http协议(基于6大基本方法:put、get、post、delete等来交互json)

流程: 客户端下载APP,在APP里面访问动态页面,可以直接访问html,此时html内部涉及一些业务逻辑,就会基于http协议发数据;如果后台是java,http协议就会通过put、post、get等一些请求方法从后台数据库交换数据,将数据的结果再基于http协议通过6大请求方法,把结果异步交互到某个html页面中的某个模块中。这样就可以在不同时间点异步看到不同模块的动态内容

④:单体架构和微服务

单体架构:一个项目一般为一个大的部署的应用程序,里面可能将订单、商品、库存、支付、登录、注册等多个功能模块打包在一起,在java中,一般以war包或ear包来部署。

**优点:**简单方便,若需要扩展,只需将war包进行复制部署负载均衡即可。开发方便,没有调用消耗,测试也方便

**缺点:**耦合度高,各个模块依赖太强,若某个模块出现问题,需要整体构建、重新部署,重新打包;而且管理难度大。这样不利于项目的大规模扩展和和业务的迭代。

API gateway(各个微服务之间通信):nacos、zk既可以实现rpc(逻辑层,效率高),又可以实现restful(资源层、更加灵活);协调跨主机通信

API:应用编程接口

分库分表:mycat(读写分离)

微服务:将单体架构拆开,每个大的项目拆分成为单个的小的服务,每个服务足够内聚,能聚焦一个业务功能需求。

**优点:**开发简单,效率很高,耦合性低,专人干专事(小团队开发小服务,而且开发和部署都各自独立)

可以使用不同的开发语言,而且可以完全实现前后端分离。

非常方便和灵活的第三方持续集成,例如jenkins。

微服务可以有自己的存储能力,拆分和细化数据库。

**缺点:**由于拆分的独立工程太多,开发、测试、运维、监控复杂度较大。

为了保证不同微服务之间的数据一致性,设计架构难度角度;开发和运维需要极强的技术能力(例如docker和k8S)。

只适用于超大型或大型的系统架构。若盲目使用微服务只会增添开发、维护和其他成本。

二、java技术体系

1.JAVA编程语言特性

属于应用级的面向对象的编程语言,基于虚拟环境(虚拟机,虚拟自己需要的类库,提供程序自己所需的运行环境)进行运行。

虚拟环境:jvm

在某些特定程序需要在非服务器端(客户端)进行运行时候,如果服务器端只是提供的应用程序的源代码,源代码加载到客户端本地进行预运行。

但是由于ABI不一样,无法跨操作系统,形成移植化(无法一次编译,到处运行)

2.动态网页的相关技术

动态网站开发语言:asp .net jsp (php) .py .pl

动态网站:客户端动态:

服务器动态:CGI fpm

webapp server:

jsp:tomcat jboss jetty webspre weblogic (不仅可以跑动态,也可以裸奔跑静态)

php:php-fpm

3.JAVA语言的发展

早期由SUN,作者为詹姆斯*高思林,是为了实现机顶盒项目公司而开发。后改名为JAVA,后广泛利用在web动态网站的开发。属于客户端动态,现如今属于世界上中最为广泛、流行的应用级编程语言。

1995年:JAVA 1.0发布

1996年:JDK 1.0发布 (主流技术 JVM Applet AWT)

1997年:JDK1.1发布 (主流技术 JAR文档格式 JDBC开放数据库系统互联 JavaBeans)

1998年:JDK1.2开始,SUN把JAVA技术拆分为三个方向,分别为J2SE--->JAVA 2 SE= =jdk(标准版,桌面级应用) J2EE--->JAVA 2 EE(企业级应用) J2ME(移动设备)

代表性技术:EJB(分布式) Plug-in(可插拔) Swing(窗口化图形界面) JIT(运行时动态编译)

2000年:JDK 1.3

使用HotSpot虚拟机(闭源)

2002年:JDK 1.4发布(发展成熟)

2006年:SUN宣布JAVA技术,遵循GPL协定,开发绝大部分代码,建立OpenJDK组织管理这些代码。

2009年:ORACLE收购SUN公司,JAVA版权被ORACLE所有。

4.JAVA的体系结构(四大核心技术)

Java编程语言 (属于纯面向对象的编程语言) .class

Java Class文件格式 编译之后运行在各个平台的基础环境

Java API (JAVA类库非常庞大)

Java VM

5.JDK包含的技术

JRE:单纯的运行环境

JavaEE 比 javaSE 有更多的类

JAVA EE的子技术

Servlet(实现服务端动态) JSP EJB(分布式) JMS(邮件) JMX JavaMail (邮件插件)......

JAVA 动态网页技术(javaEE)

①:servlet

Servlet:应用在服务端的,可以基于CGI协议与前端进行交互,需要基于Servlet容器(Servlet Contaier);基于编写java源码,然后在java源码程序中嵌入前端的html代码;缺陷非常大。

②:JSP

JSP:使JAVA代码内嵌在html文档中,相当于Servlet的前端

Web container:JDK Servlet JSP

商业实现方案:websphere webLogic OC4j Glassfish

开源实现方案:tomcat jetty resin Jboss

三、tomcat 理论详解

1.jsp网页文件请求流程

JSP网页请求流程:

首先 客户端之前请求.java结尾的文件,而现在请求的是.jsp结尾的动态页面;然后发起一个get请求,由于jsp在前面,变成Servlet前端,可以叫它jsp容器,它负责接收处理jsp文件的请求,但是它本身不负责转换编译请求的工作;于是jsp将客户端请求的jsp的请求和标准要求,转交给后台的Servlet;而Servlet会将其转换一种通用格式(.jsp--->.java的源码,因为底层只能识别.java的字节码),转完之后,需要进行编译,Servlet将其转交给后台的JVM,将其编译成helloServlet对应的字节码,编译完成后,将编译的结果对应的二进制数据流执行之后,再交给JSP容器;然后JSP容器将从后台java编译得到的数据封装成为html响应报文,返回给客户端;此时客户端就看到一个他以为请求的静态资源,但是在后台是动态资源。

JSP--> Java--->.class--->将变成.class的结果数据流在交给JSP容器--->JSP容器封装成HTML响应报文给客户端

Java特点:第一次访问很慢,预热之后,每次访问速度就变快了 ;而php做不到,因为其是解释型文件

但如今企业环境中JSP使用率大幅降低

当今主流的开发风格实现前后端分离(REST/RESTful风格,实现彻底分离)

缺点:JSP耦合性比较强,不能彻底实现动静分离,

所有的servlet容器必须要构建在JDK基础上

开源JDK:Openjdk Sunjdk Apache Harmony

2.tomcat的发展

早期SUN公司创建第一个servlet容器(即Java Web Server),但只是为了演示servlet相应功能,很不稳定。同一时期,ASF(apache软件基金会)创建了JServ项目,一个可以与apache整合起来的servlet容器,1999年,SUN把JWS捐给ASF,项目合二为一,成为几天tomcat的前身,第一版本为tomcat3.x系列。

2001年tomcat4.0发布,在此前基础上进行重新设计和实现,代码项目被命名为Catalina。

本质:java web的应用,必须工作在JDK平台,Tomcat:JSP+Servlet+http连接器通用的web应用服务器

3.tomcat的核心组件

Catalina:servlet container

Coyote:http connection

Jasper:JSP Engine

4.jsp解析流程

jsp ---> jasper --->servlet --->complie --->bytecodes --->jvm

5.tomcat的组件

Tomcat instance:运行中的tomcat进程(java进程)

Server:一个tomcat实例(一般一个server服务一个service)

Service:用于将connector关联至engine组件,一个service只能包含一个engine组件和一个或多个connector组件

Engine:tomcat的核心组件,用于运行jsp或servlet代码

Connector:接受并解析用户请求,将请求映射为engine中运行的代码,把运行结果构建成响应报文。

Host:相当于httpd的虚拟主机

Context:类似httpd中的alias,上下文 (定义路径别名)

组件的分类:顶级类组件:server

服务类组件:service

容器类组件:可以部署webwebapp的组件,engine host context

连接器组件:connector(通常在tomcat定义的连接器类型有http连接器,SSL连接器、AJP1.3连接器、proxy连接器)

被嵌套类组件:valve logger realm

XML标签:

<server>

<service>

<connector />

<connector />

......

<engine>

<host>

<context />

......

</host>

...

</engine>

</service>

</server>

6.Tomcat运行模式

Standalone(裸奔模式):通过内置的web server(http connector)来接受客户端请求

proxy:由专门的web server服务客户端的httpd请求

in-process:部署于同一主机

network:部署于不同主机

【注】:安装tomcat,安装前提:①部署JDK (ORACE JDK 或openjdk)

7.Tomcat的目录结构

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

lib:类库

conf:配置文件

logs:日志文件

webapps:应用程序默认部署目录

work:工作目录

temp:临时目录

8.tomcat配置文件

server.xml:主配置文件

context.xml:每个webapp专用的配置文件,通常位于webapp应用程序目录下的WEB-INF目录中,用于定义会话管理器、JDBC等。

conf/context.xml为各个webapp提供默认配置

web.xml:每个webapp部署完才能被访问,用于提供为所有webapp提供默认部署相关配置

tomcat-users.xml:用户认证账号和密码配置文件

catalina.policy:使用-security选项启动tomcat实例时,会读取此配置文件实现安全运行策略。

logging.properties:日志相关信息配置文件

9.Java WebAPP 组织结构

属于特定的组织形式,层次型的目录结构。主要包含了servlet代码文件、JSP页面文件、类文件、部署描述符文件等

/usr/local/tomcat/webapps/app1 :

/:webapp的根目录

WEB-INF(应用):当前webapp私有资源目录,通常存放当前webapp自用的web.xml

META-INF(配置):也是当前webapp的私有资源目录,通常存放webapp自用的context.xml

classes:此webapp的私有类

lib:此webapp的私有类,被打包为jar格式类

index.jsp:webapp的主页

10.Webapp归档格式

.war webapp

.jar EJB的类

.rar 资源适配器

.ear 企业级应用程序

四、Tomcat的操作

1.部署测试应用程序

①:创建webapp特有的目录结构

②:提供webapp的各文件(*)

③:提供测试主页 vim index.jsp

通常情况下,程序会被catalina引擎自动部署,(如重新部署,新版应用程序会进行自动更新部署生效)

如需手动部署,简单的方式重启即可

④:进入work目录,使用tree命令即可显示其java程序部署的过程

⑤:也可查看work/Catalina/localhost/myapp/org/apache/jsp/ 下的java代码源代码和字节码

注意:默认的网页根路径映射在ROOT目录,和额外部署应用程序根目录分离。

2.部署应用程序(deployment)相关的操作

①:将webapp源文件放置于目标目录,配置tomcat服务器能够基于context.xml文件中定义的路径来访问webapp

②:将其特有类通过class loader装载至tomcat

③部署分为自动部署和手动部署,上述方式属于自动部署(auto deploy)。

手动部署:①:冷部署--->把webapp复制到指定路径,启动tomcat

stop 停止服务,不再提供服务

start 停止状态的webapp进行启动

redeploy 重新部署

②:热部署--->基于部署工具(manager、ant脚本、tcd等部署工具)

反部署(undeploy):停止webapp,并从tomcat实例并从tomcat实例拆除其部分文件和部署名。

tomcat图形化部署工具--->manager app(属于应用程序管理工具)

需要配置部署管理员的账号、密码 vim conf/tomcat-user.xml

【注】:默认除了本机不被支持,如需支持需要修改webapps/manager/META-INF/context.xml 文件进行更改(或注释也可)

Tomcat虚拟主机图形管理工具 Host Manager

同样如需要远程登录,需要更改对应的管理配置文件

Port:8005 本机连接自己实现实例管理,最好进行更改,不然有安全风险

面对此问题要进行安全加固,有两种解决方案:

①把port改成随机数

②把这个端口,进行关闭port:-1

3.Tomcat主配置文件server.xml结构和详解

定义Engine 组件

<Engine name="Catalina" defaultHost="localhost">

默认定义在server.xml中的catalina

定义Host 组件

appBase:Host的webapps目录,可以使用基于定义好catalina环境变量后的相对路径。

autoDeploy:在Tomcat处于运行时放置于appBase目录中的应用程序文件是否能够自动部署,默认为true

unpackWars:在启用此webapps时,是否对WAR格式的归档文件先进行展开;默认为true

Host 组件中定义虚拟主机

<Host name="web.xxhf123.com" appBase="/data/webapps" unpackWARs="true" autoDeploy="false">

<Value className="org.apache.catalina.valves.AccessLogValve" directory="/data/logs"

prefix="web_access_log" suffix=".txt"

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

</Host>

【注】:定义虚拟主机,可以将默认定义在相对的ROOT中,其他单独存放

大写的ROOT,代表应用默认的程序,不需要接uri

开服状态下,不要检查配置文件,否则语法错误

相关推荐
一个不秃头的 程序员9 分钟前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
丁总学Java20 分钟前
--spring.profiles.active=prod
java·spring
上等猿28 分钟前
集合stream
java
java1234_小锋31 分钟前
MyBatis如何处理延迟加载?
java·开发语言
菠萝咕噜肉i33 分钟前
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
java·mybatis·框架·半自动
林的快手1 小时前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
FeboReigns1 小时前
C++简明教程(10)(初识类)
c语言·开发语言·c++
学前端的小朱1 小时前
处理字体图标、js、html及其他资源
开发语言·javascript·webpack·html·打包工具
向阳12181 小时前
mybatis 缓存
java·缓存·mybatis
上等猿1 小时前
函数式编程&Lambda表达式
java