一、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 " %r" %s %b" />
</Host>
【注】:定义虚拟主机,可以将默认定义在相对的ROOT中,其他单独存放
大写的ROOT,代表应用默认的程序,不需要接uri
开服状态下,不要检查配置文件,否则语法错误