Nginx+Tomcat负载均衡、动静分离

目录

Nginx+Tomcat负载均衡、动静分离群集

Nginx配置反向代理的主要参数

动静分离原理

反向代理两种模式

七层反向代理

四层反向代理

Nginx 负载均衡模式(调度算法)

nginx的会话保持

为什么使用动静分离

为什么使用负载均衡

正向代理和反向代理的区别

七层反向代理

部署虚拟机192.168.142.20(两个tomcat已部署完毕)

部署虚拟机192.168.142.30(第三个tomcat已开启)

部署192.168.142.50   七层反向代理(nginx服务已开启)

部署192.168.142.30的tomcat server

部署192.168.142.20的两个tomcat server

部署192.168.142.50   七层反向代理Nginx server

四层反向代理

七层反向代理和四层反向代理结合

部署虚拟机192.168.142.20(两个tomcat服务已开启)

部署192.168.142.30   (1个tomcat服务已开启)

部署192.168.142.50 七层反向代理Nginx server

部署192.168.142.60 七层反向代理Nginx server

部署192.168.142.70   四层反向代理(nginx)


Nginx+Tomcat负载均衡、动静分离群集

bin:存放启动和关闭Tomcat脚本

conf:存放Tomcat不同的配置文件

webapps:Tomcat的主要Web发布目录

Nginx:优秀的HTTP服务器软件,有强大的静态资源处理能力,运行稳定,内存、CPU等系统资源消耗非常低。理论上支持高达50000个并发连接数的响应。

Nginx配置反向代理的主要参数

upstream 服务池名{ }
配置后端服务器池,以提供响应数据。

proxy_pass http://服务池名
配置将访问请求转发给后端服务器池的服务器处理

动静分离原理

服务端接收来自客户端的请求,既有静态资源也有动态资源,静态资源由Nginx提供服务,动态资源由Nginx转发至后端。

反向代理两种模式

七层反向代理

基于七层的http/https/mail等应用协议的代理
他是在http模块里面添加以upstream模块,在upstream里面定义服务器组名称,添加ip,端口号,权重(如果不添加的话,默认是1),可以在添加一个调度算法。并在http模块里面添加server模块,在里面用location来匹配URL路径,定义proxy_pass http://服务器组名称,用来将以。。。为结尾的请求转发给tomcat服务器集群。并且后端服务器需要获取真实的客户端的ip地址。
http{​     upstream 服务器组名称{​            server IP1:PORT [weight=1 ...];​            server IP2:PORT;​            ..........​          调度算法(rr轮询/加权轮询,least_conn最小连接,ip_hash,url_hash,faire);}​    server {​        location ~ ...{​            #将以***为结尾的请求转发给tomcat服务器集群​             proxy_pass http://服务器组名称;  ​           #用于后端服务器获取真实的客户端ip地址​            proxy_set_header HOST $host;​            proxy_set_header X-Real-IP $remote_addr;​            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;​          }​     }}

四层反向代理

基于四层的ip+tcp/upd端口的代理
他是http块同一级,一般配置在http块上面。
他是需要用到stream模块的,一般四层里面没有自带,需要编译安装一下。并在stream模块里面添加upstream +服务器名称,添加ip地址及端口号。定义server模块,里面添加listen 监听端口号,server_name 网站主机名,proxy_pass 服务器组名称。stream{​     upstream fuwu服务器名称{​          server IP1:PORT;​          server IP2:PORT;​          server IP3:PORT;​          ........​      }​      server{​          listen 监听端口;​          server_name  网站主机名; ​          proxy_pass   服务器组名称;​     }}

Nginx 负载均衡模式(调度算法)

●rr 轮询 负载均衡模式:
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。●加权轮询 WRR :weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。●least_conn 最少连接:
优先将客户端请求调度到当前连接最少的服务器。●ip_hash 负载均衡模式:
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session 共享问题可用后端服务的 session 共享代替 nginx 的 ip_hash(使用后端服务器自身通过相关机制保持session同步)。●fair(第三方)负载均衡模式:
按后端服务器的响应时间来分配请求,响应时间短的优先分配。●url_hash(第三方)负载均衡模式:
基于用户请求的uri做hash。和ip_hash算法类似,是对每个请求按url的hash结果分配,使每个URL定向到同一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好

nginx的会话保持

## 1.ip_hash,url_hash
基于ip缓存或者url路径的缓存来进行的
ip_hash简单易用,但有如下问题:- 当后端服务器宕机后,session会丢失;
- 来自同一局域网的客户端会被转发到同一个后端服务器,可能导致负载失衡;
- 不适用于CDN网络,不适用于前段还有代理的情况。## 2.sticky_cookie_insert
基于客户端的cookie缓存来进行使用sticky_cookie_insert启用会话亲缘关系,这会导致来自同一客户端的请求被传递到一组服务器在同一台服务器。与ip_hash不同之处在于,它不是基于IP来判断客户端的,而是基于cookie来判断。因此可以避免上述ip_hash中来自同一局域网的客户端和前段代理导致负载失衡的情况。说明:- expires:设置浏览器中保持cookie的时间
- domain:定义cookie的域
- path:为cookie定义路径## 3.后端服务器做session共享,来实现会话保持

为什么使用动静分离

        nginx比较擅长处理静态页面,其效率是tomcat的6倍左右,但是nginx不善于处理动态页面。 而tomcat 更擅长处理动态页面。
        静态页面内容相对稳定,容易被检索,同时,由于用户浏览是不需要经过程序的处理,所以浏览速度最快。但是,制作和维护工作量比较大。
        当网站内容更新频繁时访问量非常大,内容变动频繁时,就需要使用动态。但是动态页面需要访问数据库,当访问量非常大,对程序需要处理的数据量就非常大,容易造成网站不稳定甚至瘫痪,因此,我们需要使用动静分离来管理网站。

为什么使用负载均衡

        动态网站的页面上的信息都必须从数据库中读取,每打开一个页面就读取数据库一次,如果访问网站的人数很多,这会对服务器增加很大的荷载,从而影响这个网站的运行速度。所以,我们可以利用负载均衡集群,降低服务器的负载。

正向代理和反向代理的区别

## 正向代理是一个`位于客户端和目标服务器之间的服务器`,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端。`代理服务器和客户端处于同一个局域网内。比如说我要访问谷歌,于是我就告诉它让它帮我转发。## 反向代理实际运行方式是代理服务器接受网络上的连接请求。它将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给网络上请求连接的客户端 。代理服务器和目标服务器处于同一个局域网内。比如说我要访问taobao,对我来说不知道图片、json、css 是不是同一个服务器返回回来的,但是我不关心,是反向代理 处理的,我不知道目标服务器。

七层反向代理

实验准备:准备三台虚拟机

192.168.142.20   tomcat(两个)
192.168.142.30   tomcat
192.168.142.50   七层反向代理(nginx)

部署虚拟机192.168.142.20(两个tomcat已部署完毕)

1.先安装好jdk
2.安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
cp -a /usr/local/tomcat /usr/local/tomcat13.部署环境变量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat
export CATALINA_BASE1=/usr/local/tomcat
export TOMCAT_HOME1=/usr/local/tomcat#tomcat2
export CATALINA_HOME2=/usr/local/tomcat1
export CATALINA_BASE2=/usr/local/tomcat1
export TOMCAT_HOME2=/usr/local/tomcat1source /etc/profile.d/tomcat.sh4.修改 tomcat1 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
vim /usr/local/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">		#22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"		#69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为80105.修改各 tomcat和tomcat1 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1修改tomcat1
vim /usr/local/tomcat1/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2vim /usr/local/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME26.启动各 tomcat 中的 /bin/startup.sh 
/usr/local/tomcat/bin/startup.sh 
/usr/local/tomcat1/bin/startup.sh netstat -antp | grep java

部署虚拟机192.168.142.30(第三个tomcat已开启)

1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gzsystemctl stop firewalld
systemctl disable firewalld
setenforce 02.安装jdk
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm 
rpm -ivh jdk-8u201-linux-x64.rpm 
java -version3.设置JDK环境变量
vim /ect/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATHsuorce /etc/profile.d/java.sh
java -version/etc/profile4.安装启动Tomcat
cd /opt
tar zcvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/lcoal/tomcat/bin/startup.sh 
或
/usr/lcoal/tomcat/bin/catalina.sh strat#前台启动
/usr/local/tomcat/bin/catalina.sh run		netatst -natp | gerp 8080浏览器访问Tomcat的默认主页 http://192.168.142.30:8080

部署192.168.142.50   七层反向代理(nginx服务已开启)

1.关闭防火墙,将安装nginx所需软件包传到/opt目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0nginx-1.22.0.tar.gz  2.安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
yum -y install pcre-devel.x86_64 zlib-devel.x86_64 openssl-devel.x86_64 gcc gcc-c++ make3.创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx4.编译安装Nginx
cd /opt
tar zxvf nginx-1.18.0.tar.gz -C /opt/cd nginx-1.18.0/
./configure \
--prefix=/usr/local/nginx \							#指定nginx的安装路径
--user=nginx \										#指定用户名
--group=nginx \										#指定组名
--with-http_stub_status_module						#启用 http_stub_status_module 模块以支持状态统计
操作make -j 4 && make installln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/5.启动nginx
/usr/local/nginx/sbin/nginx  #启动nginx,使用绝对路径或者绝对路径

可以给他加入到system中去管理

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.targetchmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service

部署192.168.142.30的tomcat server

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true"></Context>
</Host>

部署192.168.142.20的两个tomcat server

mkdir /usr/local/tomcat/webapps/testvim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>   #指定为 test2 页面
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh 
mkdir /usr/local/tomcat1/webapps/testvim /usr/local/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>   #指定为 test3 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>
vim /usr/local/tomcat1/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"><Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>/usr/local/tomcat1/bin/shutdown.sh 
/usr/local/tomcat1/bin/startup.sh 

部署192.168.142.50   七层反向代理Nginx server

#准备静态页面和静态图片
cd /usr/local/nginx/html
vim game.html
<html>    <body> <h1>this is nginx test web</h1><img src="game.jpg" /></body>    
</html>
 
vim /usr/local/nginx/conf/nginx.conf
......
http {
......#gzip on;#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大upstream tomcat_server {server 192.168.142.30:8080 weight=1;server 192.168.142.20:8080 weight=1;server 192.168.142.20:8081 weight=1;}server {listen 80;server_name www.kgc.com;charset utf-8;#access_log logs/host.access.log main;#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理location ~ .*\.jsp$ {proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IPproxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}#配置Nginx处理静态图片请求location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;}location / {root html;index index.html index.htm;}
......}
......
}测试静态页面效果
浏览器访问 http://192.168.142.20/game.html

四层反向代理

192.168.142.70   四层反向代理(nginx)

需要重新编译安装
cd nginx-1.22.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-stream
make -j4 && make installcd /usr/local/nginx/conf
vim nginx.conf
#与http同级
stream {upstream appserver {server 192.168.142.30:8080;server 192.168.142.20:8080;server 192.168.142.20:8081;}server {listen 8080;proxy_pass appserver;}
}systemctl restart nginx测试负载均衡效果,不断刷新浏览器测试(由于tomcat设置了长连接,需要等待30m)
http:192.168.142.70:8080/test/index.jsp

七层反向代理和四层反向代理结合

实验准备(准备六台虚拟机)

目前所有的都已经安装nginx和tomcat
192.168.142.20   tomcat(两个)
192.168.142.30   tomcat
192.168.142.50   七层反向代理(nginx)
192.168.142.60   七层反向代理(nginx)
192.168.142.70   四层反向代理(nginx)
192.168.142.10   客户机
 

部署虚拟机192.168.142.20(两个tomcat服务已开启)

1.先安装好jdk
2.安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
cp -a /usr/local/tomcat /usr/local/tomcat13.部署环境变量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat
export CATALINA_BASE1=/usr/local/tomcat
export TOMCAT_HOME1=/usr/local/tomcat#tomcat2
export CATALINA_HOME2=/usr/local/tomcat1
export CATALINA_BASE2=/usr/local/tomcat1
export TOMCAT_HOME2=/usr/local/tomcat1source /etc/profile.d/tomcat.sh4.修改 tomcat1 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号
vim /usr/local/tomcat2/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">		#22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"		#69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为80105.修改各 tomcat和tomcat1 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1vim /usr/local/tomcat/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1修改tomcat1
vim /usr/local/tomcat1/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2vim /usr/local/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
6.启动各 tomcat 中的 /bin/startup.sh 
/usr/local/tomcat/bin/startup.sh 
/usr/local/tomcat1/bin/startup.sh netstat -antp | grep java

部署192.168.142.30   (1个tomcat服务已开启)

具体流程参考前面的七层反向代理

部署192.168.142.50 七层反向代理Nginx server

具体流程参考前面的七层反向代理

部署192.168.142.60 七层反向代理Nginx server

#准备静态页面和静态图片
cd /usr/local/nginx/html
vim game.html
<html>    <body> <h1>this is nginx test2 web</h1><img src="game.jpg" /></body>    
</html>
vim /usr/local/nginx/conf/nginx.conf
......
http {
......#gzip on;#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大upstream tomcat_server {server 192.168.142.30:8080 weight=1;server 192.168.142.20:8080 weight=1;server 192.168.142.20:8081 weight=1;}server {listen 80;server_name localhost;charset utf-8;#access_log logs/host.access.log main;#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理location ~ .*\.jsp$ {proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IPproxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}#配置Nginx处理静态图片请求location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {root /usr/local/nginx/html/img;expires 10d;}location / {root html;index index.html index.htm;}
......}
......
}

部署192.168.142.70   四层反向代理(nginx)

注:端口不要冲突

测试访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/49821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 之NavMeshAgent 组件(导航和路径寻找的组件)

文章目录 **作用**&#xff1a;**属性和方法**&#xff1a;**用途**&#xff1a;**注意事项**&#xff1a; NavMeshAgent 是Unity引擎中用于导航和路径寻找的组件。它可以使游戏对象在场景中自动找到可行走的路径&#xff0c;并在避免障碍物的情况下移动到目标位置。 以下是关于…

在当今信息化社会中的安全大文件传输

随着科技的不断进步&#xff0c;数据已经成为各个领域和行业的宝贵财富。然而&#xff0c;随之而来的数据传输和交换问题也成为一个日益突出的挑战。在这篇文章中&#xff0c;我们将探讨在当今信息化社会中的安全大文件传输的重要性&#xff0c;以及如何应对传统传输方式所面临…

穿起“新架构”的舞鞋,跳一支金融数字化转型的华尔兹

华尔兹&#xff0c;是男女两位舞者&#xff0c;通过形体的控制&#xff0c;舞步技巧的发挥&#xff0c;完美配合呈现而出的一种舞蹈形式。华尔兹舞姿&#xff0c;如行云流水、潇洒自如、飘逸优美&#xff0c;素有“舞中皇后”的美称。 在跳华尔兹的时候&#xff0c;如果舞者双…

SQL 盲注

问题描述&#xff1a; 解决方案&#xff1a; 通过建立过滤器方法 添加拦截器&#xff1a; web.xml 文件配置拦截器 <filter><filter-name>sqlFilter</filter-name><filter-class>com.fh.filter.SqlFilter</filter-class></filter> pack…

vue3 03-ref函数使用

使用ref创建响应式数据 只支持 简单or 复杂 数据转换 使用ref&#xff1a; 1.导入ref函数 2.创建响应式数据 3.返回数据 4.展示内容 <template><p> 年龄:{{ count }}</p><button click"count">加一岁</button><button click"…

Vue与React的对比(API)

组件传值 VUE // 父组件 <GoodsList v-if"!isGoodsIdShow" :goodsList"goodsList"/> // 子组件 -- 通过props获取即可 props: {goodsList:{type:Array,default:function(){return []}}}REACT // 父组件 export default function tab(props:any) {…

Python将网络文件下载到本地

Python将网络文件下载到本地 前言相关介绍Python将网络文件下载到本地 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击进入Python日常小操作专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看基于DETR的人脸伪…

【Git版本控制工具使用---讲解一】

Git版本控制工具使用 安装设置用户名签名和邮箱Git常用的命令 初始化本地库查看本地状态Git 命令添加暂存区提交本地库查看版本信息修改文件版本穿梭 安装 首先根据自身电脑的配置选择性的安装是32位的还是64位的Git版本控制工具 我这边安装的是64位的 以下是我安装的时候的过…

信号的傅里叶分析之傅里叶级数

1 为什么要进行傅里叶分析 信号分析方法主流方法有&#xff1a; &#xff08;1&#xff09;时域分析&#xff1a;以冲激信号为基本信号&#xff0c;任意输入信号可分解为一系列冲激信号&#xff1b; &#xff08;2&#xff09;频域分析&#xff1a;以正弦信号和虚指数信号为基…

springboot2+redis 订阅发布,解决接收消息累计线程到内存溢出,使用自定义线程池接收消息

pom 添加redis <!-- redis 缓存操作 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 发布消息 import lombok.extern.slf4j.Slf4j; import o…

python 连接Redis 数据库

pip install redis python代码 import redis# 连接数据库 r redis.Redis(host192.168.56.15, port6379, db0)# 存储数据 #r.set(key, value) r.set(name, zaraNet)# 获取数据 value r.get(name) print(value)# 关闭连接&#xff08;可选&#xff09; r.close()

C# 工厂模式

一、概述 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在C#中&#xff0c;工厂模式通过定义一个公共接口或抽象类来创建对象&#xff0c;而具体的对象创建则由工厂类来实现。 工厂模式主要包含三个角色…

【C++数据结构】二叉搜索树

【C数据结构】二叉搜索树 目录 【C数据结构】二叉搜索树二叉搜索树概念二叉搜索树操作二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的实现二叉搜索树的应用二叉搜索树的性能分析 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.8.22 前言&#xff1a;二…

无涯教程-PHP - preg_split()函数

preg_split() - 语法 array preg_split (string pattern, string string [, int limit [, int flags]]); preg_split()函数的操作与split()完全相同&#xff0c;只不过正则表达式被接受为pattern的输入参数。 如果指定了可选的输入参数limit&#xff0c;则仅返回子字符串的限…

Oracle 主从库目录不一致(异路径)的n种处理方案及效果

最近遇到了复制数据&#xff08;DUPLICATE TARGET DATABASE TO xxx&#xff09;的时候 Oracle 源和目标库目录不一致的问题&#xff0c;比较初级但也踩到一些坑&#xff0c;整理记录一下。主从库搭建的时候注意事项其实也类似&#xff0c;而且更通用&#xff0c;所以标题写的是…

WebGL 变量uniform、gl.getUniformLocation、gl.uniform4f及其同族函数相关

目录 uniform变量命名规范 获取 uniform 变量的存储地址 gl.getUniformLocation 向uniform变量赋值 gl.uniform4f ​编辑 gl.uniform4f()的同族函数 demo&#xff1a;点击webgl坐标系的四个象限绘制各自不同颜色的点 uniform变量命名规范 var FSHADER_SOURCE uniform vec4…

小程序-基于vant的Picker组件实现省市区选择

一、原因 因vant/area-data部分的市/区数据跟后台使用的高德/腾讯省市区有所出入&#xff0c;故须保持跟后台用同一份数据&#xff0c;所以考虑以下几个组件 1、Area 2、Cascader 3、Picker 因为使用的是高德地图的省市区json文件&#xff0c;用area的话修改结构代价太大&…

AVL——平衡搜索树

✅<1>主页&#xff1a;我的代码爱吃辣&#x1f4c3;<2>知识讲解&#xff1a;数据结构——AVL树☂️<3>开发环境&#xff1a;Visual Studio 2022&#x1f4ac;<4>前言&#xff1a;AVL树是对二叉搜索树的严格高度控制&#xff0c;所以AVL树的搜索效率很高…

xargs 的用法 在1个文件夹中批量删除文件,这些删除的文件名是另一个文件夹中的文件名。

xargs 的用法 在1个文件夹中批量删除文件&#xff0c;这些删除的文件名是另一个文件夹中的文件名。 1、问题背景 应用场景 1、问题背景 应用场景 在二进制部署docker时&#xff0c;会把docker的所有可执行文件复制到/usr/bin下。 如果说复制过去后&#xff0c;想要反悔&#x…