一、WEB技术
1.1HTTP协议和B/S 结构
我们的操作系统之所以可以让程序并行的执行,源于操作系统有进程子系统,每个进程可以有多个线程,每个线程可以被CPU调度执行
客户端和服务端分属于不同的进程,跨主机的进程之间需要通信就得需要使用网络编程,最常见的网络编程接口是Socket。
Socket称为套接字,网络通信需要服务和客户两端,被动接受另一端请求并提供数据和计算的称为服务端,另一端成为客户端,这种Client/Server编程模式简称为C/S编程,往往使用传输层协议(tcp/udp)
网页是存储在WEB服务器端的文本文件,浏览器发起HTTP请求后,到达WEB服务器程序后,服务程序根据URL读取对应的HTML文件,并封装成HTPP响应报文给浏览器端。
起初网页主要指的是HTML、CSS等文件制作属于静态网页,后来因需求出现了CGI通用网关接口将用户请求使用程序动态生成的技术,称为动态网页技术。先后出现了ASP、PHP、JSP等技术。
1.2 前端三大核心技术
1.2.1 HTML
超文本标记语言,不同于一般的编程语言,由一个个的标签组成,各个标签各司其职,提供网页信息、负责文字、负责图片、负责网页布局使用各不同的标签。
超文本需要显示就得有软件能够呈现超文本定义的排版格式,例如显示:图片、表格,显示字体的大小、颜色,这个软件就是浏览器。
1.2.2 CSS(Cascading Style Sheets)层叠样式表
采用了模块化思想,每个模块都在CSS 2基础上分别增强功能。不同厂家的浏览器使用的引擎,对CSS的支持不一样,导致网页布局、样式在不同浏览器不一样。因此, 想要保证不同用户使用不同浏览器看到的网页效果一直非常困难。
1.2.3 JavaScript
简称JS,是一种动态的弱类型脚本解释性语言,和HTML、CSS并称三大WEB核心技术,2008年后随着chrome浏览器的V8引擎发布。 V8 JS引擎不是解释执行,而是本地编译,在V8引擎做了很多优化,JS程序在其上运行堪比本地二进制程 序。V8引擎使用C++开发,可以嵌入到任何C++程序中。基于V8引擎,2009年基于服务器javascript的运 行环境Node.js诞生,创建了第一版npm (Node.js包管理器和开源库生态系统), 提供了大量的库供程序员 使用。从此,便可以在服务器端真正大规模使用JavaScript编程了。也就是说 JavaScript 也可以真正称为 服务器端编程语言了,成为目前唯一的前,后端通用的语言。
同步
交互式网页,用户提交了请求,整个网页都需要重新渲染
异步
可以在不重新加载整个网页的情况下,对网页的某部分进行更新。Javascript 通过调用浏览器内置的WEB API中的 XMLHttpRequest 对象实现Ajax 技术。早期Ajax结合数据格式XML,目前更多的使用JSON。利用AJAX可 实现前后端开发的彻底分离,改变了传统的开发模式。
二 、WEB框架
2.1 web资源和访问
PC端或移动端浏览器访问
从静态服务器请求HTML、CSS、JS等文件发送到浏览器端,浏览器端接收后渲染在浏览器上从图片服务 器请求图片资源显示
从业务服务器访问动态内容,动态内容是请求后有后台服务访问数据库后得到的,最终返回到浏览器端
手机 App 访问
内置了HTML和JS文件,不需要从静态WEB服务器下载JS或者HTML,为的就是减少文件的发送。
2.2 后台应用架构
2.2.1 单体架构
传统架构(单机系统),一个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统 一部署,一个进程
all in one的架构方式,把所有的功能单元放在一个应用里。然后把整个应用部署到一台服务器上。 如果负载能力不行,将整个应用进行水平复制,进行扩展,然后通过负载均衡实现访问。
易于开发和测试:也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上, 再做个负载均衡就可以了
如果某个功能模块出问题,有可能全站不可访问,修改Bug后、某模块功能修改或升级后,需要停 掉整个服务,重新整体重新打包、部署这个应用war包,功能模块相互之间耦合度高,相互影响,不适 合当今互联网业务功能的快速迭代
特别是对于一个大型应用,我们不可能吧所有内容都放在一个应用里面,我们如何维护、如何分工 合作都是问题。如果项目庞大,管理难度大
web应用服务器:开源的tomcat、jetty、glassfish。商用的有weblogic、websphere、Jboss
2.2.2 微服务
属于SOA(Service Oriented Architecture)的子集
核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底去掉耦合,每一 个微服务提供单个业务功能
技术角度讲就是一种小而独立的处理过程,类似与进程的概念,能够自行单独启动或销毁
各个模块/服务,各自独立出来,"让专业的人干专业的事",独立部 署。分布式系统中,不同的服务可以使用各自独立的数据库。
服务之间采用轻量级的通信机制(通常是基于HTTP的RESTful API)
微服务设计的思想改变了原有的企业研发团队组织架构,使得团队组织架构的划分更倾向于垂直架构。
微服务的实现框架有多种,不同的应用架构,部署方式也有不同
2.2.3 单体架构和微服务比较
微服务的优点
每个服务足够内聚,足够小,代码容易理解
开发简单、开发效率提高
微服务是松耦合的
微服务能使用不同的语言开发
易于和第三方集成
微服务允许你利用融合最新技术
每个微服务都有自己的存储能力
微服务缺点
增加了开发、测试、运维、监控等的复杂度
引入了分布式事务和异步补偿机制,为设计和开 发带来一定挑战
开发人员和运维需要更强的技术能力处理分布式系统的复杂性
不适用于小型应用会增加其成本
常见的微服务框架
Dubbo:一款高性能的Java RPC服务框架,微服务生态体系中的一个重要组件,将单体程序分解成多个功能服务模块,模块间使用Dubbo框架提供的高性能RPC通信,内部协调使用Zookeeper,实现服务注册、服务发现和服务治理
Spring cloud:一个完整的微服务解决方案,相当于Dubbo的超集,微服务框架,将单体应用拆分为粒度更小的单一功能服务,基于HTTP协议的REST(Representational State Transfer 表述性状态转移)风格实现模块间通信
三 、tomcat的功能介绍
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和 并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和 JSP容器
3.1 安装 Tomcat
node1上
首先是安装java环境
[root@node1 ~]# dnf install java-1.8.0-openjdk.x86_64 -y
[root@node1 ~]# tar zxf apache-tomcat-9.0.93.tar.gz -C /usr/local/
[root@node1 ~]# cd /usr/local/
创建一个软连接方便执行后续操作
[root@node1 local]# ln -s apache-tomcat-9.0.93 tomcat
[root@node1 local]# cd tomcat/
[root@node1 tomcat]# ls
bin conf lib logs README.md RUNNING.txt webapps
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE RELEASE-NOTES temp work
[root@node1 tomcat]# cd bin/
[root@node1 bin]# ls
bootstrap.jar configtest.sh shutdown.sh
catalina.bat daemon.sh startup.bat
catalina.sh digest.bat startup.sh
catalina-tasks.xml digest.sh tomcat-juli.jar
ciphers.bat makebase.bat tomcat-native.tar.gz
ciphers.sh makebase.sh tool-wrapper.bat
commons-daemon.jar setclasspath.bat tool-wrapper.sh
commons-daemon-native.tar.gz setclasspath.sh version.bat
configtest.bat shutdown.bat version.sh
执行java的启动脚本
[root@node1 bin]# ./startup.sh
再查看一下端口号
[root@node1 bin]# netstat -antlupe | grep java
tcp6 0 0 :::8080 :::* LISTEN 0 119613 20217/java
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 0 119631 20217/java
浏览器访问172.25.254.10:80
3.2 tomcat的文件结构和组成
bin 服务启动、停止等相关程序和文件
conf 配置文件
lib 库目录
logs 日志目录
webapps 应用程序,应用部署目录,相当于nginx的默认发布目录
work jsp 编译后的结果文件,建议提前预热访问
3.3 生成tomcat的启动文件
生成配置文件
[root@node1 conf]# vim /usr/local/tomcat/conf/tomcat.conf
JAVA_HOME=/etc/alternatives/jre_openjdk
生启动文件
[root@node1 conf]# vim /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@node1 conf]# useradd -s /sbin/nologin -M tomcat
[root@node1 conf]# cd
[root@node1 ~]# ls /usr/local/tomcat/ -ld
drwxr-xr-x 9 root root 220 Aug 21 11:47 /usr/local/tomcat/
[root@node1 ~]# chown -R tomcat.tomcat /usr/local/tomcat/
启动服务
[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable --now tomcat
Created symlink /etc/systemd/system/multi-user.target.wants/tomcat.service → /usr/lib/systemd/system/tomcat.service.
查看一下进程
[root@node1 ~]# ps aux | grep tomcat
root 30380 1.2 5.9 2560400 106864 pts/0 Sl 12:23 0:02 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root 31493 0.0 0.1 221664 2244 pts/0 S+ 12:26 0:00 grep --color=auto tomcat
再通过浏览器访问一下
将tomcat和启动文件同步到node2上
[root@node1 ~]# rsync -ar /usr/local/apache-tomcat-9.0.93 root@172.25.254.20://usr/local
[root@node1 ~]# rsync -ar /lib/systemd/system/tomcat.service root@172.25.254.20:/lib/systemd/system/tomcat.service
node2上
创建tomcat用户并设置权限
[root@node2 ~]# useradd -s /sbin/nologin -M tomcat
[root@node2 ~]# chown -R tomcat.tomcat /usr/local/tomcat/
[root@node2 ~]# cd /usr/local/
创建软连接
[root@node2 local]# ln -s apache-tomcat-9.0.93 tomcat
[root@node2 ~]# systemctl daemon-reload
[root@node2 ~]# systemctl enable --now tomcat
[root@node2 ~]# netstat -aultupe | grep java
[root@node2 ~]# netstat -aultupe | grep tomcat
[root@node2 ~]# ps aux | grep tomcat
再通过浏览器访问一下20主机
四、实现tomcat中的负载均衡
[root@node1 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@node2 ~]# cp test.jsp /usr/local/tomcat/webapps/ROOT/
[root@nginx ~]# cd /usr/local/nginx/conf.d/
[root@nginx conf.d]# vim tomcat.conf
upstream tomcat {
hash $cookie_JSESSIONID;
server 172.25.254.10:8080;
server 172.25.254.20:8080;
}
server {
listen *:80;
server_name www.jcl.org;
root /data/web/html;
index index.html;
location ~ \.jsp$ {
proxy_pass http://tomcat;
}
}
[root@nginx conf.d]# nginx -s reload
在不同浏览器上访问测试www.jcl.org/test.jsp
五 、Memcached
5.1 Memcached简介
可以通过做集群同步的方式, 让各memcached服务器的数据进行同步,从而实现数据的一致性,即保证各memcached的数据是一样 的,即使有任何一台 memcached 发生故障,只要集群中有一台 memcached 可用就不会出现数据丢 失,当其他memcached 重新加入到集群的时候,可以自动从有数据的memcached 当中自动获取数据并 提供服务。
5.2 memcached的安装与启动
[root@node1 ~]# dnf install memcached -y
[root@node1 ~]# vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 0.0.0.0,::1"
[root@node1 ~]# scp /etc/sysconfig/memcached root@172.25.254.20:/etc/sysconfig/memcached
[root@node1 ~]# systemctl start memcached.service
六、session 共享服务器
6.1 msm 介绍
msm(memcached session manager)提供将Tomcat的session保持到memcached可以实现高可用。
Tomcat的Session管理类,Tomcat版本不同
memcached-session-manager-2.3.2.jar
memcached-session-manager-tc9-2.3.2.jar
Session数据的序列化、反序列化类
官方推荐kyro
在webapp中WEB-INF/lib/下
驱动类
memcached(spymemcached.jar)
Redis(jedis.jar)
6.2配置过程
[root@node1 jar]# ls
asm-5.2.jar minlog-1.3.1.jar
kryo-3.0.3.jar msm-kryo-serializer-2.3.2.jar
kryo-serializers-0.45.jar objenesis-2.6.jar
memcached-session-manager-2.3.2.jar reflectasm-1.11.9.jar
memcached-session-manager-tc9-2.3.2.jar spymemcached-2.12.3.jar[root@node1 jar]# cp * /usr/local/tomcat/lib/
[root@node1 jar]# scp * root@172.25.254.20:/usr/local/tomcat/lib/
[root@node1 jar]# vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n1"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
[root@node1 jar]# scp /usr/local/tomcat/conf/context.xml root@172.25.254.20:/usr/local/tomcat/conf/context.xml
[root@node2 ~]# vim /usr/local/tomcat/conf/context.xml
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.254.10:11211,n2:172.25.254.20:11211"
failoverNodes="n2"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
[root@node1 jar]# systemctl restart tomcat
[root@node2 ~]# systemctl restart tomcat
添加两条内容
停掉20主机的tomcat
[root@node2 ~]# systemctl stop tomcat
添加第三条内容的时候可以看到之前的两条信息还在,因为20主机挂掉了,所以通过memcache自动跳转到10主机上