目录
(2)CSS(Cascading Style Sheets)层叠样式表
一、web技术
1、HTTP协议和B/S 结构
客户端和服务端往往处在不同的物理主机上,它们分属不同的进程,这些进程间需要通信。跨主机的进程间通信需要使用网络编程。最常见的网络编程接口是Socket。
Socket称为套接字。网络通讯需要两端,如果一端被动的接收另一端请求并提供 计算和数据的称为服务器端,另一端往往只是发起计算或数据请求,称为客户端。 这种编程模式称为Client/Server编程模式,简称C/S编程。开发的程序也称为C/S程序。C/S编程往往使用 传输层协(TCP/UDP),较为底层,比如:QQ,迅雷, 云音乐, 云盘, foxmail,xshell等 1990年HTTP协议和浏览器诞生。在应用层使用文本跨网络在不同进程间传输数据,最后在浏览器中将服务器端返回的HTML渲染出来。
有一部分程序员还是要编写HTML、CSS、 JavaScript,这些代码运行在浏览器端,称为WEB前端编程。合起来称为Browser/Server编程,即B/S编程。
2、前端三大核心技术
(1)HTML
HTML(HyperText Markup Language)超文本标记语言,它不同于一般的编程语言。超文本即超出纯文本的范畴,例如:描述文本颜色、大小、字体等信息,或使用图片、视频等非文本内容。
HTML由一个个的标签(标记)组成,这些标签各司其职,有的提供网页信息,有的负责文字,有的负责 图片,有的负责网页布局,所以一个HTML文件,是由格式标签和数据组成。
超文本需要显示,就得有软件能够呈现超文本定义的排版格式,例如显示:图片、表格,显示字体的大 小、颜色,这个软件就是浏览器。 超文本的诞生是为了解决纯文本不能格式显示的问题,是为了好看,但是只有通过网络才能分享超文本 的内容,所以制定了HTTP协议。
(2)CSS(Cascading Style Sheets)层叠样式表
HTML本身为了格式化显示文本,但是当网页呈现大家面前的时候,需求HTML提供更多样式能力。这使得HTML变得越来越臃肿。这促使了CSS的诞生。
(3)JavaScript
Javascript 简称JS,是一种动态弱类型脚本解释性语言,和HTML、CSS并称三大WEB核心技术。
1)同步
交互式网页,用户提交了请求,就是想看到查询的结果。服务器响应到来后是一个全新的页面内容,哪怕URL不变,整个网页都需要重新渲染。这种交互非常不友好。从代价的角度看,就是为了注册的一点点信息,结果返回了整个网页内容,不但浪费了网络带宽,还需要浏览器重新渲染网页,太浪费资源了,影响了用户体验和感受。上面这些请求的过程,就是同步过程,用户发起请求,页面整个刷新,直到服务器端响应的数据到来并重新渲染。
2)异步
传统的网页如果需要更新内容,必需重载整个网页面。Ajax的出现,改变这一切,同时极大的促进了 Javascript的发展。Ajax即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术。Ajax 通过在后台与服务器进行少量数据交换, 可以使网页实现异步更新。这意味着可以在不重新加 载整个网页的情况下,对网页的某部分进行更新。Javascript 通过调用浏览器内置的WEB API中的 XMLHttpRequest 对象实现Ajax 技术。早期Ajax结合数据格式XML,目前更多的使用JSON。利用AJAX可实现前后端开发的彻底分离,改变了传统的开发模式。 AJAX是一种技术的组合,技术的重新发现,而不是发明,但是它深远的影响了整个WEB开发。
二、web架构
1、web资源和访问
(1)PC 端或移动端浏览器访问
从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务器请求图片资源显示从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端
(2)手机 App 访问
内置了HTML和JS文件,不需要从静态WEB服务器下载 JS 或 HTML。为的就是减少文件的发送,有必要就从图片服务器请求图片,从业务服务器请求动态数据 客户需求多样,更多的内容还是需要由业务服务器提供,业务服务器往往都是由一组服务器组成。
2、后台应用架构
(1)单体架构
- 传统架构(单机系统),一个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统 一部署,一个进程
- all in one的架构方式,把所有的功能单元放在一个应用里。然后把整个应用部署到一台服务器上。 如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。
- Java实现:JSP、Servlet,打包成一个jar、war部署
- 如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停 掉整个服务,重新整体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不适 合当今互联网业务功能的快速迭代。
web应用服务器:开源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss
(2)微服务
- 属于SOA(Service Oriented Architecture)的子集
- 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一 个微服务提供单个业务功能,一个服务只做一件事。每个服务都围绕着具体业务进行构建,并且能 够被独立地部署到生产环境、类生产环境等
- 从技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁
- 微服务架构(分布式系统),各个模块/服务,各自独立出来,"让专业的人干专业的事",独立部 署。分布式系统中,不同的服务可以使用各自独立的数据库。
- 服务之间采用轻量级的通信机制(通常是基于HTTP的RESTful API)。
- 微服务设计的思想改变了原有的企业研发团队组织架构。传统的研发组织架构是水平架构,前端、 后端、DBA、测试分别有自己对应的团队,属于水平团队组织架构。而微服务的设计思想对团队的 划分有着一定的影响,使得团队组织架构的划分更倾向于垂直架构,比如用户业务是一个团队来负 责,支付业务是一个团队来负责。但实际上在企业中并不会把团队组织架构拆分得这么绝对,垂直 架构只是一种理想的架构
- 微服务的实现框架有多种,不同的应用架构,部署方式也有不同
三、tomcat功能介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和 JSP容器
1、安装Tomcat
1.安装java环境
[root@tomcat-node1 ~]# dnf install java-1.8.0-openjdk.x86_64 -y
[root@tomcat-node2 ~]# dnf install java-1.8.0-openjdk.x86_64 -y
2.安装并启动tomcat
PS C:\Users\qq358\Desktop> scp .\apache-tomcat-9.0.93.tar.gz root@172.25.254.10:/root/
PS C:\Users\qq358\Desktop> scp .\apache-tomcat-9.0.93.tar.gz root@172.25.254.20:/root/
[root@tomcat-node1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@tomcat-node1 ~]# cd /usr/local/
[root@tomcat-node1 local]# ln -s apache-tomcat-9.0.93 tomcat
[root@tomcat-node1 bin]# /usr/local/tomcat/bin/startup.sh
3.查看端口
[root@tomcat-node1 ~]# netstat -antlupe | grep java
2、tomcat的文件结构和组成
目录结构
目录 说明
-------------------------------------------------------
bin 服务启动、停止等相关程序和文件
conf 配置文件
lib 库目录
logs 日志目录
webapps 应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp编译后的结果文件,建议提前预热访问
查看tomcat相关目录和文件
[root@tomcat-node1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@tomcat-node1 tomcat]# ln -s apache-tomcat-9.0.93 tomcat
[root@tomcat-node1 bin]# cd /usr/local/tomcat/
[root@tomcat-node1 tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
3、生成tomcat的启动文件
(1)生成tomcat的主配置文件
[root@tomcat-node1 tomcat]# cd /usr/local/tomcat/conf/
[root@tomcat-node1 conf]# ls
Catalina context.xml logging.properties tomcat-users.xsd
catalina.policy jaspic-providers.xml server.xml web.xml
catalina.properties jaspic-providers.xsd tomcat-users.xml
[root@tomcat-node1 conf]# vim tomcat.conf
[root@tomcat-node1 conf]# cat tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk/
(2)生成启动文件
[root@tomcat-node1 conf]# vim /lib/systemd/system/tomcat.service
[root@tomcat-node1 conf]# cat /lib/systemd/system/tomcat.service
[Unit]
Description=Tomcat
#After=syslog.target network.target remote-fs.target nss-lookup.target
After=syslog.target network.target
[Service]
Type=forking
EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target
[root@tomcat-node1 conf]# vim /usr/bin/tomcat
[root@tomcat-node1 conf]# cat /usr/bin/tomcat
#!/bin/bash
case $1 in
start)
/usr/local/tomcat/bin/startup.sh
;;
stop)
/usr/local/tomcat/bin/shutdown.sh
esac
[root@tomcat-node1 ~]# ls /usr/local/tomcat/ -ld
[root@tomcat-node1 conf]# chmod +x /usr/local/tomcat/
[root@tomcat-node1 conf]# tomcat start
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
Tomcat started.
[root@tomcat-node1 conf]# tomcat stop
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
[root@tomcat-node1 conf]# vim /lib/systemd/system/tomcat.service #ExecStart=/usr/local/tomcat start ExecStop=/usr/local/tomcat stop
[root@tomcat-node1 ~]# useradd -s /sbin/nologin -M tomcat
[root@ka1 ~]# chown -R tomcat /usr/local/tomcat/
[root@tomcat-node1 ~]# chown -R tomcat.tomcat /usr/local/tomcat
[root@tomcat-node1 ~]# systemctl daemon-reload
[root@tomcat-node1 ~]# systemctl enable --now tomcat
[root@tomcat-node1 ~]# ps aux | grep tomcat
[root@tomcat-node1 ~]# rsync -ar /usr/local/apache-tomcat-9.0.93 root@172.25.254.20:/usr/local/apache-tomcat-9.0.93
[root@tomcat-node1 ~]# rsync -ar /usr/local/tomcat root@172.25.254.20:/usr/local/tomcat
[root@tomcat-node1 ~]# rsync -ar /lib/systemd/system/tomcat.service root@172.25.254.20:/lib/systemd/system/tomcat.service
[root@tomcat-node2 ~]# chown -R tomcat.tomcat /usr/local/tomcat
[root@tomcat-node2 ~]# ls -ld /usr/local/tomcat/
[root@tomcat-node2 ~]# systemctl daemon-reload
[root@tomcat-node2 ~]# systemctl start tomcat.service
四、结合反向代理实现tomcat部署
1、常见部署方式介绍
standalone模式,Tomcat单独运行,直接接受用户的请求,不推荐。
反向代理,单机运行,提供了一个Nginx作为反向代理,可以做到静态由nginx提供响应,动态jsp代理给Tomcat
- LNMT:Linux + Nginx + MySQL + Tomcat
- LAMT:Linux + Apache(Httpd)+ MySQL + Tomcat
前置一台Nginx,给多台Tomcat实例做反向代理和负载均衡调度,Tomcat上部署的纯动态页面更 适合 LNMT:Linux + Nginx + MySQL + Tomcat
多级代理 LNNMT:Linux + Nginx + Nginx + MySQL + Tomcat
2、利用 nginx 反向代理实现
利用nginx反向代理功能,实现图中的代理功能,将用户请求全部转发至指定的同一个tomcat主机
利用nginx指令proxy_pass 可以向后端服务器转发请求报文,并且在转发时会保留客户端的请求报文中的 host首部
[root@ka1 ~]# ls
anaconda-ks.cfg Desktop Downloads Pictures Templates Videos
apache-tomcat-9.0.93.tar.gz Documents Music Public test.jsp zuoyedir
[root@ka1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@ka2 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
upstream tomcat {
ip_bash;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen *:80;
server_name www.zx.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
#proxy_pass http://172.25.254.10:8080;
#proxy_pass http://172.25.254.20:8080;
proxy_pass http://tomcat
}
}
[root@nginx conf.d]#
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
server {
listen *:80;
server_name www.zx.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://172.25.254.10:8080;
proxy_pass http://172.25.254.20:8080;
}
}
[root@nginx conf.d]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@nginx conf.d]# nginx -s reload
3、实现tomcat中的负载均衡
动态服务器的问题,往往就是并发能力太弱,往往需要多台动态服务器一起提供服务。如何把并发的压 力分摊,这就需要调度,采用一定的调度策略,将请求分发给不同的服务器,这就是Load Balance负载均衡。
当单机Tomcat,演化出多机多级部署的时候,一个问题便凸显出来,这就是Session。
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
upstream tomcat {
ip_bash;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen *:80;
server_name www.zx.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
#proxy_pass http://172.25.254.10:8080;
#proxy_pass http://172.25.254.20:8080;
proxy_pass http://tomcat
}
}
五、 Memcached
Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统memcached 虽然没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式, 让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并提供服务。
Memcached 支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,memcached 最适合保存用户的 session实现session共享 Memcached存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page。
1、memcached 操作命令
五种基本 memcached 命令执行最简单的操作。这些命令和操作包括: set add replace get delete
#前三个命令是用于操作存储在 memcached 中的键值对的标准修改命令,都使用如下所示的语法:
command <key> <flags> <expiration time> <bytes>
<value>
#参数说明如下:
command set/add/replace
key key 用于查找缓存值
flags 可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes 在缓存中存储的字节数
value 存储的值(始终位于第二行)
#增加key,过期时间为秒,bytes为存储数据的字节数
add key flags exptime bytes
2、memcached的安装与启动
[root@ka1 ~]# yum install memcached -y
[root@ka1 ~]# vim /etc/sysconfig/memcached
[root@ka1 ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1" # 修改此处
[root@ka1 ~]# systemctl start memcached.service
[root@ka1 ~]# dnf install telnet -y
[root@ka1 ~]# telnet 172.25.254.20 11211
Trying 172.25.254.20...
Connected to 172.25.254.20.
Escape character is '^]'.
add key1 0 20 2
ll
STORED
get key1
VALUE key1 0 2
ll
END
quit
Connection closed by foreign host.
六、 session 共享服务器
1、msm介绍
msm(memcached session manager)
提供将Tomcat的session保持到memcached可以实现高可用。
2、msm安装配置
- t1和m1部署可以在一台主机上,t2和m2部署也可以在同一台。
- 当新用户发请求到Tomcat1时, Tomcat1生成session返回给用户的同时,也会同时发给memcached2备份。即Tomcat1 session为主session,memcached2 session为备用session,使用memcached相当于备份了一份Session
- 如果Tomcat1发现memcached2 失败,无法备份Session到memcached2,则将Sessoin备份存放在 memcached1中
[root@ka1 ~]# cd jar/ # 下载相关jar包
[root@ka1 jar]# ls
asm-5.2.jar memcached-session-manager-tc9-2.3.2.jar reflectasm-1.11.9.jar
kryo-3.0.3.jar minlog-1.3.1.jar spymemcached-2.12.3.jar
kryo-serializers-0.45.jar msm-kryo-serializer-2.3.2.jar
memcached-session-manager-2.3.2.jar objenesis-2.6.jar
[root@ka1 jar]#
[root@ka1 jar]# cp *.jar /usr/local/tomcat/lib/
[root@ka1 jar]# cd /usr/local/tomcat/lib/
[root@ka1 ~]# vim /usr/local/tomcat/conf/context.xml
######添加######
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="m1:172.25.254.10:11211,m2:172.25.254.20:11211"
failoverNodes="m1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
################
[root@ka1 ~]# systemctl restart tomcat
# 修改nginx配置
[root@nginx conf.d]# vim vhost.conf
[root@nginx conf.d]# cat vhost.conf
upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen *:80;
server_name www.zx.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}